From 3ded1d1c2b839d7b68ac05c3198e7e44e457baf5 Mon Sep 17 00:00:00 2001 From: Ryan <46985385+ryanslatten@users.noreply.github.com> Date: Fri, 12 Dec 2025 10:15:43 -0500 Subject: [PATCH] Revert "Release [6.5.5]" --- .github/workflows/aws_dev.deploy.yaml | 56 + .github/workflows/dev.container_build.yaml | 42 - .github/workflows/release.yaml | 25 +- CHANGELOG.md | 2 +- CODEOWNERS | 1 - Dockerfile | 122 +- README.md | 166 +- aws_amazon_linux_2023.md | 2 +- docker/README.md | 40 +- docker/auth-idp/docker-compose.yml | 8 +- .../auth-idp/ldap/config/.gitkeep | 0 .../auth-idp/ldap/db/.gitkeep | 0 docker/auth-idp/ldapseed.ldif | 19 - docker/auth-idp/saml/authsources.php | 8 +- docker/server/Dockerfile | 20 +- docs/admin/auth.md | 77 +- docs/domain.md | 24 +- docs/use_cases/feeds.md | 6 +- instance/CODEOWNERS | 1 - instance/config.js | 3 +- instance/package.json | 5 +- localseed.ldif | 19 - mongo-ssl-x509/README.md | 2 +- package-lock.json | 1343 ++---- package.json | 14 +- plugins/README.md | 60 +- plugins/arcgis/README.md | 2 +- plugins/arcgis/service/package-lock.json | 930 +++- plugins/arcgis/service/package.json | 4 +- plugins/arcgis/service/src/index.ts | 29 +- .../arcgis/service/src/types/ArcGISConfig.ts | 5 - plugins/arcgis/web-app/package-lock.json | 2554 ++++++++++- plugins/arcgis/web-app/package.json | 4 +- .../web-app/projects/main/package-lock.json | 16 +- .../arcgis/web-app/projects/main/package.json | 4 +- .../projects/main/src/lib/ArcGISConfig.ts | 7 +- .../arc-layer/arc-layer-dialog.component.html | 37 +- .../arc-layer/arc-layer-dialog.component.scss | 4 - .../arc-layer/arc-layer-dialog.component.ts | 15 +- .../projects/main/src/lib/arc.service.ts | 24 +- plugins/epic/README.md | 10 +- plugins/epic/package.json | 2 +- plugins/geoserver/package.json | 4 +- plugins/image/README.md | 8 +- plugins/image/service/package.json | 2 +- plugins/nga-msi/README.md | 2 +- plugins/nga-msi/package-lock.json | 12 +- plugins/nga-msi/package.json | 6 +- plugins/nga-msi/tsconfig.json | 38 +- plugins/rage/README.md | 12 +- plugins/rage/package.json | 2 +- plugins/random/README.md | 2 +- plugins/sftp/service/package-lock.json | 4 +- plugins/sftp/service/package.json | 4 +- plugins/sftp/web/angular.json | 6 +- plugins/sftp/web/package-lock.json | 3195 +++++++++++++- plugins/sftp/web/package.json | 2 +- .../sftp/web/projects/main/package-lock.json | 8 +- plugins/sftp/web/projects/main/package.json | 2 +- .../sftp/web/projects/main/src/public-api.ts | 2 +- scripts/init.d/mage | 2 +- scripts/upstart/mage.conf | 2 +- service/npm-shrinkwrap.json | 124 +- service/package.json | 17 +- .../adapters.observations.dto.ecma404-json.ts | 17 +- service/src/api/form.js | 50 +- service/src/api/observation.js | 268 +- .../observations/app.api.observations.ts | 17 +- .../observations/app.impl.observations.ts | 78 +- service/src/authentication/ldap.js | 77 +- service/src/docs/openapi.yaml | 42 +- .../observations/entities.observations.ts | 72 +- service/src/export/csv.ts | 31 +- service/src/export/geojson.ts | 49 +- service/src/export/kmlWriter.ts | 33 +- service/src/models/event.d.ts | 3 +- service/src/models/event.js | 116 +- service/src/models/observation.d.ts | 2 +- service/src/models/team.js | 20 +- service/src/routes/events.ts | 172 +- service/src/routes/imports.js | 65 + service/src/routes/imports.ts | 131 - service/src/routes/logins.js | 4 - service/src/routes/observations.js | 438 +- service/src/utilities/togeojson.js | 378 ++ service/src/utilities/transformKML.ts | 388 -- .../adapters.events.db.mongoose.test.ts | 148 +- ...pters.observations.controllers.web.test.ts | 107 +- .../adapters.observations.db.mongoose.test.ts | 109 +- ...ters.observations.dto.ecma404-json.test.ts | 123 +- service/test/event/eventReadTest.js | 251 +- .../src/@types/dashboard/admin-dashboard.ts | 126 - .../password-policy.component.html | 404 +- .../password-policy.component.scss | 11 +- .../admin-authentication.component.html | 139 +- .../admin-authentication.component.scss | 5 +- .../admin-breadcrumb.component.html | 17 +- .../admin-breadcrumb.component.scss | 83 +- .../admin-breadcrumb.component.spec.ts | 45 +- .../admin-breadcrumb.component.ts | 1 - .../admin-breadcrumb.model.ts | 1 - .../admin-dashboard/admin-dashboard.html | 139 - .../admin-dashboard/admin-dashboard.module.ts | 44 - .../admin-dashboard/admin-dashboard.scss | 256 -- .../admin-dashboard/admin-dashboard.spec.ts | 333 -- .../admin/admin-dashboard/admin-dashboard.ts | 286 -- .../admin-event-form-preview.component.ts | 12 +- .../admin-event-form.module.ts | 29 - .../admin/admin-event/admin-events.module.ts | 83 - .../create-event/create-event.component.html | 57 - .../create-event/create-event.component.scss | 138 - .../create-event/create-event.component.ts | 69 - .../create-form/create-form.component.html | 70 - .../create-form/create-form.component.scss | 205 - .../create-form/create-form.component.spec.ts | 137 - .../create-form/create-form.component.ts | 98 - .../dashboard/event-dashboard.component.html | 99 - .../dashboard/event-dashboard.component.scss | 458 -- .../event-dashboard.component.spec.ts | 199 - .../dashboard/event-dashboard.component.ts | 159 - .../delete-event/delete-event.component.html | 43 - .../delete-event/delete-event.component.scss | 168 - .../delete-event/delete-event.component.ts | 57 - .../event-details.component.html | 439 -- .../event-details.component.scss | 985 ----- .../event-details.component.spec.ts | 1028 ----- .../event-details/event-details.component.ts | 1160 ----- .../event-form-create.component.ts | 0 .../app/admin/admin-event/events.service.ts | 177 - .../admin-feed/admin-feed.component.html | 11 +- .../admin-feed/admin-feed.component.ts | 129 +- .../admin/admin-layers/admin-layers.module.ts | 45 - .../create-layer/create-layer.component.html | 139 - .../create-layer/create-layer.component.scss | 341 -- .../create-layer/create-layer.component.ts | 188 - .../dashboard/layer-dashboard.component.html | 70 - .../dashboard/layer-dashboard.component.scss | 341 -- .../layer-dashboard.component.spec.ts | 407 -- .../dashboard/layer-dashboard.component.ts | 194 - .../app/admin/admin-layers/layers.service.ts | 71 - .../src/app/admin/admin-nav/admin-nav.html | 93 - .../src/app/admin/admin-nav/admin-nav.scss | 213 - .../src/app/admin/admin-nav/admin-nav.spec.ts | 123 - .../src/app/admin/admin-nav/admin-nav.ts | 102 - .../admin-settings.component.html | 67 +- .../admin-settings.component.scss | 1 - .../contact-info/contact-info.component.html | 32 - .../contact-info/contact-info.component.scss | 51 +- .../contact-info.component.spec.ts | 163 +- .../contact-info/contact-info.component.ts | 5 +- .../admin/admin-teams/admin-teams.module.ts | 59 - .../create-team/create-team.component.html | 37 - .../create-team/create-team.component.scss | 99 - .../create-team/create-team.component.ts | 65 - .../dashboard/team-dashboard.component.html | 81 - .../dashboard/team-dashboard.component.scss | 457 -- .../team-dashboard.component.spec.ts | 199 - .../dashboard/team-dashboard.component.ts | 152 - .../delete-team/delete-team.component.html | 54 - .../delete-team/delete-team.component.scss | 189 - .../delete-team/delete-team.component.spec.ts | 340 -- .../delete-team/delete-team.component.ts | 98 - .../team-details/team-details.component.html | 203 - .../team-details/team-details.component.scss | 649 --- .../team-details.component.spec.ts | 518 --- .../team-details/team-details.component.ts | 512 --- .../admin/src/app/admin/admin-teams/team.d.ts | 20 - .../app/admin/admin-teams/teams-service.ts | 176 - .../admin/admin-users/admin-users.module.ts | 64 - .../bulk-user/bulk-user.component.html | 123 - .../bulk-user/bulk-user.component.scss | 232 - .../bulk-user/bulk-user.component.spec.ts | 232 - .../bulk-user/bulk-user.component.ts | 236 -- .../create-user/create-user.component.html | 278 -- .../create-user/create-user.component.scss | 394 -- .../create-user/create-user.component.spec.ts | 191 - .../create-user/create-user.component.ts | 287 -- .../dashboard/user-dashboard.component.html | 161 - .../dashboard/user-dashboard.component.scss | 458 -- .../user-dashboard.component.spec.ts | 284 -- .../dashboard/user-dashboard.component.ts | 439 -- .../delete-user/delete-user.component.html | 27 - .../delete-user/delete-user.component.scss | 190 - .../delete-user/delete-user.component.ts | 23 - .../user-details/user-details.component.html | 748 ---- .../user-details/user-details.component.scss | 1080 ----- .../user-details.component.spec.ts | 251 -- .../user-details/user-details.component.ts | 1242 ------ .../admin/src/app/admin/admin-users/user.d.ts | 38 - web-app/admin/src/app/admin/admin.module.ts | 22 +- web-app/admin/src/app/app.module.ts | 90 +- .../card-navbar/card-navbar.component.html | 21 - .../card-navbar/card-navbar.component.scss | 229 - .../card-navbar/card-navbar.component.spec.ts | 311 -- .../core/card-navbar/card-navbar.component.ts | 88 - web-app/admin/src/app/core/core.module.ts | 35 - .../search-modal/search-modal.component.html | 47 - .../search-modal/search-modal.component.scss | 158 - .../search-modal.component.spec.ts | 494 --- .../search-modal/search-modal.component.ts | 218 - .../admin/src/app/geometry/geometry.pipe.ts | 2 +- .../src/app/logins/logins.component.html | 184 - .../src/app/logins/logins.component.scss | 398 -- .../src/app/logins/logins.component.spec.ts | 81 - .../admin/src/app/logins/logins.component.ts | 387 -- web-app/admin/src/app/logins/logins.module.ts | 36 - .../admin/src/app/map/clip/clip.component.ts | 3 +- .../attachment-upload.component.spec.ts | 21 +- ...bservation-edit-checkbox.component.spec.ts | 50 +- ...ervation-edit-geometry-form.component.html | 49 +- ...bservation-edit-geometry-form.component.ts | 33 +- .../observation-edit.component.ts | 666 ++- .../src/app/observation/observation.module.ts | 149 - .../app/shared/utils/password.utils.spec.ts | 248 -- .../src/app/shared/utils/password.utils.ts | 164 - .../src/app/upgrade/ajs-upgraded-providers.ts | 40 - .../admin/src/ng1/admin/admin.component.js | 6 +- .../ng1/admin/admin.dashboard.component.js | 294 ++ .../admin/src/ng1/admin/admin.dashboard.html | 248 ++ web-app/admin/src/ng1/admin/admin.html | 21 +- .../src/ng1/admin/devices/device.edit.html | 98 +- .../admin/src/ng1/admin/devices/device.html | 16 +- .../admin/src/ng1/admin/devices/devices.html | 9 +- .../admin/events/event.access.component.js | 205 + .../src/ng1/admin/events/event.access.html | 117 + .../src/ng1/admin/events/event.component.js | 559 +++ .../ng1/admin/events/event.edit.component.js | 6 +- .../src/ng1/admin/events/event.edit.html | 52 +- web-app/admin/src/ng1/admin/events/event.html | 583 +++ .../src/ng1/admin/events/events.component.js | 85 +- .../admin/src/ng1/admin/events/events.html | 102 +- .../admin/events/forms/feed/feed.edit.html | 125 +- .../events/forms/fields/fields.edit.html | 45 +- .../events/forms/form.create.component.js | 69 + .../ng1/admin/events/forms/form.create.html | 71 + .../src/ng1/admin/events/forms/form.edit.html | 27 +- .../admin/src/ng1/admin/events/forms/index.js | 2 + .../ng1/admin/events/forms/map/map.edit.html | 44 +- web-app/admin/src/ng1/admin/events/index.js | 8 +- web-app/admin/src/ng1/admin/index.js | 18 +- .../src/ng1/admin/layers/layer.component.js | 71 +- .../src/ng1/admin/layers/layer.edit.html | 257 +- web-app/admin/src/ng1/admin/layers/layer.html | 349 +- .../admin/src/ng1/admin/layers/layers.html | 9 +- web-app/admin/src/ng1/admin/teams/index.js | 13 + .../ng1/admin/teams/team.access.component.js | 186 + .../src/ng1/admin/teams/team.access.html | 112 + .../src/ng1/admin/teams/team.component.js | 255 ++ .../ng1/admin/teams/team.delete.component.js | 65 + .../src/ng1/admin/teams/team.delete.html | 35 + .../ng1/admin/teams/team.edit.component.js | 38 + .../admin/src/ng1/admin/teams/team.edit.html | 46 + web-app/admin/src/ng1/admin/teams/team.html | 314 ++ .../src/ng1/admin/teams/teams.component.js | 122 + web-app/admin/src/ng1/admin/teams/teams.html | 75 + web-app/admin/src/ng1/admin/users/index.js | 15 + .../src/ng1/admin/users/map.icon.component.js | 53 + .../ng1/admin/users/user.bulk.component.js | 263 ++ .../admin/src/ng1/admin/users/user.bulk.html | 145 + .../src/ng1/admin/users/user.component.js | 291 ++ .../ng1/admin/users/user.delete.component.js | 30 + .../src/ng1/admin/users/user.delete.html | 25 + .../ng1/admin/users/user.edit.component.js | 254 ++ .../admin/src/ng1/admin/users/user.edit.html | 214 + web-app/admin/src/ng1/admin/users/user.html | 350 ++ .../src/ng1/admin/users/users.component.js | 185 + web-app/admin/src/ng1/admin/users/users.html | 176 + web-app/admin/src/ng1/app.js | 307 +- web-app/admin/src/ng1/css/style.scss | 471 +- .../admin/src/ng1/factories/event.resource.js | 11 +- .../admin/src/ng1/factories/login.service.js | 4 +- web-app/admin/src/ng1/mage/banner.html | 2 +- .../admin/src/ng1/navbar/navbar.component.js | 1 + web-app/admin/src/styles.scss | 128 +- web-app/karma.conf.js | 2 +- web-app/package-lock.json | 3774 ++++++++--------- web-app/package.json | 26 +- web-app/projects/core-lib/README.md | 4 +- .../projects/core-lib/angular-cli/README.md | 10 +- .../core-lib/angular-cli/builders/schema.json | 2 +- .../core-lib/angular-cli/collection.json | 2 +- web-app/projects/core-lib/package-lock.json | 4 +- web-app/projects/core-lib/package.json | 2 +- web-app/src/app/about/about.component.html | 134 +- web-app/src/app/about/about.component.scss | 123 +- web-app/src/app/about/about.component.spec.ts | 86 +- web-app/src/app/about/about.component.ts | 24 +- web-app/src/app/entities/entities.password.ts | 8 +- web-app/src/app/event/event.service.ts | 641 +-- web-app/src/app/event/event.types.ts | 13 - .../empty-state/no-exports.component.spec.ts | 35 +- .../export-data/export-data.component.spec.ts | 401 +- .../export/export-dialog.component.spec.ts | 256 +- .../feed-panel/feed-panel-tab.component.html | 10 +- .../feed-panel/feed-panel-tab.component.scss | 4 +- .../app/feed-panel/feed-panel.component.scss | 12 +- web-app/src/app/filter/filter.component.html | 169 +- .../src/app/filter/filter.component.spec.ts | 8 +- web-app/src/app/filter/filter.component.ts | 395 +- web-app/src/app/filter/filter.service.ts | 415 +- web-app/src/app/filter/filter.types.ts | 151 - web-app/src/app/geometry/geometry.pipe.ts | 6 +- web-app/src/app/geometry/geometry.service.ts | 2 +- web-app/src/app/home/home.component.html | 8 +- web-app/src/app/home/home.component.scss | 6 +- web-app/src/app/home/home.module.ts | 4 +- web-app/src/app/http/local-storage.service.ts | 142 +- .../ingress/authentication/@types/signup.ts | 45 - .../authentication-dialog.component.spec.ts | 3 +- .../idp/idp-authentication.component.spec.ts | 6 +- .../ldap-authentication.component.spec.ts | 6 +- .../local/local-authentication.component.html | 60 +- .../local/local-authentication.component.scss | 107 +- .../local-authentication.component.spec.ts | 6 +- .../local/local-authentication.component.ts | 9 - .../local/signup.component.html | 261 +- .../local/signup.component.scss | 47 +- .../local/signup.component.spec.ts | 299 +- .../authentication/local/signup.component.ts | 207 +- .../authorization.component.html | 2 +- .../authorization.component.spec.ts | 3 +- web-app/src/app/ingress/ingress.component.ts | 2 +- web-app/src/app/ingress/ingress.module.ts | 4 +- .../intialize/initialize.component.spec.ts | 8 +- .../src/app/landing/landing.component.spec.ts | 6 +- web-app/src/app/map/clip/clip.component.ts | 3 +- .../app/map/controls/filter.component.spec.ts | 16 +- web-app/src/app/map/map.component.ts | 18 +- .../src/app/map/marker/FixedWidthMarker.ts | 2 + web-app/src/app/map/marker/LocationMarker.ts | 11 +- .../src/app/map/marker/ObservationMarker.ts | 5 +- web-app/src/app/map/search/search.service.ts | 8 +- .../app/navigation/navigation.component.html | 80 +- .../app/navigation/navigation.component.scss | 22 +- .../navigation/navigation.component.spec.ts | 10 +- .../app/navigation/navigation.component.ts | 59 +- .../attachment-upload.component.spec.ts | 3 +- ...ervation-edit-attachment.component.spec.ts | 4 +- ...bservation-edit-checkbox.component.spec.ts | 47 +- ...rvation-edit-form-picker.component.spec.ts | 5 +- .../observation-edit-form.component.spec.ts | 44 +- ...vation-edit-geometry-map.component.spec.ts | 6 +- .../observation-edit.component.html | 40 +- .../observation-edit.component.ts | 630 ++- .../observation-list-item.component.html | 14 +- .../observation-list-item.component.spec.ts | 181 +- .../observation-options.component.spec.ts | 3 - ...bservation-view-checkbox.component.spec.ts | 4 +- .../observation-view-form.component.spec.ts | 41 +- .../observation-view-form.component.ts | 2 - .../observation-view.component.html | 35 +- .../app/observation/observation.service.ts | 215 +- .../coordinate-system.component.spec.ts | 11 +- .../polling-interval.component.spec.ts | 14 +- .../preferences/preferences.component.spec.ts | 17 +- .../time-format/time-format.component.spec.ts | 12 +- .../time-format/time-format.component.ts | 2 +- .../time-zone/time-zone.component.spec.ts | 10 +- .../src/app/swagger/swagger.component.spec.ts | 3 - .../user/profile/profile.component.spec.ts | 12 +- web-app/src/app/user/user.service.ts | 2 +- web-app/src/main.ts | 5 - web-app/tsconfig.spec.json | 6 +- 363 files changed, 18929 insertions(+), 36328 deletions(-) create mode 100644 .github/workflows/aws_dev.deploy.yaml delete mode 100644 .github/workflows/dev.container_build.yaml delete mode 100644 CODEOWNERS rename web-app/admin/src/app/admin/admin-event/event-form-create/event-form-create.component.html => docker/auth-idp/ldap/config/.gitkeep (100%) rename web-app/admin/src/app/admin/admin-event/event-form-create/event-form-create.component.scss => docker/auth-idp/ldap/db/.gitkeep (100%) delete mode 100755 docker/auth-idp/ldapseed.ldif delete mode 100644 instance/CODEOWNERS delete mode 100755 localseed.ldif create mode 100644 service/src/routes/imports.js delete mode 100644 service/src/routes/imports.ts create mode 100644 service/src/utilities/togeojson.js delete mode 100644 service/src/utilities/transformKML.ts delete mode 100644 web-app/admin/src/@types/dashboard/admin-dashboard.ts delete mode 100644 web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.html delete mode 100644 web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.module.ts delete mode 100644 web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.scss delete mode 100644 web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.spec.ts delete mode 100644 web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.ts delete mode 100644 web-app/admin/src/app/admin/admin-event/admin-event-form/admin-event-form.module.ts delete mode 100644 web-app/admin/src/app/admin/admin-event/admin-events.module.ts delete mode 100644 web-app/admin/src/app/admin/admin-event/create-event/create-event.component.html delete mode 100644 web-app/admin/src/app/admin/admin-event/create-event/create-event.component.scss delete mode 100644 web-app/admin/src/app/admin/admin-event/create-event/create-event.component.ts delete mode 100644 web-app/admin/src/app/admin/admin-event/create-form/create-form.component.html delete mode 100644 web-app/admin/src/app/admin/admin-event/create-form/create-form.component.scss delete mode 100644 web-app/admin/src/app/admin/admin-event/create-form/create-form.component.spec.ts delete mode 100644 web-app/admin/src/app/admin/admin-event/create-form/create-form.component.ts delete mode 100644 web-app/admin/src/app/admin/admin-event/dashboard/event-dashboard.component.html delete mode 100644 web-app/admin/src/app/admin/admin-event/dashboard/event-dashboard.component.scss delete mode 100644 web-app/admin/src/app/admin/admin-event/dashboard/event-dashboard.component.spec.ts delete mode 100644 web-app/admin/src/app/admin/admin-event/dashboard/event-dashboard.component.ts delete mode 100644 web-app/admin/src/app/admin/admin-event/delete-event/delete-event.component.html delete mode 100644 web-app/admin/src/app/admin/admin-event/delete-event/delete-event.component.scss delete mode 100644 web-app/admin/src/app/admin/admin-event/delete-event/delete-event.component.ts delete mode 100644 web-app/admin/src/app/admin/admin-event/event-details/event-details.component.html delete mode 100644 web-app/admin/src/app/admin/admin-event/event-details/event-details.component.scss delete mode 100644 web-app/admin/src/app/admin/admin-event/event-details/event-details.component.spec.ts delete mode 100644 web-app/admin/src/app/admin/admin-event/event-details/event-details.component.ts delete mode 100644 web-app/admin/src/app/admin/admin-event/event-form-create/event-form-create.component.ts delete mode 100644 web-app/admin/src/app/admin/admin-event/events.service.ts delete mode 100644 web-app/admin/src/app/admin/admin-layers/admin-layers.module.ts delete mode 100644 web-app/admin/src/app/admin/admin-layers/create-layer/create-layer.component.html delete mode 100644 web-app/admin/src/app/admin/admin-layers/create-layer/create-layer.component.scss delete mode 100644 web-app/admin/src/app/admin/admin-layers/create-layer/create-layer.component.ts delete mode 100644 web-app/admin/src/app/admin/admin-layers/dashboard/layer-dashboard.component.html delete mode 100644 web-app/admin/src/app/admin/admin-layers/dashboard/layer-dashboard.component.scss delete mode 100644 web-app/admin/src/app/admin/admin-layers/dashboard/layer-dashboard.component.spec.ts delete mode 100644 web-app/admin/src/app/admin/admin-layers/dashboard/layer-dashboard.component.ts delete mode 100644 web-app/admin/src/app/admin/admin-layers/layers.service.ts delete mode 100644 web-app/admin/src/app/admin/admin-nav/admin-nav.html delete mode 100644 web-app/admin/src/app/admin/admin-nav/admin-nav.scss delete mode 100644 web-app/admin/src/app/admin/admin-nav/admin-nav.spec.ts delete mode 100644 web-app/admin/src/app/admin/admin-nav/admin-nav.ts delete mode 100644 web-app/admin/src/app/admin/admin-teams/admin-teams.module.ts delete mode 100644 web-app/admin/src/app/admin/admin-teams/create-team/create-team.component.html delete mode 100644 web-app/admin/src/app/admin/admin-teams/create-team/create-team.component.scss delete mode 100644 web-app/admin/src/app/admin/admin-teams/create-team/create-team.component.ts delete mode 100644 web-app/admin/src/app/admin/admin-teams/dashboard/team-dashboard.component.html delete mode 100644 web-app/admin/src/app/admin/admin-teams/dashboard/team-dashboard.component.scss delete mode 100644 web-app/admin/src/app/admin/admin-teams/dashboard/team-dashboard.component.spec.ts delete mode 100644 web-app/admin/src/app/admin/admin-teams/dashboard/team-dashboard.component.ts delete mode 100644 web-app/admin/src/app/admin/admin-teams/delete-team/delete-team.component.html delete mode 100644 web-app/admin/src/app/admin/admin-teams/delete-team/delete-team.component.scss delete mode 100644 web-app/admin/src/app/admin/admin-teams/delete-team/delete-team.component.spec.ts delete mode 100644 web-app/admin/src/app/admin/admin-teams/delete-team/delete-team.component.ts delete mode 100644 web-app/admin/src/app/admin/admin-teams/team-details/team-details.component.html delete mode 100644 web-app/admin/src/app/admin/admin-teams/team-details/team-details.component.scss delete mode 100644 web-app/admin/src/app/admin/admin-teams/team-details/team-details.component.spec.ts delete mode 100644 web-app/admin/src/app/admin/admin-teams/team-details/team-details.component.ts delete mode 100644 web-app/admin/src/app/admin/admin-teams/team.d.ts delete mode 100644 web-app/admin/src/app/admin/admin-teams/teams-service.ts delete mode 100644 web-app/admin/src/app/admin/admin-users/admin-users.module.ts delete mode 100644 web-app/admin/src/app/admin/admin-users/bulk-user/bulk-user.component.html delete mode 100644 web-app/admin/src/app/admin/admin-users/bulk-user/bulk-user.component.scss delete mode 100644 web-app/admin/src/app/admin/admin-users/bulk-user/bulk-user.component.spec.ts delete mode 100644 web-app/admin/src/app/admin/admin-users/bulk-user/bulk-user.component.ts delete mode 100644 web-app/admin/src/app/admin/admin-users/create-user/create-user.component.html delete mode 100644 web-app/admin/src/app/admin/admin-users/create-user/create-user.component.scss delete mode 100644 web-app/admin/src/app/admin/admin-users/create-user/create-user.component.spec.ts delete mode 100644 web-app/admin/src/app/admin/admin-users/create-user/create-user.component.ts delete mode 100644 web-app/admin/src/app/admin/admin-users/dashboard/user-dashboard.component.html delete mode 100644 web-app/admin/src/app/admin/admin-users/dashboard/user-dashboard.component.scss delete mode 100644 web-app/admin/src/app/admin/admin-users/dashboard/user-dashboard.component.spec.ts delete mode 100644 web-app/admin/src/app/admin/admin-users/dashboard/user-dashboard.component.ts delete mode 100644 web-app/admin/src/app/admin/admin-users/delete-user/delete-user.component.html delete mode 100644 web-app/admin/src/app/admin/admin-users/delete-user/delete-user.component.scss delete mode 100644 web-app/admin/src/app/admin/admin-users/delete-user/delete-user.component.ts delete mode 100644 web-app/admin/src/app/admin/admin-users/user-details/user-details.component.html delete mode 100644 web-app/admin/src/app/admin/admin-users/user-details/user-details.component.scss delete mode 100644 web-app/admin/src/app/admin/admin-users/user-details/user-details.component.spec.ts delete mode 100644 web-app/admin/src/app/admin/admin-users/user-details/user-details.component.ts delete mode 100644 web-app/admin/src/app/admin/admin-users/user.d.ts delete mode 100644 web-app/admin/src/app/core/card-navbar/card-navbar.component.html delete mode 100644 web-app/admin/src/app/core/card-navbar/card-navbar.component.scss delete mode 100644 web-app/admin/src/app/core/card-navbar/card-navbar.component.spec.ts delete mode 100644 web-app/admin/src/app/core/card-navbar/card-navbar.component.ts delete mode 100644 web-app/admin/src/app/core/core.module.ts delete mode 100644 web-app/admin/src/app/core/search-modal/search-modal.component.html delete mode 100644 web-app/admin/src/app/core/search-modal/search-modal.component.scss delete mode 100644 web-app/admin/src/app/core/search-modal/search-modal.component.spec.ts delete mode 100644 web-app/admin/src/app/core/search-modal/search-modal.component.ts delete mode 100644 web-app/admin/src/app/logins/logins.component.html delete mode 100644 web-app/admin/src/app/logins/logins.component.scss delete mode 100644 web-app/admin/src/app/logins/logins.component.spec.ts delete mode 100644 web-app/admin/src/app/logins/logins.component.ts delete mode 100644 web-app/admin/src/app/logins/logins.module.ts delete mode 100644 web-app/admin/src/app/observation/observation.module.ts delete mode 100644 web-app/admin/src/app/shared/utils/password.utils.spec.ts delete mode 100644 web-app/admin/src/app/shared/utils/password.utils.ts create mode 100644 web-app/admin/src/ng1/admin/admin.dashboard.component.js create mode 100644 web-app/admin/src/ng1/admin/admin.dashboard.html create mode 100644 web-app/admin/src/ng1/admin/events/event.access.component.js create mode 100644 web-app/admin/src/ng1/admin/events/event.access.html create mode 100644 web-app/admin/src/ng1/admin/events/event.component.js create mode 100644 web-app/admin/src/ng1/admin/events/event.html create mode 100644 web-app/admin/src/ng1/admin/events/forms/form.create.component.js create mode 100644 web-app/admin/src/ng1/admin/events/forms/form.create.html create mode 100644 web-app/admin/src/ng1/admin/teams/index.js create mode 100644 web-app/admin/src/ng1/admin/teams/team.access.component.js create mode 100644 web-app/admin/src/ng1/admin/teams/team.access.html create mode 100644 web-app/admin/src/ng1/admin/teams/team.component.js create mode 100644 web-app/admin/src/ng1/admin/teams/team.delete.component.js create mode 100644 web-app/admin/src/ng1/admin/teams/team.delete.html create mode 100644 web-app/admin/src/ng1/admin/teams/team.edit.component.js create mode 100644 web-app/admin/src/ng1/admin/teams/team.edit.html create mode 100644 web-app/admin/src/ng1/admin/teams/team.html create mode 100644 web-app/admin/src/ng1/admin/teams/teams.component.js create mode 100644 web-app/admin/src/ng1/admin/teams/teams.html create mode 100644 web-app/admin/src/ng1/admin/users/index.js create mode 100644 web-app/admin/src/ng1/admin/users/map.icon.component.js create mode 100644 web-app/admin/src/ng1/admin/users/user.bulk.component.js create mode 100644 web-app/admin/src/ng1/admin/users/user.bulk.html create mode 100644 web-app/admin/src/ng1/admin/users/user.component.js create mode 100644 web-app/admin/src/ng1/admin/users/user.delete.component.js create mode 100644 web-app/admin/src/ng1/admin/users/user.delete.html create mode 100644 web-app/admin/src/ng1/admin/users/user.edit.component.js create mode 100644 web-app/admin/src/ng1/admin/users/user.edit.html create mode 100644 web-app/admin/src/ng1/admin/users/user.html create mode 100644 web-app/admin/src/ng1/admin/users/users.component.js create mode 100644 web-app/admin/src/ng1/admin/users/users.html delete mode 100644 web-app/src/app/event/event.types.ts delete mode 100644 web-app/src/app/filter/filter.types.ts delete mode 100644 web-app/src/app/ingress/authentication/@types/signup.ts diff --git a/.github/workflows/aws_dev.deploy.yaml b/.github/workflows/aws_dev.deploy.yaml new file mode 100644 index 000000000..b335e0bd7 --- /dev/null +++ b/.github/workflows/aws_dev.deploy.yaml @@ -0,0 +1,56 @@ +name: AWS Dev Deployment + +on: + push: + branches: + - "**" + workflow_dispatch: + +permissions: + id-token: write + contents: read + +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + + - name: Set IMAGE_TAG + run: | + if [[ "${{ github.ref_name }}" == "test" ]]; then + echo "IMAGE_TAG=test" >> $GITHUB_ENV + else + echo "IMAGE_TAG=dev" >> $GITHUB_ENV + fi + + - name: AWS config + uses: aws-actions/configure-aws-credentials@v3 + with: + role-to-assume: ${{ secrets.AWS_DEV_ROLE }} + role-session-name: GithubNGAGeointSession + aws-region: ${{ secrets.AWS_DEV_REGION }} + + - name: AWS ECR Login + id: ecr-login + uses: aws-actions/amazon-ecr-login@v2 + + - name: Build Docker image + env: + REGISTRY: ${{ steps.ecr-login.outputs.registry }} + REPOSITORY: "/mage/server" + IMAGE_TAG: ${{ env.IMAGE_TAG }} + run: | + docker build -t $REGISTRY$REPOSITORY:$IMAGE_TAG . + + - name: Push Image and ReDeploy ECS Service + if: github.ref =='refs/heads/test' || github.ref =='refs/heads/develop' + env: + SERVICE: "mage${{ env.IMAGE_TAG }}" + REGISTRY: ${{ steps.ecr-login.outputs.registry }} + REPOSITORY: "/mage/server" + IMAGE_TAG: ${{ env.IMAGE_TAG }} + run: | + docker push $REGISTRY$REPOSITORY:$IMAGE_TAG + aws ecs update-service --cluster magedev --service $SERVICE --force-new-deployment diff --git a/.github/workflows/dev.container_build.yaml b/.github/workflows/dev.container_build.yaml deleted file mode 100644 index 13db7c07b..000000000 --- a/.github/workflows/dev.container_build.yaml +++ /dev/null @@ -1,42 +0,0 @@ -name: Dev Container Build - -on: - push: - branches: - - "**" - workflow_dispatch: - -permissions: - contents: read - packages: write - -jobs: - build-and-push: - runs-on: ubuntu-latest - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - - - name: Set IMAGE_TAG - run: | - if [[ "${{ github.ref_name }}" == "test" ]]; then - echo "IMAGE_TAG=test" >> $GITHUB_ENV - else - echo "IMAGE_TAG=dev" >> $GITHUB_ENV - fi - - - name: Login to Github Registry ghcr.io - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build Docker image - run: | - docker build -t ghcr.io/${{ github.repository }}/mage:$IMAGE_TAG . - - - name: Push Image - if: github.ref =='refs/heads/test' || github.ref =='refs/heads/develop' - run: | - docker push ghcr.io/${{ github.repository }}/mage:$IMAGE_TAG diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index e832f6704..d969d1c28 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -18,6 +18,14 @@ on: required: false default: true + # TODO: possibly use release branches to perform the release process + # push: + # branches: + # - release/* + # - prerelease/* + # TODO: possibly use release event to perform the release process + # release: + jobs: config: uses: ./.github/workflows/config.yaml @@ -102,17 +110,11 @@ jobs: name: publish packages needs: [config, create_release] runs-on: ubuntu-latest - permissions: - id-token: write - contents: read steps: - name: setup node - uses: actions/setup-node@v4 + uses: actions/setup-node@v3 with: node-version: ${{ needs.config.outputs.node_versions-lts }} - registry-url: "https://registry.npmjs.org" - - name: update npm - run: npm install -g npm@latest - name: install json util run: npm i -g json - name: download service packages @@ -125,10 +127,13 @@ jobs: name: mage.web-app-artifacts - name: publish mage service run: | - npm publish --access public $(ls -1 ngageoint-mage.service-*.tgz) ${{(inputs.is_prerelease && '--tag beta') || ''}} || echo "skipping mage service publish..." + npm config set -- '//registry.npmjs.org/:_authToken' ${{ secrets.NPM_TOKEN }} + npm publish --access public $(ls -1 ngageoint-mage.service-*.tgz) || echo "skipping mage service publish..." - name: publish mage web run: | - npm publish --access public $(ls -1 ngageoint-mage.web-app-*.tgz) ${{(inputs.is_prerelease && '--tag beta') || ''}} || echo "skipping mage web app publish..." + npm config set -- '//registry.npmjs.org/:_authToken' ${{ secrets.NPM_TOKEN }} + npm publish --access public $(ls -1 ngageoint-mage.web-app-*.tgz) || echo "skipping mage web app publish..." - name: publish mage core run: | - npm publish --access public $(ls -1 ngageoint-mage.web-core-lib-*.tgz) ${{(inputs.is_prerelease && '--tag beta') || ''}} || echo "skipping mage core publish..." + npm config set -- '//registry.npmjs.org/:_authToken' ${{ secrets.NPM_TOKEN }} + npm publish --access public $(ls -1 ngageoint-mage.web-core-lib-*.tgz) || echo "skipping mage core publish..." diff --git a/CHANGELOG.md b/CHANGELOG.md index e2f666176..b17e50d6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # Change Log All notable changes to this project will be documented in this file. -Mage adheres to [Semantic Versioning](http://semver.org/). +MAGE adheres to [Semantic Versioning](http://semver.org/). --- diff --git a/CODEOWNERS b/CODEOWNERS deleted file mode 100644 index 258775fbe..000000000 --- a/CODEOWNERS +++ /dev/null @@ -1 +0,0 @@ -@ngageoint/mage \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index dc6fa9b3c..f5827a2f2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,6 +5,7 @@ COPY service/package*.json ./ RUN npm install COPY service/ ./ RUN npm run build + RUN npm pack # Build web-app @@ -15,74 +16,83 @@ COPY web-app/package*.json ./ RUN npm install COPY web-app/ ./ RUN npm run build + RUN npm pack ./dist -# FROM node:20.11.1 AS build-arcwebplugin -# # Build arcgis service plugin -# WORKDIR /arcgiswebplugin -# COPY plugins/arcgis/web-app/package*.json ./ -# RUN npm install -# COPY --from=build-service /service /arcgiswebplugin/node_modules/@ngageoint/mage.service -# COPY plugins/arcgis/web-app/ ./ -# RUN npm run build -# RUN npm pack ./dist/main +FROM node:20.11.1 AS build-arcwebplugin +# Build arcgis service plugin +WORKDIR /arcgiswebplugin +COPY plugins/arcgis/web-app/package*.json ./ +RUN npm install +COPY --from=build-service /service /arcgiswebplugin/node_modules/@ngageoint/mage.service +COPY plugins/arcgis/web-app/ ./ +RUN npm run build +RUN npm pack ./dist/main -# FROM node:20.11.1 AS build-arcserviceplugin -# WORKDIR /arcgisserviceplugin -# COPY plugins/arcgis/service/package*.json ./ -# RUN npm install -# COPY --from=build-service /service /arcgisserviceplugin/node_modules/@ngageoint/mage.service -# COPY plugins/arcgis/service/ ./ -# RUN npm run build -# RUN npm pack +FROM node:20.11.1 AS build-arcserviceplugin +WORKDIR /arcgisserviceplugin +COPY plugins/arcgis/service/package*.json ./ +RUN npm install +COPY --from=build-service /service /arcgisserviceplugin/node_modules/@ngageoint/mage.service +COPY plugins/arcgis/service/ ./ +RUN npm run build +RUN npm pack -# FROM node:20.11.1 AS build-imageserviceplugin -# WORKDIR /imageserviceplugin -# COPY plugins/image/service/package*.json ./ -# RUN npm install -# COPY --from=build-service /service /imageserviceplugin/node_modules/@ngageoint/mage.service -# RUN rm -rf /imageserviceplugin/node_modules/@ngageoint/mage.service/node_modules/mongoose -# COPY plugins/image/service/ ./ -# RUN npm run build -# RUN npm pack +FROM node:20.11.1 AS build-imageserviceplugin +WORKDIR /imageserviceplugin +COPY plugins/image/service/package*.json ./ +RUN npm install +COPY --from=build-service /service /imageserviceplugin/node_modules/@ngageoint/mage.service +RUN rm -rf /imageserviceplugin/node_modules/@ngageoint/mage.service/node_modules/mongoose +COPY plugins/image/service/ ./ +RUN npm run build +RUN npm pack -# FROM node:20.11.1 AS build-sftpserviceplugin -# WORKDIR /sftpserviceplugin -# COPY plugins/sftp/service/package*.json ./ -# RUN npm install -# COPY --from=build-service /service /sftpserviceplugin/node_modules/@ngageoint/mage.service -# COPY plugins/sftp/service/ ./ -# RUN npm run build -# RUN npm pack +FROM node:20.11.1 AS build-sftpserviceplugin +WORKDIR /sftpserviceplugin +COPY plugins/sftp/service/package*.json ./ +RUN npm install +COPY --from=build-service /service /sftpserviceplugin/node_modules/@ngageoint/mage.service +COPY plugins/sftp/service/ ./ +RUN npm run build +RUN npm pack -# FROM node:20.11.1 AS build-sftpwebplugin -# # Build sftp service plugin -# WORKDIR /sftpwebplugin -# COPY plugins/sftp/web/package*.json ./ -# RUN npm install -# COPY plugins/sftp/web/ ./ -# RUN npm run build -# RUN npm pack ./dist/main +FROM node:20.11.1 AS build-sftpwebplugin +# Build sftp service plugin +WORKDIR /sftpwebplugin +COPY plugins/sftp/web/package*.json ./ +RUN npm install +COPY plugins/sftp/web/ ./ +RUN npm run build +RUN npm pack ./dist/main # Build instance FROM node:20.11.1 AS build-instance COPY --from=build-service /service/ngageoint*.tgz /service/ COPY --from=build-webapp /web-app/ngageoint*.tgz /web-app/ -# COPY --from=build-arcwebplugin /arcgiswebplugin/ngageoint*.tgz /arcgiswebplugin/ -# COPY --from=build-arcserviceplugin /arcgisserviceplugin/ngageoint*.tgz /arcgisserviceplugin/ -# COPY --from=build-sftpserviceplugin /sftpserviceplugin/ngageoint*.tgz /sftpserviceplugin/ -# COPY --from=build-sftpwebplugin /sftpwebplugin/ngageoint*.tgz /sftpwebplugin/ +COPY --from=build-arcwebplugin /arcgiswebplugin/ngageoint*.tgz /arcgiswebplugin/ +COPY --from=build-arcserviceplugin /arcgisserviceplugin/ngageoint*.tgz /arcgisserviceplugin/ +COPY --from=build-sftpserviceplugin /sftpserviceplugin/ngageoint*.tgz /sftpserviceplugin/ +COPY --from=build-sftpwebplugin /sftpwebplugin/ngageoint*.tgz /sftpwebplugin/ +COPY --from=build-imageserviceplugin /imageserviceplugin/ngageoint*.tgz /imageserviceplugin/ -ENV MAGE_HOME=/home/mage/instance -WORKDIR ${MAGE_HOME} +WORKDIR /instance +RUN ls -la ../sftpwebplugin +RUN npm install ../service/ngageoint-mage.service*.tgz +RUN npm install ../web-app/ngageoint-mage.web-app*.tgz +RUN npm install ../sftpwebplugin/ngageoint-mage.sftp.web*.tgz +RUN npm install ../sftpserviceplugin/ngageoint-mage.sftp.service*.tgz +RUN npm install ../arcgiswebplugin/ngageoint*.tgz +RUN npm install ../arcgisserviceplugin/ngageoint*.tgz +RUN npm install ../imageserviceplugin/ngageoint*.tgz -RUN npm install ../../../service/ngageoint-mage.service*.tgz -RUN npm install ../../../web-app/ngageoint-mage.web-app*.tgz -# RUN npm install ../../../sftpwebplugin/ngageoint-mage.sftp.web*.tgz -# RUN npm install ../../../sftpserviceplugin/ngageoint-mage.sftp.service*.tgz -# RUN npm install ../../../arcgiswebplugin/ngageoint*.tgz -# RUN npm install ../../../arcgisserviceplugin/ngageoint*.tgz -RUN ln -s ./node_modules/.bin/mage.service ENV NODE_PATH=./node_modules -ENTRYPOINT [ "./mage.service" ] \ No newline at end of file +ENTRYPOINT [ \ + "./node_modules/.bin/mage.service", \ + "--plugin", "@ngageoint/mage.image.service", \ + "--plugin", "@ngageoint/mage.arcgis.service", \ + "--plugin", "@ngageoint/mage.sftp.service", \ + "--web-plugin", "@ngageoint/mage.sftp.web", \ + "--web-plugin", "@ngageoint/mage.arcgis.web-app" \ + ] \ No newline at end of file diff --git a/README.md b/README.md index 4cd70fda2..fa6e86866 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,32 @@ -# Mage Web Service & Web App +# MAGE Web Service & Web App -The [Mage](https://ngageoint.github.io/MAGE) platform, provides -mobile situational awareness and data collection capabilities. This project comprises the ReST API web service the Mage -client apps use to submit and fetch Mage data, as well as the browser-based web app. The Mage web app provides user -interfaces to view and edit Mage observations similar to the Mage mobile apps, and additionally provides the -administrative UI to manage the Mage server settings, access control, events, data collection forms, etc. +The [MAGE](https://ngageoint.github.io/MAGE) platform, provides +mobile situational awareness and data collection capabilities. This project comprises the ReST API web service the MAGE +client apps use to submit and fetch MAGE data, as well as the browser-based web app. The MAGE web app provides user +interfaces to view and edit MAGE observations similar to the MAGE mobile apps, and additionally provides the +administrative UI to manage the MAGE server settings, access control, events, data collection forms, etc. -Mage was developed at the National Geospatial-Intelligence Agency (NGA) in collaboration with BIT Systems. The +MAGE was developed at the National Geospatial-Intelligence Agency (NGA) in collaboration with BIT Systems. The government has "unlimited rights" and is releasing this software to increase the impact of government investments by providing developers with the opportunity to take things in new directions. The software use, modification, and distribution rights are stipulated within the [Apache license](LICENSE). ## Technology stack -Mage is built using the [MEAN stack](https://en.wikipedia.org/wiki/MEAN_(software_bundle)). The components of the MEAN +MAGE is built using the [MEAN stack](https://en.wikipedia.org/wiki/MEAN_(software_bundle)). The components of the MEAN stack are as follows: * [MongoDB](https://www.mongodb.com/) - a NoSQL JSON document database * [Express.js](http://expressjs.com/) - a web server framework for Node to handle ReST API requests * [Angular](https://angular.io/) - a JavaScript MVC framework for web app front-ends * [Node.js](https://nodejs.org/) - a software platform for scalable server-side and networking applications. -The Mage server code is [TypeScript](https://www.typescriptlang.org/) for strong typing, which transpiles to JavaScript +The MAGE server code is [TypeScript](https://www.typescriptlang.org/) for strong typing, which transpiles to JavaScript that runs on Node.js. At the time of this writing, the transition of legacy JavaScript to TypeScript is still in progress. ## Project structure -The Mage server project is essentially a monorepo with several NPM package components that assemble into a running +The MAGE server project is essentially a monorepo with several NPM package components that assemble into a running server instance. ### [`service`](./service/) @@ -37,7 +37,7 @@ web and mobile apps consume. ### [`web-app`](./web-app/) The `web-app` directory contains the `@ngageoint/mage.web-app` package. The package is the bundled, [Angular](https://angular.io)-based -web app Mage client that includes standard user functionality as well as access administrative functions. +web app MAGE client that includes standard user functionality as well as access administrative functions. ### [`core-lib`](./web-app/projects/core-lib/) @@ -47,36 +47,36 @@ plugins can use to add custom UI elements to the web app. ### [`instance`](./instance/) -The `instance` directory is a development instance of the Mage server whose dependencies are the relative paths to the -other packages in the project. This is useful as an example of how to assemble and configure a Mage server instance, +The `instance` directory is a development instance of the MAGE server whose dependencies are the relative paths to the +other packages in the project. This is useful as an example of how to assemble and configure a MAGE server instance, as well as to run and test the server during development. ### [`plugins`](./plugins/) -The `plugins` directory contains various plugin packages that the Mage team maintains as part of the Mage server open -source project. Some of these are automatically bundled with Mage server releases, and some serve as examples and/or +The `plugins` directory contains various plugin packages that the MAGE team maintains as part of the MAGE server open +source project. Some of these are automatically bundled with MAGE server releases, and some serve as examples and/or development utilities. -## Running a Mage server +## Running a MAGE server -The Mage server Node.js app is generally intended to run on Unix-like platforms. The server _should_ run on Windows, +The MAGE server Node.js app is generally intended to run on Unix-like platforms. The server _should_ run on Windows, but be aware some path-separator related bugs may exist ### Install Node.js -The Mage server is a [Node.js](https://nodejs.org) application, so of course you'll need to install Node on your +The MAGE server is a [Node.js](https://nodejs.org) application, so of course you'll need to install Node on your platform of choice. [Node Version Manager](https://github.com/nvm-sh/nvm) is a nice tool to use for installing and -managing different versions of Node, as opposed to various package managers. At the time of this writing, Mage +managing different versions of Node, as opposed to various package managers. At the time of this writing, MAGE requires Node > 18.x. Developers should use the latest LTS, 20.x at the time of this writing. ### Install MongoDB -Before running a Mage server, you'll need to install and start [MongoDB](https://www.mongodb.com/try/download/community). -At the time of this writing, Mage supports MongoDB version 6.x (6.0). +Before running a MAGE server, you'll need to install and start [MongoDB](https://www.mongodb.com/try/download/community). +At the time of this writing, MAGE supports MongoDB version 6.x (6.0). -### Install Mage server packages +### Install MAGE server packages -Starting with release [6.2.2](https://github.com/ngageoint/mage-server/releases/tag/6.2.2), the Mage server packages +Starting with release [6.2.2](https://github.com/ngageoint/mage-server/releases/tag/6.2.2), the MAGE server packages are available from the [NPM registry](https://npmjs.com). ```bash mkdir mage @@ -96,11 +96,11 @@ That will yield a `package.json` file that looks something like } } ``` -as well as a `package-lock.json` file and `node_modules` directory containing all of the Mage server's dependencies. +as well as a `package-lock.json` file and `node_modules` directory containing all of the MAGE server's dependencies. ### Register plugins -As the example instance [configuration](./instance/config.js) demonstrates, you'll need to tell the Mage service what +As the example instance [configuration](./instance/config.js) demonstrates, you'll need to tell the MAGE service what plugins to load. See the `plugins` entry in the configuration object, as well as the [plugins readme](./plugins/README.md). Note that the `@ngageoint/mage.image.service` package in the dependency list above is a plugin package, and [resides](./plugins/image/service) in this monorepo. @@ -154,20 +154,20 @@ print the configuration as a JSON string and exit without starting the server. ``` npx @ngageoint/mage.service --show-config ``` -By default, the Mage server will attempt to create and use a directory at `/var/lib/mage` for storing data and media -such as videos, photos, and icons. If the system user account that runs the Mage server does not have permission to +By default, the MAGE server will attempt to create and use a directory at `/var/lib/mage` for storing data and media +such as videos, photos, and icons. If the system user account that runs the MAGE server does not have permission to create that directory, you must create it before starting the server. Of course you can change the directories the server uses through the script command line switches and/or environment variables. -For convenience, the Mage server project contains an [environment script](./service/src/environment/magerc.sh) that you -can copy and customize. You can configure the Mage system user account to source the script at login. +For convenience, the MAGE server project contains an [environment script](./service/src/environment/magerc.sh) that you +can copy and customize. You can configure the MAGE system user account to source the script at login. -The Node Mage server runs on port 4242 by default. You can access the Mage web app in your web browser at -[http://127.0.0.1:4242](http://127.0.0.1:4242) if you are running Mage locally. +The Node MAGE server runs on port 4242 by default. You can access the MAGE web app in your web browser at +[http://127.0.0.1:4242](http://127.0.0.1:4242) if you are running MAGE locally. ### Running with [Docker](https://www.docker.com/what-docker) -Refer to the [Docker README](docker/README.md) for details on running the Mage server using Docker. +Refer to the [Docker README](docker/README.md) for details on running the MAGE server using Docker. ### Production notes @@ -175,23 +175,23 @@ When running a publicly accessible production server, consider the following poi #### Configuration location -If all of your Mage server configuration options come from environment variables, as should be the case with most +If all of your MAGE server configuration options come from environment variables, as should be the case with most cloud server deployments, you will not need to worry about the location of a configuration file. If you are using a JSON or JavaScript module configuration file, be sure to the store the file in a location outside where you have -install the Mage server packages. For example, if you installed the Mage server in `/opt/mage`, keep your +install the MAGE server packages. For example, if you installed the MAGE server in `/opt/mage`, keep your configuration in some non-overlapping directory like `/etc/mage.json`. That way, if you decide to delete the contents of `/opt/mage` and start fresh, your configuration will remain intact. #### Running with `forever` -Use a tool like [`forever`](https://www.npmjs.com/package/forever) to run the Mage server process as a daemon in a -production environment. `forever` will restart the Mage server process if it happens to terminate unexpectedly. +Use a tool like [`forever`](https://www.npmjs.com/package/forever) to run the MAGE server process as a daemon in a +production environment. `forever` will restart the MAGE server process if it happens to terminate unexpectedly. First, you'll need to install `forever`. ```bash npm install -g forever ``` -To run the Mage server with `forever`, you can start the server like the following, assuming you are in the directory -where you have installed the Mage server packages. +To run the MAGE server with `forever`, you can start the server like the following, assuming you are in the directory +where you have installed the MAGE server packages. ```bash forever start ./node_modules/.bin/mage.service <...options> ``` @@ -213,8 +213,8 @@ var Service = require('node-windows').Service; // Create a new service object var svc = new Service({ name:'Mage Service', - description: 'To run Mage Server as a windows service', - script: '{Mage Install Directory}\\node_modules\\@ngageoint\\mage.service\\bin\\mage.service.js', + description: 'To run MAGE Server as a windows service', + script: '{MAGE Install Directory}\\node_modules\\@ngageoint\\mage.service\\bin\\mage.service.js', nodeOptions: [ ] //, workingDirectory: '...' @@ -233,13 +233,13 @@ Upon running the created script, a new Windows service will be created matching #### HTTPS/TLS -When running a Mage server in a publicly accessible production environment, as with any web application, you should use +When running a MAGE server in a publicly accessible production environment, as with any web application, you should use a reverse proxy such as [Apache HTTP Server](https://httpd.apache.org/) or [NGINX](https://nginx.org/) to force -external connections to use HTTPS and run the Mage server Node process on a private subnet host. The Mage server Node +external connections to use HTTPS and run the MAGE server Node process on a private subnet host. The MAGE server Node application itself does not support HTTPS/TLS connections. **IMPORTANT:** Be sure your reverse proxy properly sets the `X-Forwarded-Host` and `X-Forwarded-Proto` headers properly. -The Mage Node.js app builds URLs, via [Express.js](https://expressjs.com/en/4x/api.html#req.hostname), that Mage clients +The MAGE Node.js app builds URLs, via [Express.js](https://expressjs.com/en/4x/api.html#req.hostname), that MAGE clients use to request resources. For Microsoft ISS installations, in addition to running a reverse proxy, you must configure ISS to preserve @@ -250,31 +250,31 @@ host headers. To do this, execute the following command: #### Cloud Foundry deployment -Mage uses the [cfenv](https://github.com/cloudfoundry-community/node-cfenv) Node module to read settings from Cloud Foundry's +MAGE uses the [cfenv](https://github.com/cloudfoundry-community/node-cfenv) Node module to read settings from Cloud Foundry's [environment variables](https://docs.cloudfoundry.org/devguide/deploy-apps/environment-variable.html). If Cloud Foundry's environment variables are present, they will take precedence over any of their counterparts derived from the [magerc.sh](environment/env.js) file. This pertains mostly to defining the connection to the MongoDB server as a bound service in Cloud Foundry, for which Cloud Foundry should supply the connection string and credentials in the `VCAP_SERVICES` value. -### Upgrading Mage server +### Upgrading MAGE server -Upgrading the Mage server essentially consists of the same process as [installing for the first time](#install-mage-server-packages). +Upgrading the MAGE server essentially consists of the same process as [installing for the first time](#install-mage-server-packages). 1. As above, install the desired versions of the packages. -1. Stop your current Mage server if it is running. +1. Stop your current MAGE server if it is running. 1. *_[BACK UP YOUR DATABASE](https://docs.mongodb.com/manual/core/backups/)!_* (You already do that regularly, right?) -1. Start your new Mage server, which will automatically run any database [migrations](./service/src/migrations) present in +1. Start your new MAGE server, which will automatically run any database [migrations](./service/src/migrations) present in the new version. ## Building from source -First, clone the Mage server GitHub repository, or download a release source tarball and extract the contents to an +First, clone the MAGE server GitHub repository, or download a release source tarball and extract the contents to an empty directory, such as `mage-server`. The project has a monorepo structure. The main packages to build are [`@ngageoint/mage.service`](./service/) and [`@ngageoint/mage.web-app`](./web-app/). There are more optional packages in the [`plugins`](./plugins/) -directory. The [`instance`](./instance/) package is an example of assembling all the packages into a running Mage +directory. The [`instance`](./instance/) package is an example of assembling all the packages into a running MAGE server instance. The project's root [`package.json`](./package.json) provides convenience script entries to install, build, and run -the Mage server components. +the MAGE server components. Download and install the dependencies: @@ -300,7 +300,7 @@ Run the app with the `instance/config.ts` settings If the monogo database is up and running and everything is built, you should see a message like: - 2025-05-13T20:12:36.120Z - info: Mage Server listening at address 127.0.0.1 on port 4242 + 2025-05-13T20:12:36.120Z - info: MAGE Server listening at address 127.0.0.1 on port 4242 Open a browser to: . If the ArcGIS and SFTP plug-ins were built, you'll see those tabs on the sidebar in Settings. @@ -369,13 +369,13 @@ By default, the Dockerfile includes additional plugins. Should you want to add/r ### HTTPS/TLS reverse proxy Then `mage-web-proxy` service is optional when developing and running on -localhost, but highly recommended when running Mage Server on publicly +localhost, but highly recommended when running MAGE Server on publicly accessible servers. The service in `docker-compose.yml` uses the official nginx docker image with an appropriate [configuration](web/nginx.conf). This is an example of setting up a reverse proxy in front of the Node server to enforce HTTPS/TLS connections to the server. Of course, you could use any reverse proxy you see fit, such as [Apache HTTP Server](https://httpd.apache.org/) -or an AWS [Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html). To run your Mage server behind the TLS +or an AWS [Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html). To run your MAGE server behind the TLS reverse proxy, peform the following modifications to `docker-compose.yml`. 1. Comment the `ports` block for the `mage-server` service to disallow connections directly to the Node.js server. @@ -384,7 +384,7 @@ reverse proxy, peform the following modifications to `docker-compose.yml`. For testing in a development environment, you can create a self-signed server certificate for nginx to use. The following OpenSSL command, run from the directory of this README, will create a self-signed server certificate and -private key in the `web` directory that should allow the Mage mobile app to +private key in the `web` directory that should allow the MAGE mobile app to connect to nginx. Replace the values of the `SUBJ_*` variables at the beginning of the command with your own values. ``` @@ -410,8 +410,8 @@ substitution and allows treating the enclosed command output as a file. The public certificate, `mage-web.crt`, as a trusted authority on a mobile device. **IMPORTANT** If you intend to connect to your reverse proxy from a mobile -device or simulator/emulator running the Mage mobile app, make sure that the -value of the `SUBJ_CN` variable matches the IP address of your Mage Server +device or simulator/emulator running the MAGE mobile app, make sure that the +value of the `SUBJ_CN` variable matches the IP address of your MAGE Server host on your network, or the resolvable host name of the host. TLS connections will not succeed if Common Name and Subject Alternative Name fields in the public certificate do not match the host name. @@ -423,28 +423,28 @@ connecting from a mobile device on the same network. ### Bind mounts The Compose file uses [bind mounts](https://docs.docker.com/storage/bind-mounts/) -for the MongoDB database directory, database log path, and Mage server +for the MongoDB database directory, database log path, and MAGE server [resources](../README.md#mage-local-media-directory). By default, the source paths of those bind mounts are `database/data`, `database/log`, and `server/resources`, respectively. You can change the source paths according to your environment and needs. -With these bind mounts, the Mage server will retain its data on your host file +With these bind mounts, the MAGE server will retain its data on your host file system in directories you can explore and manage yourself. For example, this -setup allows you to mount a directory into the Mage server container from a +setup allows you to mount a directory into the MAGE server container from a [FUSE-based](https://github.com/libfuse/libfuse) file system, which might provide extra functionality like [encryption](https://www.veracrypt.fr) or [remote mounting](https://github.com/libfuse/sshfs) transparently to the -Docker container and Mage application. If you don't have any requirements of +Docker container and MAGE application. If you don't have any requirements of that sort, you can modify the Compose file to use [Docker-managed volumes](https://docs.docker.com/storage/volumes/) instead of bind mounts. ### Ports The only port the Compose file exposes to the host by default is 4242 on the `mage-server` service to allow HTTP connections from your host web browser to -the Mage server running in the Docker container. In a production environment, +the MAGE server running in the Docker container. In a production environment, you could add another service in the Compose file to run an [nginx](https://hub.docker.com/_/nginx/) or [httpd](https://hub.docker.com/_/httpd/) -reverse proxy with TLS or other security measures in front of the Mage Server +reverse proxy with TLS or other security measures in front of the MAGE Server Node application. In that case you would remove the ```yaml ports: @@ -465,8 +465,8 @@ your host machine to examine or modify the database contents. ### Environment settings -You can configure the Mage server Docker app using [environment variables](../README.md#mage-environment-settings). -The Compose file does this by necessity to configure the MongoDB URL for the Mage server. +You can configure the MAGE server Docker app using [environment variables](../README.md#mage-environment-settings). +The Compose file does this by necessity to configure the MongoDB URL for the MAGE server. ```yaml environment: MAGE_MONGO_URL: mongodb://mage-db:27017/magedb @@ -536,13 +536,13 @@ By default, the Dockerfile includes additional plugins. Should you want to add/r ### HTTPS/TLS reverse proxy Then `mage-web-proxy` service is optional when developing and running on -localhost, but highly recommended when running Mage Server on publicly +localhost, but highly recommended when running MAGE Server on publicly accessible servers. The service in `docker-compose.yml` uses the official nginx docker image with an appropriate [configuration](web/nginx.conf). This is an example of setting up a reverse proxy in front of the Node server to enforce HTTPS/TLS connections to the server. Of course, you could use any reverse proxy you see fit, such as [Apache HTTP Server](https://httpd.apache.org/) -or an AWS [Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html). To run your Mage server behind the TLS +or an AWS [Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html). To run your MAGE server behind the TLS reverse proxy, peform the following modifications to `docker-compose.yml`. 1. Comment the `ports` block for the `mage-server` service to disallow connections directly to the Node.js server. @@ -551,7 +551,7 @@ reverse proxy, peform the following modifications to `docker-compose.yml`. For testing in a development environment, you can create a self-signed server certificate for nginx to use. The following OpenSSL command, run from the directory of this README, will create a self-signed server certificate and -private key in the `web` directory that should allow the Mage mobile app to +private key in the `web` directory that should allow the MAGE mobile app to connect to nginx. Replace the values of the `SUBJ_*` variables at the beginning of the command with your own values. ``` @@ -577,8 +577,8 @@ substitution and allows treating the enclosed command output as a file. The public certificate, `mage-web.crt`, as a trusted authority on a mobile device. **IMPORTANT** If you intend to connect to your reverse proxy from a mobile -device or simulator/emulator running the Mage mobile app, make sure that the -value of the `SUBJ_CN` variable matches the IP address of your Mage Server +device or simulator/emulator running the MAGE mobile app, make sure that the +value of the `SUBJ_CN` variable matches the IP address of your MAGE Server host on your network, or the resolvable host name of the host. TLS connections will not succeed if Common Name and Subject Alternative Name fields in the public certificate do not match the host name. @@ -590,28 +590,28 @@ connecting from a mobile device on the same network. ### Bind mounts The Compose file uses [bind mounts](https://docs.docker.com/storage/bind-mounts/) -for the MongoDB database directory, database log path, and Mage server +for the MongoDB database directory, database log path, and MAGE server [resources](../README.md#mage-local-media-directory). By default, the source paths of those bind mounts are `database/data`, `database/log`, and `server/resources`, respectively. You can change the source paths according to your environment and needs. -With these bind mounts, the Mage server will retain its data on your host file +With these bind mounts, the MAGE server will retain its data on your host file system in directories you can explore and manage yourself. For example, this -setup allows you to mount a directory into the Mage server container from a +setup allows you to mount a directory into the MAGE server container from a [FUSE-based](https://github.com/libfuse/libfuse) file system, which might provide extra functionality like [encryption](https://www.veracrypt.fr) or [remote mounting](https://github.com/libfuse/sshfs) transparently to the -Docker container and Mage application. If you don't have any requirements of +Docker container and MAGE application. If you don't have any requirements of that sort, you can modify the Compose file to use [Docker-managed volumes](https://docs.docker.com/storage/volumes/) instead of bind mounts. ### Ports The only port the Compose file exposes to the host by default is 4242 on the `mage-server` service to allow HTTP connections from your host web browser to -the Mage server running in the Docker container. In a production environment, +the MAGE server running in the Docker container. In a production environment, you could add another service in the Compose file to run an [nginx](https://hub.docker.com/_/nginx/) or [httpd](https://hub.docker.com/_/httpd/) -reverse proxy with TLS or other security measures in front of the Mage Server +reverse proxy with TLS or other security measures in front of the MAGE Server Node application. In that case you would remove the ```yaml ports: @@ -632,8 +632,8 @@ your host machine to examine or modify the database contents. ### Environment settings -You can configure the Mage server Docker app using [environment variables](../README.md#mage-environment-settings). -The Compose file does this by necessity to configure the MongoDB URL for the Mage server. +You can configure the MAGE server Docker app using [environment variables](../README.md#mage-environment-settings). +The Compose file does this by necessity to configure the MongoDB URL for the MAGE server. ```yaml environment: MAGE_MONGO_URL: mongodb://mage-db:27017/magedb @@ -642,20 +642,20 @@ environment: ## ReST API -The Mage ReSTful API is documented using [OpenAPI](https://swagger.io/specification/). A Mage server instance includes -a [Swagger UI](https://swagger.io/tools/swagger-ui/) page that renders a web app from the Mage [OpenAPI document](service/src/docs/openapi.yaml). -The Swagger UI page is handy for testing the ReST API operations individually. The _About_ page in the Mage web app has +The MAGE ReSTful API is documented using [OpenAPI](https://swagger.io/specification/). A MAGE server instance includes +a [Swagger UI](https://swagger.io/tools/swagger-ui/) page that renders a web app from the MAGE [OpenAPI document](service/src/docs/openapi.yaml). +The Swagger UI page is handy for testing the ReST API operations individually. The _About_ page in the MAGE web app has a link to the Swagger UI. After logging in to the web app, the Swagger UI will automatically use the authentication token from your login to authenticate ReST API requests. Be mindful that the SwaggerUI is interacting with your server's data, so use caution when trying POST/PUT/DELETE operations that mutate data. ### Code generation -You can use the Mage server's OpenAPI document to generate an HTTP client that can consume the API. Swagger and many other tools exist to generate client stubs based on OpenAPI. [OpenAPI.Tools](https://openapi.tools/) is a good place to start. +You can use the MAGE server's OpenAPI document to generate an HTTP client that can consume the API. Swagger and many other tools exist to generate client stubs based on OpenAPI. [OpenAPI.Tools](https://openapi.tools/) is a good place to start. ### Android & iOS client apps -The Mage team develops [Android](https://github.com/ngageoint/mage-android) and [iOS](https://github.com/ngageoint/mage-ios) +The MAGE team develops [Android](https://github.com/ngageoint/mage-android) and [iOS](https://github.com/ngageoint/mage-ios) apps that interact with the ReST API. The apps are open source and available under the Apache License for anyone to use. Check them out if you are considering mobile capabilities. diff --git a/aws_amazon_linux_2023.md b/aws_amazon_linux_2023.md index c843caedf..96487cc46 100644 --- a/aws_amazon_linux_2023.md +++ b/aws_amazon_linux_2023.md @@ -1,4 +1,4 @@ -Mage 6.2.x on Amazon Linux 2023 +MAGE 6.2.x on Amazon Linux 2023 1. Install docker ``` diff --git a/docker/README.md b/docker/README.md index 2999a82e5..7aca9d901 100644 --- a/docker/README.md +++ b/docker/README.md @@ -1,10 +1,10 @@ # Running with Docker -## Mage server image +## MAGE server image -The Mage Server image contains the the core Mage server Node app that consists -of the ReST web service and the Mage web app. By default, the image also -includes plugins maintained in the [Mage server repository](../plugins/). By +The MAGE Server image contains the the core MAGE server Node app that consists +of the ReST web service and the MAGE web app. By default, the image also +includes plugins maintained in the [MAGE server repository](../plugins/). By default, the server [Dockerfile](./server/Dockerfile) pulls the latest tagged versions from the NPM registry. You can override the version using Docker's `--build-arg` CLI switch to set the package versions you want in the image. @@ -23,23 +23,23 @@ Dockerfile builds exactly the same as the standard Dockerfile. ## Docker Compose -You can start a Mage server by using [docker compose](https://docs.docker.com/compose/) to start services -defined in Mage's [Compose file](docker-compose.yml). +You can start a MAGE server by using [docker compose](https://docs.docker.com/compose/) to start services +defined in MAGE's [Compose file](docker-compose.yml). -The first time you run Mage with Docker, execute the following steps from the directory where you cloned the -Mage Git repository. +The first time you run MAGE with Docker, execute the following steps from the directory where you cloned the +MAGE Git repository. ```bash $ cd ./docker $ docker compose up -d # build the service images, then create and start the service containers for the first time ``` -If you want to use a Mage server image tagged with a different version than +If you want to use a MAGE server image tagged with a different version than the `mage-server` Compose service currently defines, prepend the `MAGE_VERSION` environment variable to the command. ```bash $ MAGE_VERSION=6.3.0-beta.1 docker compose up -d ``` With all the default settings, you should then be able to browse to -http://localhost:4242 to interact with the Mage web app. +http://localhost:4242 to interact with the MAGE web app. ## Interacting with the containers @@ -49,7 +49,7 @@ you are operating from the [`docker`](docker) directory. After the initial `up` command, you can use `docker compose stop` and `docker compose start` to stop and start the service containers. -You can use [`docker compose ps`](https://docs.docker.com/engine/reference/commandline/compose_ps/) to see the state of the Mage service containers. +You can use [`docker compose ps`](https://docs.docker.com/engine/reference/commandline/compose_ps/) to see the state of the MAGE service containers. ```bash $ docker compose ps NAME COMMAND SERVICE STATUS PORTS @@ -59,10 +59,10 @@ docker-mage-server-1 "./mage.service --pl…" mage-server running You can use [`docker-compose logs `](https://docs.docker.com/engine/reference/commandline/compose_logs/) to display console logging for a service. ``` $ docker compose logs mage-server -mage-server_1 | 2018-04-26T23:30:30.684Z - info: Starting Mage Server ... +mage-server_1 | 2018-04-26T23:30:30.684Z - info: Starting MAGE Server ... mage-server_1 | 2018-04-26T23:30:31.403Z - info: setting up provision uid mage-server_1 | 2018-04-26T23:30:31.861Z - info: Using '/var/lib/mage/attachments' as base directory for feature attachments. -mage-server_1 | 2018-04-26T23:30:31.861Z - info: Using '/var/lib/mage/icons' as base directory for Mage icons. +mage-server_1 | 2018-04-26T23:30:31.861Z - info: Using '/var/lib/mage/icons' as base directory for MAGE icons. # etc., etc. ``` While the service containers are up, you can interact with them using @@ -75,7 +75,7 @@ UID PID PPID C STIME TTY TIME CMD mongodb 1 0 0 07:16 ? 00:03:47 mongod --dbpath /data/mage --logpath /var/log root 67 0 0 22:37 pts/0 00:00:00 bash root 73 67 0 22:37 pts/0 00:00:00 ps -ef -root@df8b00beafa2:/# mongo # interact directly with the running Mage database # do some ill-advised things directly to the database +root@df8b00beafa2:/# mongo # interact directly with the running MAGE database # do some ill-advised things directly to the database MongoDB shell version v3.6.3 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.6.3 @@ -112,8 +112,8 @@ users ### App Services -The Mage Server Docker app consists of three service containers: the MongoDB -database, the Mage Node.js app, and the optional nginx TLS reverse proxy. +The MAGE Server Docker app consists of three service containers: the MongoDB +database, the MAGE Node.js app, and the optional nginx TLS reverse proxy. ### MongoDB @@ -121,13 +121,13 @@ The MongoDB image is the official MongoDB image available from [Docker Hub](http file builds that image unmodified, but uses a custom command to launch MongoDB with specific settings. The Compose file runs MongoDB as the service `mage-db`. -### Mage server +### MAGE server The Compose file references a custom, local [Dockerfile](server/Dockerfile) based on the official [Node.js](https://hub.docker.com/_/node/) -image to build the Mage server image. At build time, the Mage server Dockerfile -copies whatever Mage server package tarballs you supply into the Mage server +image to build the MAGE server image. At build time, the MAGE server Dockerfile +copies whatever MAGE server package tarballs you supply into the MAGE server image, which might not match the default version the Compose currently defines. -If you want the Mage server image that Compose builds to have a different tag, +If you want the MAGE server image that Compose builds to have a different tag, override the `MAGE_VERSION` default value in the Compose file. ```bash MAGE_VERSION=6.2.0 docker compose build diff --git a/docker/auth-idp/docker-compose.yml b/docker/auth-idp/docker-compose.yml index 78e7818a1..63b5c6569 100644 --- a/docker/auth-idp/docker-compose.yml +++ b/docker/auth-idp/docker-compose.yml @@ -26,8 +26,12 @@ services: - 389:389 - 636:636 volumes: - - ./ldapseed.ldif:/container/service/slapd/assets/config/bootstrap/ldif/custom/50-bootstrap.ldif - command: --copy-service + - type: bind + source: ./ldap/db + target: /var/lib/ldap + - type: bind + source: ./ldap/config + target: /etc/ldap/slapd.d networks: - ldap.mage.net diff --git a/web-app/admin/src/app/admin/admin-event/event-form-create/event-form-create.component.html b/docker/auth-idp/ldap/config/.gitkeep similarity index 100% rename from web-app/admin/src/app/admin/admin-event/event-form-create/event-form-create.component.html rename to docker/auth-idp/ldap/config/.gitkeep diff --git a/web-app/admin/src/app/admin/admin-event/event-form-create/event-form-create.component.scss b/docker/auth-idp/ldap/db/.gitkeep similarity index 100% rename from web-app/admin/src/app/admin/admin-event/event-form-create/event-form-create.component.scss rename to docker/auth-idp/ldap/db/.gitkeep diff --git a/docker/auth-idp/ldapseed.ldif b/docker/auth-idp/ldapseed.ldif deleted file mode 100755 index 2e78ba1f7..000000000 --- a/docker/auth-idp/ldapseed.ldif +++ /dev/null @@ -1,19 +0,0 @@ -dn: ou=Field Agents,dc=wgd,dc=com -objectClass: organizationalUnit -ou: Field Agents - -dn: uid=batman,ou=Field Agents,dc=wgd,dc=com -objectClass: inetOrgPerson -uid: batman -sn: Batman -cn: Bruce Wayne -userPassword: i heart alfred -mail: Bruce.wayne@wgd.com - -dn: uid=robin,ou=Field Agents,dc=wgd,dc=com -objectClass: inetOrgPerson -uid: robin -sn: Robin -cn: Dick Grayson -userPassword: i heart batman -mail: dick.grayson@wgd.com \ No newline at end of file diff --git a/docker/auth-idp/saml/authsources.php b/docker/auth-idp/saml/authsources.php index c36b5202d..2b91cca01 100644 --- a/docker/auth-idp/saml/authsources.php +++ b/docker/auth-idp/saml/authsources.php @@ -8,15 +8,15 @@ 'example-userpass' => array( 'exampleauth:UserPass', - 'frodo.baggins:showmerings' => array( + 'saml.user1:user1pass' => array( 'uid' => array('1'), 'eduPersonAffiliation' => array('group1'), - 'email' => 'frodo.baggins@saml.mage.test', + 'email' => 'user1@saml.mage.test', ), - 'samwise.gamgee:bringyourgardner' => array( + 'saml.user2:user2pass' => array( 'uid' => array('2'), 'eduPersonAffiliation' => array('group2'), - 'email' => 'samwise.gamgee@saml.mage.test', + 'email' => 'user2@saml.mage.test', ), ), diff --git a/docker/server/Dockerfile b/docker/server/Dockerfile index 6c94bfd49..813758f6f 100644 --- a/docker/server/Dockerfile +++ b/docker/server/Dockerfile @@ -1,13 +1,7 @@ -ARG BASE_IMAGE=node:20.11.1-slim +FROM registry1.dso.mil/ironbank/opensource/nodejs/debian/nodejs:20.11.1 -FROM $BASE_IMAGE LABEL author="NGA" -ARG SERVER_VERSION=6.5.2 -ARG ARC_VERSION=NONE -ARG SFTP_VERSION=NONE -ARG MSI_VERSION=NONE - USER root RUN apt-get update @@ -21,11 +15,12 @@ USER mage ENV MAGE_HOME=/home/mage/instance WORKDIR ${MAGE_HOME} RUN ls -l \ - && npm i --omit dev @ngageoint/mage.service@${SERVER_VERSION} \ - && npm i --omit dev @ngageoint/mage.web-app@${SERVER_VERSION} \ - && if [ "$ARC_VERSION" != "NONE" ]; then npm i --omit dev --legacy-peer-deps @ngageoint/mage.arcgis.service@${ARC_VERSION} @ngageoint/mage.arcgis.web-app@${ARC_VERSION}; fi\ - && if [ "$SFTP_VERSION" != "NONE" ]; then npm i --omit dev --legacy-peer-deps @ngageoint/mage.sftp.service@${SFTP_VERSION} @ngageoint/mage.sftp.web@${SFTP_VERSION}; fi \ - && if [ "$MSI_VERSION" != "NONE" ]; then npm i --omit dev --legacy-peer-deps @ngageoint/mage.nga-msi@${MSI_VERSION}; fi \ + && npm i --omit dev @ngageoint/mage.service@6.3.0 \ + && npm i --omit dev @ngageoint/mage.web-app@6.3.0 \ + && npm i --omit dev @ngageoint/mage.arcgis.service@1.0.0-beta.2 \ + && npm i --omit dev @ngageoint/mage.arcgis.web-app@1.0.0-beta.2 \ + && npm i --omit dev @ngageoint/mage.sftp.service@1.0.0-beta.2 \ + && npm i --omit dev @ngageoint/mage.sftp.web@1.0.0-beta.2 \ && ln -s ./node_modules/.bin/mage.service VOLUME /var/lib/mage @@ -34,6 +29,5 @@ EXPOSE 4242 ENTRYPOINT [ "./mage.service", \ "--plugin", "@ngageoint/mage.arcgis.service", \ "--plugin", "@ngageoint/mage.sftp.service", \ - "--plugin", "@ngageoint/mage.nga-msi", \ "--web-plugin", "@ngageoint/mage.arcgis.web-app", \ "--web-plugin", "@ngageoint/mage.sftp.web"] diff --git a/docs/admin/auth.md b/docs/admin/auth.md index 62fef667a..527685372 100644 --- a/docs/admin/auth.md +++ b/docs/admin/auth.md @@ -1,7 +1,7 @@ -# Mage Authentication and Identity Providers +# MAGE Authentication and Identity Providers To configure authentication settings and identity providers -1. Click the gear icon in the upper right of the Mage web app to load the _Admin_ page. +1. Click the gear icon in the upper right of the MAGE web app to load the _Admin_ page. 1. Click, the _Settings_ tab in the tab strip on the left of the page. 1. Click the _Authentication_ tab near the top of the main content pane. This tab should be selected by default. 1. Click any of the accordion headings to expand the section for the authentication you want to configure, or @@ -11,13 +11,13 @@ To configure authentication settings and identity providers ## OAuth 2.0 -Here is an example of using Google's OAuth 2.0 [endpoints](https://developers.google.com/identity/gsi/web/guides/overview) to authenticate Mage +Here is an example of using Google's OAuth 2.0 [endpoints](https://developers.google.com/identity/gsi/web/guides/overview) to authenticate MAGE users. This setup is very similar to Google OpenID Connect authentication. Obtain your _Client Identifier_ and _Client Secret_ from Google's [API Console](https://console.cloud.google.com/apis/credentials/oauthclient). Additionally on that page, ensure you register the correct callback URL, e.g., `https://mage.example.com/auth/oauth/callback` -On the Mage Admin page, click the _Settings_ tab. +On the MAGE Admin page, click the _Settings_ tab. _Authorization URL_ - `https://accounts.google.com/o/oauth2/v2/auth` _Token URL_ - `https://oauth2.googleapis.com/token` @@ -30,7 +30,7 @@ _Display Name Property_ - `name` ## LDAP -You can setup Mage to authenticate users with an LDAP server. For development +You can setup MAGE to authenticate users with an LDAP server. For development testing, the [`auth-idp`](../docker/auth-idp/docker-compose.yml) Compose file uses the [osixia/openldap](https://github.com/osixia/docker-openldap) and [osixia/phpLDAPAdmin](https://github.com/osixia/docker-phpLDAPAdmin) images @@ -46,11 +46,7 @@ Click the _Login_ link on the left pane. The root user name and password for the LDAP server are `cn=admin,dc=wgd,dc=com` and `i found something`, respectively. -The docker/docker-compose.yml file starts up the mage-idp-ldap container with the ldapseed.ldiff file. -This file will seed the ldap server with a batman and robin user under the Field Agents org. Below are steps to do the same -using the phpLDAPAdmin UI should any more users need to be generated. - -Using the phpLDAPAdmin UI to setup a simple group structure. +You can then use the phpLDAPAdmin UI to setup a simple group structure. 1. Click the _dc=wgd,dc=com_ root node in the tree view on the left of the page. 1. In the main pane, click _Create a child entry_. 1. Select the _Generic: Posix Group_ template. @@ -79,11 +75,13 @@ Using the phpLDAPAdmin UI to setup a simple group structure. You now have a simple group structure and user account in your LDAP database. Now that you have an LDAP database with a user account, you can configure LDAP -authentication in Mage. This assumes you're running a Mage server on +authentication in MAGE. This assumes you're running a MAGE server on http://localhost:4242. -1. Open the Mage web app in your browser. +1. Open the MAGE web app in your browser. 1. Click the gear icon in the top right to load the _Admin_ page. -1. Click the _Security_ tab in the vertical tab strip on the left. +1. Click the _Settings_ tab in the vertical tab strip on the left. +1. The _Authentication_ tab in the main pane should already be active. Click + the tab if not. 1. Click the _New Authentication_ button. 1. Enter a title for the authentication IDP, e.g. `Test LDAP`. 1. Click the _Next_ button. @@ -102,13 +100,13 @@ http://localhost:4242. | _Search Filter_ | `(uid={{username}})` | | _Search Scope_ | `one` | | **_Advanced_** | - | _Profile ID Property_ | `uid` | + | _Profile ID Property_ | `uid | | _Display Name Property_ | `cn` | 1. Click the _Next_ button. 1. Adjust the color settings to your preference. 1. Click the _Next_ button. 1. Review the settings and click the _Save_ button. -1. Open a new private browser tab or window and load your Mage server web app. +1. Open a new private browser tab or window and load your MAGE server web app. 1. The sign-in page should display a button labeled _SIGN IN WITH LOCAL LDAP_ under two text fields. 1. In the _Local LDAP Username_ text field, enter `batman`. @@ -116,7 +114,7 @@ http://localhost:4242. 1. Click the _SIGN IN WITH LOCAL LDAP_ button. 1. The page will most likely display a dialog that states the account needs admin approval. -1. In the browser tab with your Mage admin page, click the _Users_ tab in the +1. In the browser tab with your MAGE admin page, click the _Users_ tab in the tab strip on the left. 1. Click the _Inactive_ search facet near the top left of the main pane. The user list should contain the _Batman_ user with a green _Activate_ button. @@ -128,50 +126,3 @@ http://localhost:4242. 1. The app may prompt for a device UID if your settings dictate. Enter the device UID. 1. You are now authenticated with your LDAP account. - -## SAML -You can setup Mage to authenticate users with an SAML server. For development -testing, the [`auth-idp`](../docker/auth-idp/docker-compose.yml) Compose file -uses the [kristophjunge/test-saml-idp](https://github.com/kristophjunge/docker-test-saml-idp) -Start the `mage-idp-saml` SAML -service with the following commands. -```bash -cd docker/auth-idp -docker compose up -d mage-idp-saml -``` - -The docker compose file is set to seed a few users with the .saml/authsources.php file. This -file is mounted under volumes in the docker compose. Once it is spun up, you are ready to -configure your saml authentication provider. - -1. Open the Mage web app in your browser. -1. Click the gear icon in the top right to load the _Admin_ page. -1. Click the _Security_ tab in the vertical tab strip on the left. -1. Click the _New Authentication_ button. -1. Enter a title for the authentication IDP, e.g. `Test SAML`. -1. Click the _Next_ button. -1. Fill in the _Settings_ fields as follows. - | | | - | ---: | ---| - | **_Idepntity Provider (idP)_** | - | _Entry Point_ | `http://localhost:8080/simplesaml/saml2/idp/SSOService.php` | - | _Issuer_ | `http://localhost:4242` | - | _Redirect Host_ | `http://localhost:4242/auth/saml/callback` | - | **_Security_** | - | _idP Public Signing Certificate_ | navigate to http://localhost:8080/simplesaml/saml2/idp/metadata.php. look for the tag and copy everything in that tag | - | **_Validation_** | - | **_Issuer_** | - | _idP Issuer_ | `http://localhost:8080/simplesaml/saml2/idp/metadata.php` | - | **_Logout_** | - | _logout URL_ | `http://localhost:8080/simplesaml/saml2/idp/SingleLogoutService.php` | -1. Click the _Next_ button. -1. Adjust the color settings to your preference. -1. Click the _Next_ button. -1. Review the settings and click the _Save_ button. -1. Open a new private browser tab or window and load your Mage server web app. -1. The sign-in page should display a button labeled _Continue with SAML_ -1. Clicking this button will take you to a simple login page where the saml server is running. -1. for Username enter `saml.user1` -1. for Pasword enter `user2pass` -1. Depending on how the login was configured, you will either be redirected through to the application, or - a user will have been created which will require approval from an admin. \ No newline at end of file diff --git a/docs/domain.md b/docs/domain.md index 2a06481cc..8b647c36c 100644 --- a/docs/domain.md +++ b/docs/domain.md @@ -1,15 +1,15 @@ -# Mage Application Domain +# MAGE Application Domain ## Goals ### Situational Awareness -The primary goal of Mage is to facilitate situational awareness for teams during an event or coordinated operation. Mage enables event participants in the field to capture geotagged, timestamped data, called observations, about subjects of interest. As field users capture and submit observations, Mage immediately shares them with all other event participants. To make data capture easy and accurate, Mage provides customizable data entry forms with fields to describe subjects relevant to a particular customer's domain. To enrich the custom form data, users can attach media, including photos, videos, and audio, using mobile devices and immediately share the data with other event participants. Mage includes an optional to track and report the locations of event participants using mobile devices in the field so all participants can know each other's current location. Mage displays the observations and locations of all participants on a map on the participants' mobile devices. Non-field participants, such as administrators, event coordinators, or monitors, can also view the observations and locations of participants on a map using a desktop computer or laptop. Users can use this desktop view as a dashboard that displays event observations and locations as they change. Event participants can also use the dashboard to create or modify observations as they occur or later during analysis. +The primary goal of MAGE is to facilitate situational awareness for teams during an event or coordinated operation. MAGE enables event participants in the field to capture geotagged, timestamped data, called observations, about subjects of interest. As field users capture and submit observations, MAGE immediately shares them with all other event participants. To make data capture easy and accurate, MAGE provides customizable data entry forms with fields to describe subjects relevant to a particular customer's domain. To enrich the custom form data, users can attach media, including photos, videos, and audio, using mobile devices and immediately share the data with other event participants. MAGE includes an optional to track and report the locations of event participants using mobile devices in the field so all participants can know each other's current location. MAGE displays the observations and locations of all participants on a map on the participants' mobile devices. Non-field participants, such as administrators, event coordinators, or monitors, can also view the observations and locations of participants on a map using a desktop computer or laptop. Users can use this desktop view as a dashboard that displays event observations and locations as they change. Event participants can also use the dashboard to create or modify observations as they occur or later during analysis. ### Disconnected Data Collection -Another goal of Mage is to enable field users without connectivity to continue collecting data on a mobile device, then automatically synchronize the collected data when connectivity is again available. In some situations, field users may even deliberately disable their mobile device's connectivity as an operational security measure to avoid connecting to distrusted or potentially hostile networks. While this may not directly support near real-time situational awareness, disconnected data collection is important for the ability to collect and analyze data to support near or long term customer-specific business decisions. +Another goal of MAGE is to enable field users without connectivity to continue collecting data on a mobile device, then automatically synchronize the collected data when connectivity is again available. In some situations, field users may even deliberately disable their mobile device's connectivity as an operational security measure to avoid connecting to distrusted or potentially hostile networks. While this may not directly support near real-time situational awareness, disconnected data collection is important for the ability to collect and analyze data to support near or long term customer-specific business decisions. ### Analysis and Decision Support -Of course, because Mage collects and stores data structured for specific customer domains, a natural goal that follows is to make that data available for analysis to support customer business decisions. While Mage does not focus on providing analysis tools as core functionality, Mage provides functionality to export data in standard formats that other analysis tools can consume, such as QGIS, ESRI, and Google Earth. Additionally, Mage's extensibility allows for the development of plugins and tools that support processing and analysis to derive further value for customers. +Of course, because MAGE collects and stores data structured for specific customer domains, a natural goal that follows is to make that data available for analysis to support customer business decisions. While MAGE does not focus on providing analysis tools as core functionality, MAGE provides functionality to export data in standard formats that other analysis tools can consume, such as QGIS, ESRI, and Google Earth. Additionally, MAGE's extensibility allows for the development of plugins and tools that support processing and analysis to derive further value for customers. ### Security @@ -32,13 +32,13 @@ Of course, because Mage collects and stores data structured for specific custome ### Layers ### Offline Maps -The Mage mobile app allows users to load and view offline geospatial data. The Mage mobile app downloads and saves observations and locations from other participants of the same event when the device has connectivity. When a field user's device loses connectivity, the app will still have the local cache of downloaded observations and locations to reference on the map. Additionally, field users can download relevant data from other sources to their mobile devices and use Mage to load the data to view on the Mage map. Mage primarily leverages the standard [GeoPackage](http://www.geopackage.org/) format to manage offline map data. These capabilities enhance and support Mage users' ability to perform disconnected data collection. +The MAGE mobile app allows users to load and view offline geospatial data. The MAGE mobile app downloads and saves observations and locations from other participants of the same event when the device has connectivity. When a field user's device loses connectivity, the app will still have the local cache of downloaded observations and locations to reference on the map. Additionally, field users can download relevant data from other sources to their mobile devices and use MAGE to load the data to view on the MAGE map. MAGE primarily leverages the standard [GeoPackage](http://www.geopackage.org/) format to manage offline map data. These capabilities enhance and support MAGE users' ability to perform disconnected data collection. ### Feeds Feeds are supplemental data sets that participants can add to their active event context. An event participant can select feeds to add from a list of feeds that an administrator has made available to the event. Feed content could have any combination of spatial, temporal, or informational dimensions. A participant can view the content of a feed in a list view and on the map as appropriate. Feeds enhance situational awareness by adding timely information relevant to a customer's domain and/or particular event. #### Background -Many Mage customers have enterprise data sources available to them that are relevant to their particular mission domain and can aid field users. For example, a disaster response team responding to an earthquake may desire to receive continuous updates about seismic activity in their operating area, including alerts and locations of detected tremors. That data would originate from a service external to Mage, but would be highly useful to incorporate directly in the responders' Mage user experience. The responder could then view the data without switching to another app, as well as see that data in the same context as their team's Mage observations and team member locations. +Many MAGE customers have enterprise data sources available to them that are relevant to their particular mission domain and can aid field users. For example, a disaster response team responding to an earthquake may desire to receive continuous updates about seismic activity in their operating area, including alerts and locations of detected tremors. That data would originate from a service external to MAGE, but would be highly useful to incorporate directly in the responders' MAGE user experience. The responder could then view the data without switching to another app, as well as see that data in the same context as their team's MAGE observations and team member locations. ### Tracking @@ -48,7 +48,7 @@ Many Mage customers have enterprise data sources available to them that are rele A feature represents a physical object or occurrence that has spatial and/or temporal attributes. A spatial attribute is the geographic location and shape of a feature and includes single points, (e.g. latitude and longitude), and geographic geometry structures such as lines and polygon shapes. A temporal attribute could be a single instantaneous timestamp (e.g., 1 January 2020 at 10:35:40.555 AM) or a temporal duration (e.g., 2020-01-01 through 2020-01-31). See **feature** from https://www.ogc.org/ogc/glossary/f. #### GeoJSON Note -[GeoJSON](https://geojson.org) overloads the term [`feature`](https://tools.ietf.org/html/rfc7946#section-3.2) to mean any JSON data record that complies with the GeoJSON specification's `Feature` definition. While the Mage `feature` term refers to a physical object or occurrence in the real world, a GeoJSON `Feature` object is a data record, and several GeoJSON `Feature` objects could be describing a single real-world `feature`. For example, one GeoJSON `Feature` object could describe a building using a single point geometry, and another GeoJSON object could describe the same building using a polygon geometry to describe the shape of the building's footprint. +[GeoJSON](https://geojson.org) overloads the term [`feature`](https://tools.ietf.org/html/rfc7946#section-3.2) to mean any JSON data record that complies with the GeoJSON specification's `Feature` definition. While the MAGE `feature` term refers to a physical object or occurrence in the real world, a GeoJSON `Feature` object is a data record, and several GeoJSON `Feature` objects could be describing a single real-world `feature`. For example, one GeoJSON `Feature` object could describe a building using a single point geometry, and another GeoJSON object could describe the same building using a polygon geometry to describe the shape of the building's footprint. ### Observation An observation is a discrete data record a user creates to describe a subject, including structured form data and attached media such as photos, videos, and audio. An observation is itself a `feature` because it has intrinsic attributes of the location and time the user created the observation. @@ -92,7 +92,7 @@ The field refers to the place where mobile device users can observe and collect A field user is a human user collecting data in the field with a mobile device. ### Event -An event is a scope to manage users, the data they collect, and the data they are allowed to see. A customer can assign its Mage users to an event. The observations those users create while participating in the event will only be available to other users participating in the event. All observations exist within the scope of an event. Similarly, the reported locations of users participating in an event are only visible to other users participating in the same event. A customer also assigns forms to an event, so the types of observations the participants can create are based on the forms assigned to the event. +An event is a scope to manage users, the data they collect, and the data they are allowed to see. A customer can assign its MAGE users to an event. The observations those users create while participating in the event will only be available to other users participating in the event. All observations exist within the scope of an event. Similarly, the reported locations of users participating in an event are only visible to other users participating in the same event. A customer also assigns forms to an event, so the types of observations the participants can create are based on the forms assigned to the event. An event defines the observation data participants can submit. Events may define one or more forms into which participants enter observation data about a subject. Each form defines one or more form fields of varying types into which a participant enters a data value of the field's type, such as a date, text, number, email, etc. An event may impose validation rules on submitted observations, such as minimum and/or maximum number of entries for a given form. Form fields may impose validation rules on individual data values, such as required vs. optional, minimum and/or maximum numeric values, text input patterns, or allowed attachment media types. @@ -128,14 +128,14 @@ Connectivity refers to the ability of a mobile device to send and receive data o ## Feeds Terms ### Feed -A feed is a stream of some type of content that users can fetch to supplement and enhance their situational awareness while using Mage. An administrator makes feeds available to participants. +A feed is a stream of some type of content that users can fetch to supplement and enhance their situational awareness while using MAGE. An administrator makes feeds available to participants. #### Examples A feed could produce a stream of weather alerts from the National Weather Service. Some of the more well-known instances of feeds come from social networks like Twitter and Facebook, which publish content as continuously updating feeds of distinct messages, articles, and media. -An Open Geospatial Consortium (OGC) [API - Features](http://www.opengis.net/doc/IS/ogcapi-features-1/1.0) service (OAF) can provide feed content in the form of collections geospatial features with attributes and geometries that Mage can present on a map and in a list. +An Open Geospatial Consortium (OGC) [API - Features](http://www.opengis.net/doc/IS/ogcapi-features-1/1.0) service (OAF) can provide feed content in the form of collections geospatial features with attributes and geometries that MAGE can present on a map and in a list. ### Topic A topic establishes the general subject and type of content that appears in feeds derived from the topic. An administrator defines a feed from a topic by configuring appropriate parameters to fetch content from the topic. @@ -151,12 +151,12 @@ In the case of an OAF provider, the feature collections the service provides are A feed service provides one or more topics and publishes content to the topics. A feed service provides the means to connect remotely and fetch new content from topics. Most often in practice, a feed service is a web service accessible by HTTP over the internet. ### Feed Service Type -A feed service type defines the interface for fetching content from a feed service. The feed service type is a plugin component that the Mage application uses to fetch and transform content from feed services conforming to the interface the feed service type represents. +A feed service type defines the interface for fetching content from a feed service. The feed service type is a plugin component that the MAGE application uses to fetch and transform content from feed services conforming to the interface the feed service type represents. #### Examples Twitter defines its own web-based service application programming interface (API) that consumers can use to fetch Twitter data. -An OAF service conforms to the OAF standard interface with well defined operations and parameters for fetching data. An OAF service type plugin could then integrate any feed service that conforms to the OAF standard with no additional changes to the Mage application code. +An OAF service conforms to the OAF standard interface with well defined operations and parameters for fetching data. An OAF service type plugin could then integrate any feed service that conforms to the OAF standard with no additional changes to the MAGE application code. ### Content ### Content Type diff --git a/docs/use_cases/feeds.md b/docs/use_cases/feeds.md index 391dacdbf..14c4e7bf6 100644 --- a/docs/use_cases/feeds.md +++ b/docs/use_cases/feeds.md @@ -3,15 +3,15 @@ See the [Feeds section](../domain.md#feeds) in the domain document for a summary of the feeds concept. ## Notes -Some feeds may contain sensitive content and require some kind of authentication and authorization. Sometimes this could even require clients to authenticate and fetch data directly from a feed endpoint, excluding the Mage server, to support customer security requirements. +Some feeds may contain sensitive content and require some kind of authentication and authorization. Sometimes this could even require clients to authenticate and fetch data directly from a feed endpoint, excluding the MAGE server, to support customer security requirements. -Feeds could be made available globally to all users of a particular Mage instance, or restricted based on event membership, or perhaps even restricted to specific users. +Feeds could be made available globally to all users of a particular MAGE instance, or restricted based on event membership, or perhaps even restricted to specific users. Only administrators and event managers should have permission to create a feed and assign a feed to an event. Event managers may only be able to create certain types of feeds and only assign feeds to events they manage, while administrators can create any type of feed and assign feeds to any event. A single feed could be assigned to multiple events. -A feed implementation should be a plugin that can be deployed alongside core Mage. The feed plugin would implement an adapter interface that can fetch data from the feed service and transform the data to a format Mage can present to the user. A feed plugin could provide multiple feeds from a single source. For example, an external service could provide several different data sets from a single API, such as NGA's Maritime Safety Information [ReST API](https://msi.nga.mil/api/swagger-ui.html). A single plugin may also be able to communicate to many different sources, for example an RSS/GeoRSS/Atom feed plugin, or an OGC WFS plugin would be able to fetch data from any service implementing those specifications. A feed plugin should register its feed implementations with core Mage to make those implementations available for administrators to configure. +A feed implementation should be a plugin that can be deployed alongside core MAGE. The feed plugin would implement an adapter interface that can fetch data from the feed service and transform the data to a format MAGE can present to the user. A feed plugin could provide multiple feeds from a single source. For example, an external service could provide several different data sets from a single API, such as NGA's Maritime Safety Information [ReST API](https://msi.nga.mil/api/swagger-ui.html). A single plugin may also be able to communicate to many different sources, for example an RSS/GeoRSS/Atom feed plugin, or an OGC WFS plugin would be able to fetch data from any service implementing those specifications. A feed plugin should register its feed implementations with core MAGE to make those implementations available for administrators to configure. ## Scenarios diff --git a/instance/CODEOWNERS b/instance/CODEOWNERS deleted file mode 100644 index bda418f4b..000000000 --- a/instance/CODEOWNERS +++ /dev/null @@ -1 +0,0 @@ -* @ngageoint/mage \ No newline at end of file diff --git a/instance/config.js b/instance/config.js index cdda9cc5d..fdc7ce8d2 100644 --- a/instance/config.js +++ b/instance/config.js @@ -36,8 +36,7 @@ module.exports = { plugins: { servicePlugins: [ '@ngageoint/mage.arcgis.service', - '@ngageoint/mage.sftp.service', - '@ngageoint/mage.nga-msi' + '@ngageoint/mage.sftp.service' ], webUIPlugins: [ '@ngageoint/mage.arcgis.web-app', diff --git a/instance/package.json b/instance/package.json index 557ec5fb8..eba760161 100644 --- a/instance/package.json +++ b/instance/package.json @@ -1,7 +1,7 @@ { "name": "@ngageoint/mage.dev-instance", - "version": "6.5.5", - "description": "Assemble a Mage Server deployment from the core service, the web-app, and selected plugins. This is primarily a development tool because the dependencies point to relative directories instead of production packages. This can however serve as a starting point to create a production Mage instance package.json.", + "version": "6.3.0", + "description": "Assemble a MAGE Server deployment from the core service, the web-app, and selected plugins. This is primarily a development tool because the dependencies point to relative directories instead of production packages. This can however serve as a starting point to create a production MAGE instance package.json.", "scripts": { "start": "npm run start:dev", "start:dev": "NODE_PATH=./node_modules node ./node_modules/.bin/mage.service -C config.js", @@ -28,7 +28,6 @@ "@ngageoint/mage.arcgis.web-app": "../plugins/arcgis/web-app/dist/main", "@ngageoint/mage.sftp.web": "../plugins/sftp/web/dist/main", "@ngageoint/mage.sftp.service": "../plugins/sftp/service", - "@ngageoint/mage.nga-msi": "../plugins/nga-msi", "@ngageoint/mage.service": "../service", "@ngageoint/mage.web-app": "../web-app/dist" } diff --git a/localseed.ldif b/localseed.ldif deleted file mode 100755 index 16b272502..000000000 --- a/localseed.ldif +++ /dev/null @@ -1,19 +0,0 @@ -dn: ou=users,dc=shire,dc=com -objectClass: organizationalUnit -ou: users - -dn: uid=frodob,ou=users,dc=shire,dc=com -objectClass: inetOrgPerson -uid: frodob -sn: Baggins -cn: Frodo Baggins -userPassword: P@$$Word1234!@#$ -mail: frodo.baggins@shire.com - -dn: uid=sammyg,ou=users,dc=shire,dc=com -objectClass: inetOrgPerson -uid: sammyg -sn: Gamgee -cn: Samwise Gamgee -userPassword: P@$$Word!@#$1234 -mail: damwise.gamgee@shire.com \ No newline at end of file diff --git a/mongo-ssl-x509/README.md b/mongo-ssl-x509/README.md index 7f76de356..df66d16cd 100644 --- a/mongo-ssl-x509/README.md +++ b/mongo-ssl-x509/README.md @@ -1,3 +1,3 @@ # MongoDB 2-Way SSL/x509 Role-Based Access Control ## WARNING -Do not use the certificates and keys in this directory in a production system. These are for demonstration and testing purposes only. If you wish to setup Mage and MongoDB to use 2-way SSL this way, **YOU MUST GENERATE YOUR OWN KEYS AND CERTIFICATES!** All of these keys are unencrypted and publicly available on Github, and using them would make your system vulnerable to attack. +Do not use the certificates and keys in this directory in a production system. These are for demonstration and testing purposes only. If you wish to setup MAGE and MongoDB to use 2-way SSL this way, **YOU MUST GENERATE YOUR OWN KEYS AND CERTIFICATES!** All of these keys are unencrypted and publicly available on Github, and using them would make your system vulnerable to attack. diff --git a/package-lock.json b/package-lock.json index 8a0ed2a01..6d647108a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,44 +1,22 @@ { "name": "@ngageoint/mage.project", - "version": "6.5.5", + "version": "6.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ngageoint/mage.project", - "version": "6.5.5", + "version": "6.3.0", "hasInstallScript": true, - "dependencies": { - "p-limit": "^7.1.1" - }, "devDependencies": { - "@types/angular-ui-router": "^1.1.44", "npm-run-all": "4.1.5" } }, - "node_modules/@types/angular": { - "version": "1.8.9", - "resolved": "https://registry.npmjs.org/@types/angular/-/angular-1.8.9.tgz", - "integrity": "sha512-Z0HukqZkx0fotsV3QO00yqU9NzcQI+tMcrum+8MvfB4ePqCawZctF/gz6QiuII+T1ax+LitNoPx/eICTgnF4sg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/angular-ui-router": { - "version": "1.1.44", - "resolved": "https://registry.npmjs.org/@types/angular-ui-router/-/angular-ui-router-1.1.44.tgz", - "integrity": "sha512-mUAyKcaj4cTELw5ohSI0hs3hu+yVLDoPPkPZL48xflCVfTK/ch7gczA6gCoa6M50GOflAb/mN0/Sjaq+uoSS2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/angular": "*" - } - }, "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -47,14 +25,13 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -64,19 +41,19 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, - "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", + "call-bind": "^1.0.5", "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -85,22 +62,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, - "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -115,62 +81,29 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -184,7 +117,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -199,7 +131,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -208,22 +139,19 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, - "license": "MIT", "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -235,66 +163,11 @@ "node": ">=4.8" } }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -312,7 +185,6 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, - "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -325,92 +197,62 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "version": "1.22.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", + "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", "dev": true, - "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -420,11 +262,13 @@ } }, "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, - "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, "engines": { "node": ">= 0.4" } @@ -434,50 +278,33 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, "engines": { "node": ">= 0.4" } }, "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, - "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", + "get-intrinsic": "^1.2.4", "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, - "license": "MIT", "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -491,25 +318,17 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, - "license": "MIT", "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "is-callable": "^1.1.3" } }, "node_modules/function-bind": { @@ -517,24 +336,20 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -548,38 +363,21 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -588,30 +386,15 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", + "call-bind": "^1.0.5", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -621,14 +404,12 @@ } }, "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, - "license": "MIT", "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" + "define-properties": "^1.1.3" }, "engines": { "node": ">= 0.4" @@ -638,13 +419,12 @@ } }, "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "get-intrinsic": "^1.1.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -654,18 +434,13 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -675,7 +450,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -685,7 +459,6 @@ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -694,14 +467,10 @@ } }, "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, "engines": { "node": ">= 0.4" }, @@ -710,11 +479,10 @@ } }, "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -727,7 +495,6 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, - "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -739,11 +506,10 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", "dev": true, - "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -755,34 +521,30 @@ "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" + "hasown": "^2.0.0", + "side-channel": "^1.0.4" }, "engines": { "node": ">= 0.4" } }, "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -795,54 +557,28 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "dev": true }, "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, - "license": "MIT", "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "has-bigints": "^1.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -856,7 +592,6 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -865,98 +600,25 @@ } }, "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, - "license": "MIT", "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" + "has-tostringtag": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -969,7 +631,6 @@ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -978,14 +639,12 @@ } }, "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -995,30 +654,14 @@ } }, "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1027,13 +670,12 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" + "call-bind": "^1.0.7" }, "engines": { "node": ">= 0.4" @@ -1043,14 +685,12 @@ } }, "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -1060,15 +700,12 @@ } }, "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" + "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -1078,13 +715,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, - "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.16" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -1093,47 +729,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1143,29 +745,25 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", @@ -1176,16 +774,6 @@ "node": ">=4" } }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -1200,7 +788,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1212,15 +799,13 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -1233,7 +818,6 @@ "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "chalk": "^2.4.1", @@ -1255,14 +839,10 @@ } }, "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1272,23 +852,19 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bind": "^1.0.5", "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { @@ -1298,45 +874,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/p-limit": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.2.0.tgz", - "integrity": "sha512-ATHLtwoTNDloHRFFxFJdHnG6n2WUeFjaR8XQMFdKIv0xkXjrER8/iG9iu265jOM95zXHAfv9oTkqhrfbIzosrQ==", - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.2.1" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, - "license": "MIT", "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -1350,7 +892,6 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -1359,15 +900,13 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, - "license": "MIT", "dependencies": { "pify": "^3.0.0" }, @@ -1380,7 +919,6 @@ "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", "dev": true, - "license": "MIT", "bin": { "pidtree": "bin/pidtree.js" }, @@ -1393,17 +931,15 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -1413,7 +949,6 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "dev": true, - "license": "MIT", "dependencies": { "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", @@ -1423,42 +958,16 @@ "node": ">=4" } }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", + "call-bind": "^1.0.6", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -1468,37 +977,31 @@ } }, "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, - "license": "MIT", "dependencies": { - "is-core-module": "^2.16.1", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, "engines": { @@ -1508,33 +1011,15 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", + "call-bind": "^1.0.6", "es-errors": "^1.3.0", - "is-regex": "^1.2.1" + "is-regex": "^1.1.4" }, "engines": { "node": ">= 0.4" @@ -1548,24 +1033,22 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver" } }, "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", "dev": true, - "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", + "define-data-property": "^1.1.2", "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", + "get-intrinsic": "^1.2.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" + "has-property-descriptors": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -1576,7 +1059,6 @@ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, - "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -1587,27 +1069,11 @@ "node": ">= 0.4" } }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, - "license": "MIT", "dependencies": { "shebang-regex": "^1.0.0" }, @@ -1620,92 +1086,29 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, - "license": "MIT", "dependencies": { + "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" }, "engines": { "node": ">= 0.4" @@ -1719,7 +1122,6 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -1729,52 +1131,33 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" + "dev": true }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, - "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-license-ids": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", - "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", + "dev": true }, "node_modules/string.prototype.padend": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", - "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz", + "integrity": "sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -1784,19 +1167,14 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -1806,37 +1184,28 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1847,7 +1216,6 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -1857,7 +1225,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -1870,7 +1237,6 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1879,32 +1245,30 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", + "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -1914,19 +1278,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, - "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -1936,18 +1298,17 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", + "has-proto": "^1.0.3", "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" + "possible-typed-array-names": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -1957,19 +1318,15 @@ } }, "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", + "call-bind": "^1.0.2", "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1980,7 +1337,6 @@ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, - "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -1991,7 +1347,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -2000,86 +1355,32 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, - "license": "MIT", "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", "dev": true, - "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -2087,18 +1388,6 @@ "funding": { "url": "https://github.com/sponsors/ljharb" } - }, - "node_modules/yocto-queue": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", - "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } } } } \ No newline at end of file diff --git a/package.json b/package.json index 12faf51c0..48446d292 100644 --- a/package.json +++ b/package.json @@ -2,13 +2,13 @@ "name": "@ngageoint/mage.project", "description": "This is the root package definition for the mage-server monorepo.", "private": true, - "version": "6.5.5", + "version": "6.3.0", "files": [], "scripts": { - "postinstall": "npm-run-all service:ci web-app:ci arcgis:ci sftp:ci nga-msi:ci", + "postinstall": "npm-run-all service:ci web-app:ci arcgis:ci sftp:ci", "install:resolve": "npm-run-all service:install web-app:install", "build": "npm-run-all service:build web-app:build instance:build", - "build-all": "npm-run-all build arcgis:build sftp:build nga-msi:build", + "build-all": "npm-run-all build arcgis:build sftp:build", "pack-all": "npm-run-all service:pack web-app:pack image.service:pack nga-msi:pack", "service:install": "npm install --prefix service", "service:ci": "npm ci --prefix service", @@ -39,17 +39,15 @@ "image.service:ci": "npm ci --prefix plugins/image/service", "image.service:build": "npm run build --prefix plugins/image/service", "image.service:pack": "npm pack ./plugins/image/service", - "nga-msi:ci": "cd plugins/nga-msi && npm ci && npm link ../../service", + "nga-msi:install": "npm install --prefix plugins/nga-msi", + "nga-msi:ci": "npm ci --prefix plugins/nga-msi", "nga-msi:build": "npm run build --prefix plugins/nga-msi", "nga-msi:pack": "npm pack ./plugins/nga-msi", "start": "npm run instance:start", "start-web": "npm run web-app:debug" }, "devDependencies": { - "@types/angular-ui-router": "^1.1.44", "npm-run-all": "4.1.5" }, - "dependencies": { - "p-limit": "^7.1.1" - } + "dependencies": {} } \ No newline at end of file diff --git a/plugins/README.md b/plugins/README.md index c9b2d1a83..2a6e7b1f3 100644 --- a/plugins/README.md +++ b/plugins/README.md @@ -1,20 +1,20 @@ -# Mage Plugins +# MAGE Plugins -The Mage server supports plugins for both the service and the web app. Both components define hooks which plugin +The MAGE server supports plugins for both the service and the web app. Both components define hooks which plugin packages can use to extend functionality. ## Service plugins -Service plugins can extend the capabilities the Mage service by adding integrations with external services or -manipulating data in the Mage database itself in some useful way. The [Image](./image/) plugin, for example, queries -the Mage database for image attachments, rotates them such that they correctly oriented with respect to EXIF meta-data, +Service plugins can extend the capabilities the MAGE service by adding integrations with external services or +manipulating data in the MAGE database itself in some useful way. The [Image](./image/) plugin, for example, queries +the MAGE database for image attachments, rotates them such that they correctly oriented with respect to EXIF meta-data, and generates smaller thumbnail versions of the photos so clients do not need to download full-size images unless the users requests them. The [NGA-MSI](./nga-msi/) plugin adds an integration with NGA's Maritime Safety Information -(MSI) web service to provide geospatial feeds of MSI data directly to Mage clients. +(MSI) web service to provide geospatial feeds of MSI data directly to MAGE clients. ### Hooks -The Mage service defines several plugin [hook APIs](../service/src/plugins.api/). A service plugin starts with the +The MAGE service defines several plugin [hook APIs](../service/src/plugins.api/). A service plugin starts with the aptly-named [`InitPluginHook`](../service/src/plugins.api/index.ts). Any service plugin must at least implement an init hook for the main service module to initialize the plugin. The init hook defines dependencies on core service components and performs any initialization tasks the plugin requires, such as database setup. Any Node module can be @@ -29,10 +29,10 @@ export = { } } ``` -To inform the Mage service that a given module is a plugin, you must list the module in the configuration you pass to +To inform the MAGE service that a given module is a plugin, you must list the module in the configuration you pass to the [`mage.service`](../service/bin/mage.service.js) script. For example, you could create a package called `@examples/mage-plugins`. Within the package you can export an `InitPluginHook` object from the root `index.js` module, -or you could export the hook object from a nested module such as `/plugin1`, or both. For the Mage service to register +or you could export the hook object from a nested module such as `/plugin1`, or both. For the MAGE service to register those plugin hooks, you would start the service with switches like ```bash npx mage.service --plugin @examples/mage-plugins @@ -43,7 +43,7 @@ npx mage.service --plugin @examples/mage-plugins --plugin @examples/mage-plugins ``` For a relatively robust example of dependency injection and initialization, see the [Image plugin's](./image/service/src/index.ts) -init hook, which injects a plugin-scoped repository to persist plugin configuration, and integrates with the Mage +init hook, which injects a plugin-scoped repository to persist plugin configuration, and integrates with the MAGE service's web layer to add plugin web routes. ### Dependency injection @@ -51,7 +51,7 @@ service's web layer to add plugin web routes. As mentioned above, a plugin's init hook defines dependencies on core service components, such as repositories that can interact with the database. During startup, the [main service module](../service/src/app.ts) injects the dependencies the plugin requests. The object a plugin module exports can include an `inject` key whose value is -another object hash whose values are injection token symbols the Mage service defines. When present, the Mage service +another object hash whose values are injection token symbols the MAGE service defines. When present, the MAGE service inspects a plugin's `inject` object and passes an object to the plugin's `init` function with the same keys as the `inject` object whose values are the components corresponding to the injection token values. For example, if a plugin module exports the following init hook @@ -67,7 +67,7 @@ export = { } } ``` -... the `injection` argument the Mage service passes to the `init` function will be an object with the shape +... the `injection` argument the MAGE service passes to the `init` function will be an object with the shape ```typescript { eventRepo: instanceOfMageEventRepository, @@ -96,7 +96,7 @@ Manually edit the `package.json` file to include a peer dependency on `@ngageoin } ``` -Then, add the Mage service package to your plugin package. The easiest way is to globally install a release package +Then, add the MAGE service package to your plugin package. The easiest way is to globally install a release package tarball from [GitHub](https://github.com/ngageoint/mage-server/releases). ```bash npm i -g https://github.com/ngageoint/mage-server/releases/download/6.2.0/ngageoint-mage.service-6.2.0.tgz @@ -111,8 +111,8 @@ $ npm ls └── @ngageoint/mage.service@6.2.0 -> ./../../../../.nvm/versions/node/v16.15.1/lib/node_modules/@ngageoint/mage.service ``` -Now, add TypeScript to take advantage type checking and code completion from the Mage service types. Ideally you'll -install the same version as the Mage service's dependency to ensure compatibility with Mage's . +Now, add TypeScript to take advantage type checking and code completion from the MAGE service types. Ideally you'll +install the same version as the MAGE service's dependency to ensure compatibility with MAGE's . ```bash npm i --save-dev typescript@^4.6.0 ``` @@ -121,10 +121,10 @@ TypeScript's `tsc` command to generate the file. ```bash npx tsc --init ``` -Alternatively, you can copy the configuration from one of the Mage server [plugin](./nga-msi/tsconfig.json) +Alternatively, you can copy the configuration from one of the MAGE server [plugin](./nga-msi/tsconfig.json) [packages](./image/service/tsconfig.json). Adjust the TypeScript configuration to your liking, but generally you may find that placing your `.ts` source files into a `src` directory, and outputting transpiled JavaScript to a separate -directory like `lib` or `dist` is a manageable arrangement. This is what the TypeScript configurations for the Mage +directory like `lib` or `dist` is a manageable arrangement. This is what the TypeScript configurations for the MAGE service and open source plugins specify. Finally, you can start writing the code for your plugin. Begin with a module file that exports the main @@ -146,7 +146,7 @@ Then you can fill in the functionality of your plugin. #### Create the plugin package -To get your plugin running in a Mage server, you'll first need a [running instance](../README.md#running-a-mage-server). +To get your plugin running in a MAGE server, you'll first need a [running instance](../README.md#running-a-mage-server). Once you've setup a server instance, you can package your plugin to add to the server instance. If you used TypeScript to code your plugin as described above, your plugin should transpile JavaScript to a directory, such as `lib`. Ensure your plugin's `package.json` defines the plugin's entry point using the `main` entry as above. You could also use @@ -161,12 +161,12 @@ an entry such as Now, from the base directory of your plugin package, run the [`npm pack`](https://docs.npmjs.com/cli/v8/commands/npm-pack) command to create a package tarball of your plugin. This will create a file like `examples-mage-service-plugins-1.0.0.tgz`. Copy the package tarball to a persistent location, like where you have [installed](../README.md#install-mage-server-packages) -the Mage server packages. +the MAGE server packages. #### Install the plugin -You install plugin packages as dependencies of your[Mage instance](../README.md#install-mage-server-packages) package, -alongside the Mage core packages. Assuming you instance package resides in a directory called `mage`, copy your plugin +You install plugin packages as dependencies of your[MAGE instance](../README.md#install-mage-server-packages) package, +alongside the MAGE core packages. Assuming you instance package resides in a directory called `mage`, copy your plugin package tarball to the `mage` directory. Then, from the `mage` directory, run the following. ``` npm install --omit dev ./examples-mage-service-plugins-1.0.0.tgz @@ -192,7 +192,7 @@ To enable your plugin, add the ID of the module that exports your `PluginInitHoo ] } ``` -3. Use a full Mage configuration object that references the plugin that exports the full configuration object: +3. Use a full MAGE configuration object that references the plugin that exports the full configuration object: ```bash mage.service -C /etc/mage.js ``` @@ -249,7 +249,7 @@ then the registered plugin module IDs will need to include your package's top-le ``` If your `package.json` includes your plugin modules as [entry points](https://nodejs.org/api/packages.html#package-entry-points) in the `exports` entry, as below, then you will not need to include the top-level directory in the module IDs. Be sure -to also include an entry point to allow the Mage service to load the `package.json` file from your plugin package. +to also include an entry point to allow the MAGE service to load the `package.json` file from your plugin package. ```json { "exports": { @@ -263,8 +263,8 @@ to also include an entry point to allow the Mage service to load the `package.js ## Web UI plugins -Mage provides a library with [Angular CLI ]() integration to help create plugin packages for the Mage web app. -Below are the basic steps to create a Mage web UI plugin. +MAGE provides a library with [Angular CLI ]() integration to help create plugin packages for the MAGE web app. +Below are the basic steps to create a MAGE web UI plugin. 1. Initialize an Angular workspace. ```bash @@ -273,11 +273,11 @@ Below are the basic steps to create a Mage web UI plugin. git init . # if you want version control npx @angular/cli@14 new --directory . --create-application false @example/mage-plugins.workspace ``` -1. Add the Mage web core library. +1. Add the MAGE web core library. ```bash npm run ng -- add @ngageoint/mage.web-core-lib ``` -1. Generate a new Mage web UI plugin library. +1. Generate a new MAGE web UI plugin library. ```bash npm run ng -- generate @ngageoint/mage.web-core-lib:plugin-library @example/mage-plugins.plugin1 ``` @@ -294,9 +294,9 @@ Below are the basic steps to create a Mage web UI plugin. ``` Take note that you must create the package from the project's output subdirectory of the `dist` directory, not from the project root like a typical Node.js project. This will create an NPM package tarball like - `example-mage-plugins.plugin1-0.0.1.tgz`, which contains the AMD module bundle that the Mage web app can load. You - can publish this tarball to NPM or install the tarball directly to your Mage instance. -1. Install your plugin to your Mage instance. + `example-mage-plugins.plugin1-0.0.1.tgz`, which contains the AMD module bundle that the MAGE web app can load. You + can publish this tarball to NPM or install the tarball directly to your MAGE instance. +1. Install your plugin to your MAGE instance. TODO: ref above diff --git a/plugins/arcgis/README.md b/plugins/arcgis/README.md index 865936113..0550ca031 100644 --- a/plugins/arcgis/README.md +++ b/plugins/arcgis/README.md @@ -1,5 +1,5 @@ # Build with arcgis plugin -> This plugin allows for Mage observation data to be passed to an Arcgis feature service. Follow the instructions in the root README. +> This plugin allows for MAGE observation data to be passed to an Arcgis feature service. Follow the instructions in the root README. ## Build ArcGIS plugin - After completing the web-app package install and build in the 'Building from source' section: diff --git a/plugins/arcgis/service/package-lock.json b/plugins/arcgis/service/package-lock.json index ce34e8463..a42a61803 100644 --- a/plugins/arcgis/service/package-lock.json +++ b/plugins/arcgis/service/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ngageoint/mage.arcgis.service", - "version": "6.5.0-beta.1", + "version": "1.0.0-beta.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ngageoint/mage.arcgis.service", - "version": "1.0.0-beta.1", + "version": "1.0.0-beta.2", "license": "Apache-2.0", "dependencies": { "@esri/arcgis-rest-feature-service": "4.1.0", @@ -28,7 +28,7 @@ "typescript-eslint": "8.29.1" }, "peerDependencies": { - "@ngageoint/mage.service": ">=6.3.0-beta.8", + "@ngageoint/mage.service": "6.3.0", "express": "4.21.2" } }, @@ -37,6 +37,7 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -50,6 +51,7 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", @@ -60,30 +62,32 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.3.tgz", + "integrity": "sha512-V42wFfx1ymFte+ecf6iXghnnP8kWTO+ZLXIyZq+1LAXHHvTZdVxicn4yiVYdYMGaCO3tmqub11AorKkv+iodqw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", - "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.3.tgz", + "integrity": "sha512-hyrN8ivxfvJ4i0fIJuV4EOlV0WDMz5Ui4StRTgVaAvWeiRCilXgwVvxJKtFQ3TKtHgJscB2YiXKGNJuVwhQMtA==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", + "@babel/generator": "^7.27.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.28.0", + "@babel/helpers": "^7.27.3", + "@babel/parser": "^7.27.3", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.0", - "@babel/types": "^7.28.0", + "@babel/traverse": "^7.27.3", + "@babel/types": "^7.27.3", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -103,20 +107,22 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", - "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.3.tgz", + "integrity": "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.0", - "@babel/types": "^7.28.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", + "@babel/parser": "^7.27.3", + "@babel/types": "^7.27.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" }, "engines": { @@ -128,6 +134,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", @@ -144,24 +151,17 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" @@ -175,6 +175,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", @@ -192,6 +193,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -201,6 +203,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -210,6 +213,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -219,30 +223,33 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.2.tgz", - "integrity": "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.3.tgz", + "integrity": "sha512-h/eKy9agOya1IGuLaZ9tEUgz+uIRXcbtOhRtUyyMf8JFmn1iT13vnl/IGVWSkdOCG/pC57U4S1jnAabAavTMwg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", - "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.3.tgz", + "integrity": "sha512-xyYxRj6+tLNDTWi0KCBcZ9V7yg3/lwL9DWh9Uwh/RIVlIfFidggcgxKX3GCXwCiswwcGRawBKbEg2LG/Y8eJhw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.28.0" + "@babel/types": "^7.27.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -256,6 +263,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -268,6 +276,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -280,6 +289,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -292,6 +302,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -307,6 +318,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -322,6 +334,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -334,6 +347,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -346,6 +360,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -361,6 +376,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -373,6 +389,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -385,6 +402,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -397,6 +415,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -409,6 +428,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -421,6 +441,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -433,6 +454,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -448,6 +470,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -463,6 +486,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -478,6 +502,7 @@ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", @@ -488,28 +513,40 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", - "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.3.tgz", + "integrity": "sha512-lId/IfN/Ye1CIu8xG7oKBHXd2iNb2aW1ilPszzGcJug6M8RCKfVNcYhpI5+bMvFYjK7lXIM0R+a+6r8xhHp2FQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.0", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.3", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.0", - "debug": "^4.3.1" + "@babel/types": "^7.27.3", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.3.tgz", + "integrity": "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" @@ -522,13 +559,15 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@es-joy/jsdoccomment": { "version": "0.49.0", "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.49.0.tgz", "integrity": "sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==", "dev": true, + "license": "MIT", "dependencies": { "comment-parser": "1.4.1", "esquery": "^1.6.0", @@ -543,6 +582,7 @@ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -561,6 +601,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -573,15 +614,17 @@ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/config-array": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.1.tgz", - "integrity": "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", @@ -592,10 +635,11 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.3.tgz", - "integrity": "sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", + "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -605,6 +649,7 @@ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -617,6 +662,7 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -640,6 +686,7 @@ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.24.0.tgz", "integrity": "sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -649,6 +696,7 @@ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -658,6 +706,7 @@ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@eslint/core": "^0.13.0", "levn": "^0.4.1" @@ -671,6 +720,7 @@ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -682,6 +732,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/@esri/arcgis-rest-feature-service/-/arcgis-rest-feature-service-4.1.0.tgz", "integrity": "sha512-XmgySXuoCTQVkBrlKiwn+vPFlp748xJv2/DLSSgTgtHPOTiSLW+tnqeQiZdl6DOHpFiI44aY2aCWFrh/PUm+tA==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.3.0" }, @@ -713,6 +764,7 @@ "version": "4.6.1", "resolved": "https://registry.npmjs.org/@esri/arcgis-rest-portal/-/arcgis-rest-portal-4.6.1.tgz", "integrity": "sha512-NQXPeJsoG0wnBIn0WKW67zCJMQ2H1o6zAE59IsXc81amQ6Jq/tIcIv9Ro5memntgzU/F1nh7iqdazNgKLiXUrQ==", + "license": "Apache-2.0", "peer": true, "dependencies": { "tslib": "^2.3.0" @@ -728,6 +780,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/@esri/arcgis-rest-request/-/arcgis-rest-request-4.3.0.tgz", "integrity": "sha512-zuYr4e1x+D7QvtmEj105PlN8lgfKsZ78XKuNNXEbi3+nMYTfCitcyC7Xu16gGAyaUeawdCNjvnAB8ZN8LwINVA==", + "license": "Apache-2.0", "dependencies": { "@esri/arcgis-rest-fetch": "^4.0.0", "@esri/arcgis-rest-form-data": "^4.0.0", @@ -743,6 +796,7 @@ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=18.18.0" } @@ -752,6 +806,7 @@ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" @@ -765,6 +820,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=18.18" }, @@ -778,6 +834,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -791,6 +848,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=18.18" }, @@ -804,6 +862,7 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -820,6 +879,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -829,6 +889,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -842,6 +903,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -855,6 +917,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -867,6 +930,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -882,6 +946,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -894,6 +959,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -903,6 +969,7 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -912,6 +979,7 @@ "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -929,6 +997,7 @@ "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", @@ -976,6 +1045,7 @@ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -991,6 +1061,7 @@ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, + "license": "MIT", "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" @@ -1004,6 +1075,7 @@ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, + "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3" }, @@ -1016,6 +1088,7 @@ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -1033,6 +1106,7 @@ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -1048,6 +1122,7 @@ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, + "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", @@ -1091,6 +1166,7 @@ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, + "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -1103,6 +1179,7 @@ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", @@ -1117,6 +1194,7 @@ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", @@ -1132,6 +1210,7 @@ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", @@ -1147,6 +1226,7 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -1173,6 +1253,7 @@ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -1186,13 +1267,18 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -1200,21 +1286,34 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", - "dev": true + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -14488,6 +14587,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -14501,6 +14601,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -14510,6 +14611,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -14523,6 +14625,7 @@ "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.2.tgz", "integrity": "sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, @@ -14534,13 +14637,15 @@ "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } @@ -14550,6 +14655,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.0" } @@ -14558,6 +14664,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/@terraformer/arcgis/-/arcgis-2.1.2.tgz", "integrity": "sha512-IvdfqehcNAUtKU1OFMKwPT8EvdKlVFZ7q7ZKzkIF8XzYZIVsZLuXuOS1UBdRh5u/o+X5Gax7jiZhD8U/4TV+Jw==", + "license": "MIT", "dependencies": { "@terraformer/common": "^2.1.2" } @@ -14565,13 +14672,15 @@ "node_modules/@terraformer/common": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@terraformer/common/-/common-2.1.2.tgz", - "integrity": "sha512-cwPdTFzIpekZhZRrgDEkqLKNPoqbyCBQHiemaovnGIeUx0Pl336MY/eCxzJ5zXkrQLVo9zPalq/vYW5HnyKevQ==" + "integrity": "sha512-cwPdTFzIpekZhZRrgDEkqLKNPoqbyCBQHiemaovnGIeUx0Pl336MY/eCxzJ5zXkrQLVo9zPalq/vYW5HnyKevQ==", + "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -14585,6 +14694,7 @@ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } @@ -14594,25 +14704,28 @@ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.28.2" + "@babel/types": "^7.20.7" } }, "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, + "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -14623,21 +14736,24 @@ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" }, "node_modules/@types/express": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -14650,6 +14766,7 @@ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -14661,34 +14778,38 @@ "version": "7946.0.16", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "dev": true + "license": "MIT" }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "dev": true + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" } @@ -14698,6 +14819,7 @@ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" } @@ -14707,6 +14829,7 @@ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", "dev": true, + "license": "MIT", "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" @@ -14716,50 +14839,56 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "license": "MIT" }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { - "version": "22.15.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.23.tgz", - "integrity": "sha512-7Ec1zaFPF4RJ0eXu1YT/xgiebqwqoJz8rYPDi/O2BcZ++Wpt0Kq9cl0eg6NN6bYbPnR67ZLo7St5Q3UK0SnARw==", + "version": "22.15.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.24.tgz", + "integrity": "sha512-w9CZGm9RDjzTh/D+hFwlBJ3ziUaVw7oufKA3vOFSOZlzmW9AkZnfjPb+DLnrV6qtgL/LNmP0/2zBNCFHL3F0ng==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~7.10.0" + "undici-types": "~6.21.0" } }, "node_modules/@types/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/send": { - "version": "0.17.5", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", - "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, + "license": "MIT", "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", - "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-errors": "*", "@types/node": "*", @@ -14770,13 +14899,15 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/yargs": { "version": "17.0.33", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, + "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -14785,13 +14916,15 @@ "version": "21.0.3", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.29.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.1.tgz", "integrity": "sha512-ba0rr4Wfvg23vERs3eB+P3lfj2E+2g3lhWcCVukUuhtcdUx5lSIFZlGFEBHKr+3zizDa/TvZTptdNHVZWAkSBg==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.29.1", @@ -14821,6 +14954,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.29.1.tgz", "integrity": "sha512-zczrHVEqEaTwh12gWBIJWj8nx+ayDcCJs06yoNMY0kwjMWDM6+kppljY+BxWI06d2Ja+h4+WdufDcwMnnMEWmg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/scope-manager": "8.29.1", "@typescript-eslint/types": "8.29.1", @@ -14845,6 +14979,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.29.1.tgz", "integrity": "sha512-2nggXGX5F3YrsGN08pw4XpMLO1Rgtnn4AzTegC2MDesv6q3QaTU5yU7IbS1tf1IwCR0Hv/1EFygLn9ms6LIpDA==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.29.1", "@typescript-eslint/visitor-keys": "8.29.1" @@ -14862,6 +14997,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.29.1.tgz", "integrity": "sha512-DkDUSDwZVCYN71xA4wzySqqcZsHKic53A4BLqmrWFFpOpNSoxX233lwGu/2135ymTCR04PoKiEEEvN1gFYg4Tw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "8.29.1", "@typescript-eslint/utils": "8.29.1", @@ -14885,6 +15021,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.1.tgz", "integrity": "sha512-VT7T1PuJF1hpYC3AGm2rCgJBjHL3nc+A/bhOp9sGMKfi5v0WufsX/sHCFBfNTx2F+zA6qBc/PD0/kLRLjdt8mQ==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -14898,6 +15035,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.1.tgz", "integrity": "sha512-l1enRoSaUkQxOQnbi0KPUtqeZkSiFlqrx9/3ns2rEDhGKfTa+88RmXqedC1zmVTOWrLc2e6DEJrTA51C9iLH5g==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.29.1", "@typescript-eslint/visitor-keys": "8.29.1", @@ -14920,10 +15058,11 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -14933,6 +15072,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -14948,6 +15088,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.29.1.tgz", "integrity": "sha512-QAkFEbytSaB8wnmB+DflhUPz6CLbFWE2SnSCrRMEa+KnXIzDYbpsn++1HGvnfAsUY44doDXmvRkO5shlM/3UfA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.29.1", @@ -14971,6 +15112,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.1.tgz", "integrity": "sha512-RGLh5CRaUEf02viP5c1Vh1cMGffQscyHe7HPAzGpfmfflFg1wUz2rYxd+OZqwpeypYvZ8UxSxuIpF++fmOzEcg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.29.1", "eslint-visitor-keys": "^4.2.0" @@ -14987,6 +15129,7 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", "peer": true, "dependencies": { "mime-types": "~2.1.34", @@ -14997,10 +15140,11 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -15013,6 +15157,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -15022,6 +15167,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -15038,6 +15184,7 @@ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -15053,6 +15200,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -15062,6 +15210,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -15077,6 +15226,7 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -15090,6 +15240,7 @@ "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" } @@ -15098,30 +15249,34 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT", "peer": true }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true + "license": "MIT" }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -15143,6 +15298,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -15159,6 +15315,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -15175,6 +15332,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -15184,6 +15342,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -15195,10 +15354,11 @@ } }, "node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -15217,7 +15377,7 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" + "@babel/core": "^7.0.0" } }, "node_modules/babel-preset-jest": { @@ -15225,6 +15385,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, + "license": "MIT", "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -15240,12 +15401,14 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/body-parser": { "version": "1.20.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", "peer": true, "dependencies": { "bytes": "3.1.2", @@ -15270,6 +15433,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "peer": true, "dependencies": { "ms": "2.0.0" @@ -15279,13 +15443,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT", "peer": true }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -15296,6 +15462,7 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -15304,9 +15471,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", + "version": "4.24.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", + "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", "dev": true, "funding": [ { @@ -15322,9 +15489,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", + "caniuse-lite": "^1.0.30001716", + "electron-to-chromium": "^1.5.149", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, @@ -15340,6 +15508,7 @@ "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, + "license": "MIT", "dependencies": { "fast-json-stable-stringify": "2.x" }, @@ -15352,6 +15521,7 @@ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "node-int64": "^0.4.0" } @@ -15360,12 +15530,14 @@ "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 + "dev": true, + "license": "MIT" }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.8" @@ -15375,6 +15547,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -15387,6 +15560,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -15404,6 +15578,7 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -15413,14 +15588,15 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001731", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz", - "integrity": "sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==", + "version": "1.0.30001718", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", + "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", "dev": true, "funding": [ { @@ -15435,13 +15611,15 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15458,6 +15636,7 @@ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } @@ -15473,6 +15652,7 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], + "license": "MIT", "engines": { "node": ">=8" } @@ -15481,13 +15661,15 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -15502,6 +15684,7 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, + "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -15511,13 +15694,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -15529,12 +15714,14 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -15547,6 +15734,7 @@ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12.0.0" } @@ -15555,12 +15743,14 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", "peer": true, "dependencies": { "safe-buffer": "5.2.1" @@ -15573,6 +15763,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.6" @@ -15582,12 +15773,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cookie": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.6" @@ -15597,6 +15790,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT", "peer": true }, "node_modules/create-jest": { @@ -15604,6 +15798,7 @@ "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -15625,6 +15820,7 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -15638,6 +15834,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", "engines": { "node": ">= 12" } @@ -15647,6 +15844,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -15664,6 +15862,7 @@ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", "dev": true, + "license": "MIT", "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, @@ -15677,13 +15876,15 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -15692,6 +15893,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -15700,6 +15902,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.8" @@ -15709,6 +15912,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.8", @@ -15720,6 +15924,7 @@ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -15729,6 +15934,7 @@ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -15737,6 +15943,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -15750,6 +15957,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT", "peer": true }, "node_modules/ejs": { @@ -15757,6 +15965,7 @@ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" }, @@ -15768,16 +15977,18 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.195", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.195.tgz", - "integrity": "sha512-URclP0iIaDUzqcAyV1v2PgduJ9N0IdXmWsnPzPfelvBmjmZzEy6xJcjb1cXj+TbYqXgtLrjHEoaSIdTYhw4ezg==", - "dev": true + "version": "1.5.159", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.159.tgz", + "integrity": "sha512-CEvHptWAMV5p6GJ0Lq8aheyvVbfzVrv5mmidu1D3pidoVNkB3tTBsTMVtPJ+rzRK5oV229mCLz9Zj/hNvU8GBA==", + "dev": true, + "license": "ISC" }, "node_modules/emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -15789,12 +16000,14 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.8" @@ -15805,6 +16018,7 @@ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -15813,6 +16027,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -15821,6 +16036,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -15829,12 +16045,14 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -15846,6 +16064,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -15861,6 +16080,7 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -15869,6 +16089,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT", "peer": true }, "node_modules/escape-string-regexp": { @@ -15876,6 +16097,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -15888,6 +16110,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.24.0.tgz", "integrity": "sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", @@ -15948,6 +16171,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.9.tgz", "integrity": "sha512-7/nHu3FWD4QRG8tCVqcv+BfFtctUtEDWc29oeDXB4bwmDM2/r1ndl14AG/2DUntdqH7qmpvdemJKwb3R97/QEw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@es-joy/jsdoccomment": "~0.49.0", "are-docs-informative": "^0.0.2", @@ -15969,10 +16193,11 @@ } }, "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -15985,10 +16210,11 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -15997,14 +16223,15 @@ } }, "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "eslint-visitor-keys": "^4.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -16018,6 +16245,7 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -16031,6 +16259,7 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -16043,6 +16272,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -16055,6 +16285,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -16064,6 +16295,7 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -16072,6 +16304,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.6" @@ -16082,6 +16315,7 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -16114,6 +16348,7 @@ "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -16129,6 +16364,7 @@ "version": "4.21.2", "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", "peer": true, "dependencies": { "accepts": "~1.3.8", @@ -16175,6 +16411,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "peer": true, "dependencies": { "ms": "2.0.0" @@ -16184,19 +16421,22 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT", "peer": true }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -16213,6 +16453,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -16224,19 +16465,22 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -16246,6 +16490,7 @@ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "bser": "2.1.1" } @@ -16264,6 +16509,7 @@ "url": "https://paypal.me/jimmywarting" } ], + "license": "MIT", "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" @@ -16276,6 +16522,7 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", "engines": { "node": ">= 8" } @@ -16285,6 +16532,7 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^4.0.0" }, @@ -16297,15 +16545,17 @@ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" } }, "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -16315,6 +16565,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -16327,6 +16578,7 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -16338,6 +16590,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", "peer": true, "dependencies": { "debug": "2.6.9", @@ -16356,6 +16609,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "peer": true, "dependencies": { "ms": "2.0.0" @@ -16365,6 +16619,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT", "peer": true }, "node_modules/find-up": { @@ -16372,6 +16627,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -16388,6 +16644,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" @@ -16400,12 +16657,14 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/form-data": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -16420,6 +16679,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "license": "MIT", "dependencies": { "node-domexception": "1.0.0", "web-streams-polyfill": "4.0.0-beta.3" @@ -16432,6 +16692,7 @@ "version": "4.0.10", "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", "dependencies": { "fetch-blob": "^3.1.2" }, @@ -16443,6 +16704,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.6" @@ -16452,6 +16714,7 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.6" @@ -16461,26 +16724,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } + "license": "ISC" }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -16490,6 +16741,7 @@ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -16499,6 +16751,7 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -16507,6 +16760,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -16531,6 +16785,7 @@ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.0.0" } @@ -16539,6 +16794,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -16552,6 +16808,7 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -16565,6 +16822,7 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -16585,6 +16843,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -16597,6 +16856,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -16608,6 +16868,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -16619,19 +16880,22 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -16640,6 +16904,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -16651,6 +16916,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -16665,6 +16931,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -16676,12 +16943,14 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", "peer": true, "dependencies": { "depd": "2.0.0", @@ -16699,6 +16968,7 @@ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } @@ -16707,6 +16977,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" @@ -16720,6 +16991,7 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -16729,6 +17001,7 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -16745,6 +17018,7 @@ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, + "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -16764,6 +17038,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -16774,6 +17049,7 @@ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -16782,12 +17058,14 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.10" @@ -16797,13 +17075,15 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -16819,6 +17099,7 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -16828,6 +17109,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -16837,6 +17119,7 @@ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -16846,6 +17129,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -16858,6 +17142,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -16867,6 +17152,7 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -16878,13 +17164,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=8" } @@ -16894,6 +17182,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", @@ -16910,6 +17199,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -16924,6 +17214,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -16938,6 +17229,7 @@ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -16947,14 +17239,16 @@ } }, "node_modules/jake": { - "version": "10.9.4", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", - "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "async": "^3.2.6", + "async": "^3.2.3", + "chalk": "^4.0.2", "filelist": "^1.0.4", - "picocolors": "^1.1.1" + "minimatch": "^3.1.2" }, "bin": { "jake": "bin/cli.js" @@ -16968,6 +17262,7 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -16994,6 +17289,7 @@ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, + "license": "MIT", "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", @@ -17008,6 +17304,7 @@ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -17039,6 +17336,7 @@ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -17072,6 +17370,7 @@ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", @@ -17117,6 +17416,7 @@ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", @@ -17132,6 +17432,7 @@ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, + "license": "MIT", "dependencies": { "detect-newline": "^3.0.0" }, @@ -17144,6 +17445,7 @@ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -17160,6 +17462,7 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -17177,6 +17480,7 @@ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -17186,6 +17490,7 @@ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -17211,6 +17516,7 @@ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, + "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" @@ -17224,6 +17530,7 @@ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -17239,6 +17546,7 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -17259,6 +17567,7 @@ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -17273,6 +17582,7 @@ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -17290,6 +17600,7 @@ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -17299,6 +17610,7 @@ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", @@ -17319,6 +17631,7 @@ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, + "license": "MIT", "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" @@ -17332,6 +17645,7 @@ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", @@ -17364,6 +17678,7 @@ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -17397,6 +17712,7 @@ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", @@ -17428,6 +17744,7 @@ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -17445,6 +17762,7 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -17462,6 +17780,7 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -17474,6 +17793,7 @@ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, + "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", @@ -17493,6 +17813,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -17508,6 +17829,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -17522,13 +17844,15 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -17541,6 +17865,7 @@ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.0.0" } @@ -17550,6 +17875,7 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -17561,37 +17887,43 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -17604,6 +17936,7 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -17613,6 +17946,7 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -17622,6 +17956,7 @@ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -17631,6 +17966,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -17643,13 +17979,15 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -17664,25 +18002,28 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "license": "MIT" }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -17692,6 +18033,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -17706,13 +18048,15 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "tmpl": "1.0.5" } @@ -17721,6 +18065,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -17729,6 +18074,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.6" @@ -17738,6 +18084,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", "peer": true, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -17747,13 +18094,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -17762,6 +18111,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.6" @@ -17772,6 +18122,7 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -17784,6 +18135,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", "peer": true, "bin": { "mime": "cli.js" @@ -17796,6 +18148,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -17804,6 +18157,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -17816,6 +18170,7 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -17825,6 +18180,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -17835,23 +18191,27 @@ "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.6" @@ -17862,6 +18222,7 @@ "resolved": "https://registry.npmjs.org/nock/-/nock-12.0.3.tgz", "integrity": "sha512-QNb/j8kbFnKCiyqi9C5DD0jH/FubFGj5rt9NQFONXwQm3IPB0CULECg/eS3AU1KgZb/6SwUa4/DTRKhVxkGABw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.0", "json-stringify-safe": "^5.0.1", @@ -17887,6 +18248,7 @@ "url": "https://paypal.me/jimmywarting" } ], + "license": "MIT", "engines": { "node": ">=10.5.0" } @@ -17895,6 +18257,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", @@ -17912,19 +18275,22 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -17934,6 +18300,7 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -17945,6 +18312,7 @@ "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.4" @@ -17957,6 +18325,7 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", "peer": true, "dependencies": { "ee-first": "1.1.1" @@ -17970,6 +18339,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } @@ -17979,6 +18349,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -17994,6 +18365,7 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -18011,6 +18383,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -18026,6 +18399,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -18041,6 +18415,7 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -18050,6 +18425,7 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -18062,6 +18438,7 @@ "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.2.1.tgz", "integrity": "sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==", "dev": true, + "license": "Apache-2.0 AND MIT", "dependencies": { "es-module-lexer": "^1.5.3", "slashes": "^3.0.12" @@ -18075,6 +18452,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -18092,6 +18470,7 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.8" @@ -18102,6 +18481,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -18111,6 +18491,7 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -18120,6 +18501,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -18128,25 +18510,29 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-to-regexp": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT", "peer": true }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -18159,6 +18545,7 @@ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } @@ -18168,6 +18555,7 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -18180,6 +18568,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -18193,6 +18582,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -18205,6 +18595,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -18220,6 +18611,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -18232,6 +18624,7 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -18241,6 +18634,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -18255,6 +18649,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -18267,6 +18662,7 @@ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, + "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -18280,6 +18676,7 @@ "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -18288,6 +18685,7 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", "peer": true, "dependencies": { "forwarded": "0.2.0", @@ -18302,6 +18700,7 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -18320,12 +18719,14 @@ "type": "opencollective", "url": "https://opencollective.com/fast-check" } - ] + ], + "license": "MIT" }, "node_modules/qs": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", "peer": true, "dependencies": { "side-channel": "^1.0.6" @@ -18355,12 +18756,14 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.6" @@ -18370,6 +18773,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", "peer": true, "dependencies": { "bytes": "3.1.2", @@ -18385,13 +18789,15 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -18401,6 +18807,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", @@ -18421,6 +18828,7 @@ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, + "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -18433,6 +18841,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -18442,6 +18851,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -18451,6 +18861,7 @@ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } @@ -18460,6 +18871,7 @@ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -18484,6 +18896,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -18506,12 +18919,14 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "peer": true }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT", "peer": true }, "node_modules/semver": { @@ -18519,6 +18934,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -18530,6 +18946,7 @@ "version": "0.19.0", "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", "peer": true, "dependencies": { "debug": "2.6.9", @@ -18554,6 +18971,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "peer": true, "dependencies": { "ms": "2.0.0" @@ -18563,12 +18981,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT", "peer": true }, "node_modules/send/node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.8" @@ -18578,6 +18998,7 @@ "version": "1.16.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", "peer": true, "dependencies": { "encodeurl": "~2.0.0", @@ -18593,6 +19014,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC", "peer": true }, "node_modules/shebang-command": { @@ -18600,6 +19022,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -18612,6 +19035,7 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -18620,6 +19044,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", "peer": true, "dependencies": { "es-errors": "^1.3.0", @@ -18639,6 +19064,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", "peer": true, "dependencies": { "es-errors": "^1.3.0", @@ -18655,6 +19081,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", "peer": true, "dependencies": { "call-bound": "^1.0.2", @@ -18673,6 +19100,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", "peer": true, "dependencies": { "call-bound": "^1.0.2", @@ -18692,19 +19120,22 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -18713,13 +19144,15 @@ "version": "3.0.12", "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -18729,6 +19162,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -18738,13 +19172,15 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true + "dev": true, + "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", "dev": true, + "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -18754,19 +19190,22 @@ "version": "3.0.21", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -18779,6 +19218,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -18787,6 +19227,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.8" @@ -18797,6 +19238,7 @@ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, + "license": "MIT", "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -18810,6 +19252,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -18824,6 +19267,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -18836,6 +19280,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -18845,6 +19290,7 @@ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -18854,6 +19300,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -18866,6 +19313,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -18878,6 +19326,7 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -18886,10 +19335,11 @@ } }, "node_modules/synckit": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.3.tgz", - "integrity": "sha512-JJoOEKTfL1urb1mDoEblhD9NhEbWmq9jHEMEnxoC4ujUaZ4itA8vKgwkFAyNClgxplLi9tsUKX+EduK0p/l7sg==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", "dev": true, + "license": "MIT", "dependencies": { "@pkgr/core": "^0.1.0", "tslib": "^2.6.2" @@ -18906,6 +19356,7 @@ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, + "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -18919,13 +19370,15 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -18937,6 +19390,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "peer": true, "engines": { "node": ">=0.6" @@ -18947,6 +19401,7 @@ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18.12" }, @@ -18959,6 +19414,7 @@ "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.6.tgz", "integrity": "sha512-yTNZVZqc8lSixm+QGVFcPe6+yj7+TWZwIesuOWvfcn4B9bz5x4NDzVCQQjOs7Hfouu36aEqfEbo9Qpo+gq8dDg==", "dev": true, + "license": "MIT", "dependencies": { "bs-logger": "^0.2.6", "ejs": "^3.1.10", @@ -19005,13 +19461,15 @@ "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -19024,6 +19482,7 @@ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -19033,6 +19492,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -19044,6 +19504,7 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", "peer": true, "dependencies": { "media-typer": "0.3.0", @@ -19058,6 +19519,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -19071,6 +19533,7 @@ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.29.1.tgz", "integrity": "sha512-f8cDkvndhbQMPcysk6CUSGBWV+g1utqdn71P5YKwMumVMOG/5k7cHq0KyG4O52nB0oKS4aN2Tp5+wB4APJGC+w==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/eslint-plugin": "8.29.1", "@typescript-eslint/parser": "8.29.1", @@ -19089,15 +19552,17 @@ } }, "node_modules/undici-types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", - "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", - "dev": true + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.8" @@ -19122,6 +19587,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" @@ -19138,6 +19604,7 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -19146,6 +19613,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.4.0" @@ -19156,6 +19624,7 @@ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, + "license": "ISC", "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", @@ -19169,6 +19638,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.8" @@ -19179,6 +19649,7 @@ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "makeerror": "1.0.12" } @@ -19187,6 +19658,7 @@ "version": "4.0.0-beta.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "license": "MIT", "engines": { "node": ">= 14" } @@ -19196,6 +19668,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -19211,6 +19684,7 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -19220,6 +19694,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -19236,13 +19711,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -19256,6 +19733,7 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -19264,13 +19742,15 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -19289,6 +19769,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } @@ -19298,6 +19779,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -19306,4 +19788,4 @@ } } } -} \ No newline at end of file +} diff --git a/plugins/arcgis/service/package.json b/plugins/arcgis/service/package.json index 046c547fa..da2efb4f5 100644 --- a/plugins/arcgis/service/package.json +++ b/plugins/arcgis/service/package.json @@ -1,6 +1,6 @@ { "name": "@ngageoint/mage.arcgis.service", - "version": "6.5.0-beta.1", + "version": "1.0.0-beta.2", "description": "A mage service plugin that synchronizes mage observations to a configured ArcGIS feature layer.", "main": "lib/index.js", "files": [ @@ -44,7 +44,7 @@ "form-data": "4.0.2" }, "peerDependencies": { - "@ngageoint/mage.service": ">=6.3.0 || 6.5.0-beta.1", + "@ngageoint/mage.service": "6.3.0", "express": "4.21.2" }, "devDependencies": { diff --git a/plugins/arcgis/service/src/index.ts b/plugins/arcgis/service/src/index.ts index 0bf8de835..ff2fc8890 100644 --- a/plugins/arcgis/service/src/index.ts +++ b/plugins/arcgis/service/src/index.ts @@ -82,23 +82,21 @@ const arcgisPluginHooks: InitPluginHook = { return res.status(404).send('clientId is required'); } - const portalUrl = req.query.portalUrl as string; - const config = await processor.safeGetConfig(); ArcGISIdentityManager.authorize({ clientId, - portal: portalUrl || getPortalUrl(url), + portal: getPortalUrl(url), redirectUri: `${config.baseUrl}/${pluginWebRoute}/oauth/authenticate`, - state: JSON.stringify({ url: url, clientId: clientId, portalUrl: portalUrl }) + state: JSON.stringify({ url: url, clientId: clientId }) }, res); }); routes.get('/oauth/authenticate', async (req, res) => { const code = req.query.code as string; - let state: { url: string, clientId: string, portalUrl?: string }; + let state: { url: string, clientId: string }; try { - const { url, clientId, portalUrl } = JSON.parse(req.query.state as string); - state = { url, clientId, portalUrl }; + const { url, clientId } = JSON.parse(req.query.state as string); + state = { url, clientId }; } catch (err) { console.error('error parsing relay state', err); return res.sendStatus(500); @@ -108,22 +106,18 @@ const arcgisPluginHooks: InitPluginHook = { const creds = { clientId: state.clientId, redirectUri: `${config.baseUrl}/${pluginWebRoute}/oauth/authenticate`, - portal: state.portalUrl || getPortalUrl(state.url) + portal: getPortalUrl(state.url) }; ArcGISIdentityManager.exchangeAuthorizationCode(creds, code).then(async (idManager: ArcGISIdentityManager) => { let service = config.featureServices.find(service => service.url === state.url); if (!service) { service = { url: state.url, - portalUrl: state.portalUrl, identityManager: idManager.serialize(), layers: [] }; } else { service.identityManager = idManager.serialize(); - if (state.portalUrl) { - service.portalUrl = state.portalUrl; - } } config.featureServices.push(service); @@ -209,7 +203,6 @@ const arcgisPluginHooks: InitPluginHook = { return { url: updateService.url, - portalUrl: updateService.portalUrl, layers: layers, // Map existing identityManager, client does not send this identityManager: existingService?.identityManager || '', @@ -222,12 +215,12 @@ const arcgisPluginHooks: InitPluginHook = { processor.stop(); await processor.start(); - res.status(200).json({ success: true }); + res.status(200).json({success: true}); }); routes.post('/featureService/validate', async (req, res) => { const config = await processor.safeGetConfig(); - const { url, portalUrl, token, username, password } = req.body; + const { url, token, username, password } = req.body; if (!URL.canParse(url)) { return res.send('Invalid feature service url').status(400); } @@ -236,14 +229,14 @@ const arcgisPluginHooks: InitPluginHook = { let identityManager: ArcGISIdentityManager; if (token) { identityManager = await ArcGISIdentityManager.fromToken({ token }); - service = { url, portalUrl, layers: [], identityManager: identityManager.serialize() }; + service = { url, layers: [], identityManager: identityManager.serialize() }; } else if (username && password) { identityManager = await ArcGISIdentityManager.signIn({ username, password, - portal: portalUrl || getPortalUrl(url) + portal: getPortalUrl(url) }); - service = { url, portalUrl, layers: [], identityManager: identityManager.serialize() }; + service = { url, layers: [], identityManager: identityManager.serialize() }; } else { return res.sendStatus(400); } diff --git a/plugins/arcgis/service/src/types/ArcGISConfig.ts b/plugins/arcgis/service/src/types/ArcGISConfig.ts index ed2f02e3d..97cc1101e 100644 --- a/plugins/arcgis/service/src/types/ArcGISConfig.ts +++ b/plugins/arcgis/service/src/types/ArcGISConfig.ts @@ -10,11 +10,6 @@ export interface FeatureServiceConfig { */ url: string - /** - * The ArcGIS portal API URL - */ - portalUrl?: string - /** * Serialized ArcGISIdentityManager */ diff --git a/plugins/arcgis/web-app/package-lock.json b/plugins/arcgis/web-app/package-lock.json index 6e7aee560..8cad5533f 100644 --- a/plugins/arcgis/web-app/package-lock.json +++ b/plugins/arcgis/web-app/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ngageoint/mage.arcgis.web-app.workspace", - "version": "6.5.0-beta.1", + "version": "1.0.0-beta.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ngageoint/mage.arcgis.web-app.workspace", - "version": "6.5.0-beta.1", + "version": "1.0.0-beta.2", "dependencies": { "@angular/animations": "14.3.0", "@angular/cdk": "14.2.7", @@ -18,7 +18,7 @@ "@angular/platform-browser": "14.3.0", "@angular/platform-browser-dynamic": "14.3.0", "@angular/router": "14.3.0", - "@ngageoint/mage.web-core-lib": ">=6.3.0 || 6.5.0-beta.1", + "@ngageoint/mage.web-core-lib": "6.3.0", "rxjs": "~7.8.2", "tslib": "2.8.1", "zone.js": "0.11.4" @@ -42,10 +42,14 @@ }, "node_modules/@adobe/css-tools": { "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.3.tgz", + "integrity": "sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==", "license": "MIT" }, "node_modules/@ampproject/remapping": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.1.0", @@ -57,6 +61,8 @@ }, "node_modules/@angular-devkit/architect": { "version": "0.1400.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1400.0.tgz", + "integrity": "sha512-INPO+r5CHElPdFLOrwUYShZqtr37/kTJegAoWpSNC8Zy8WgTlecvA+y5eHy0bNeXMjWbZ3YCZJ1jXYpJJNL1Kg==", "license": "MIT", "peer": true, "dependencies": { @@ -71,6 +77,8 @@ }, "node_modules/@angular-devkit/architect/node_modules/@angular-devkit/core": { "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.0.0.tgz", + "integrity": "sha512-xQXpNbIeBjnbY68OFkrpFm6v7xlmTLFk6zGPIkI4T/hrqT2kNmg0y1/FcN6yMBgCEC9WVWR8SHGaPWrc5VVZMw==", "license": "MIT", "peer": true, "dependencies": { @@ -96,11 +104,15 @@ }, "node_modules/@angular-devkit/architect/node_modules/jsonc-parser": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", "license": "MIT", "peer": true }, "node_modules/@angular-devkit/architect/node_modules/rxjs": { "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -112,6 +124,8 @@ }, "node_modules/@angular-devkit/architect/node_modules/source-map": { "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "license": "BSD-3-Clause", "peer": true, "engines": { @@ -120,11 +134,15 @@ }, "node_modules/@angular-devkit/architect/node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD", "peer": true }, "node_modules/@angular-devkit/build-angular": { "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-14.2.13.tgz", + "integrity": "sha512-FJZKQ3xYFvEJ807sxVy4bCVyGU2NMl3UUPNfLIdIdzwwDEP9tx/cc+c4VtVPEZZfU8jVenu8XOvL6L0vpjt3yg==", "license": "MIT", "dependencies": { "@ampproject/remapping": "2.2.0", @@ -231,6 +249,8 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { "version": "0.1402.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.13.tgz", + "integrity": "sha512-n0ISBuvkZHoOpAzuAZql1TU9VLHUE9e/a9g4VNOPHewjMzpN02VqeGKvJfOCKtzkCs6gVssIlILm2/SXxkIFxQ==", "license": "MIT", "dependencies": { "@angular-devkit/core": "14.2.13", @@ -244,6 +264,8 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^1.9.0" @@ -254,14 +276,20 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/rxjs/node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, "node_modules/@angular-devkit/build-angular/node_modules/tslib": { "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "license": "0BSD" }, "node_modules/@angular-devkit/build-webpack": { "version": "0.1402.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1402.13.tgz", + "integrity": "sha512-K27aJmuw86ZOdiu5PoGeGDJ2v7g2ZCK0bGwc8jzkjTLRfvd4FRKIIZumGv3hbQ3vQRLikiU6WMDRTFyCZky/EA==", "license": "MIT", "dependencies": { "@angular-devkit/architect": "0.1402.13", @@ -279,6 +307,8 @@ }, "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { "version": "0.1402.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.13.tgz", + "integrity": "sha512-n0ISBuvkZHoOpAzuAZql1TU9VLHUE9e/a9g4VNOPHewjMzpN02VqeGKvJfOCKtzkCs6gVssIlILm2/SXxkIFxQ==", "license": "MIT", "dependencies": { "@angular-devkit/core": "14.2.13", @@ -292,6 +322,8 @@ }, "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^1.9.0" @@ -302,10 +334,14 @@ }, "node_modules/@angular-devkit/build-webpack/node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, "node_modules/@angular-devkit/core": { "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.13.tgz", + "integrity": "sha512-aIefeZcbjghQg/V6U9CTLtyB5fXDJ63KwYqVYkWP+i0XriS5A9puFgq2u/OVsWxAfYvqpDqp5AdQ0g0bi3CAsA==", "license": "MIT", "dependencies": { "ajv": "8.11.0", @@ -330,6 +366,8 @@ }, "node_modules/@angular-devkit/core/node_modules/rxjs": { "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^1.9.0" @@ -340,10 +378,14 @@ }, "node_modules/@angular-devkit/core/node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, "node_modules/@angular-devkit/schematics": { "version": "14.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.0.tgz", + "integrity": "sha512-5H78HBAYshCKSYsjIr4K33TkS6CMB7IZpZunisSDiX23fHa1IvIkDrpbXlfMvZykHbcmKA/nt2wHMIsQl0YNuw==", "license": "MIT", "peer": true, "dependencies": { @@ -361,6 +403,8 @@ }, "node_modules/@angular-devkit/schematics/node_modules/@angular-devkit/core": { "version": "14.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.0.tgz", + "integrity": "sha512-IwiS6uDs3drR4i3nuqVinh5jtI1SHIyn/OaoWL6t3V7Y6b65BdJN1liyd+WBUEZmEwGCkY2/FjnLx1G8Dflc8A==", "license": "MIT", "peer": true, "dependencies": { @@ -386,6 +430,8 @@ }, "node_modules/@angular-devkit/schematics/node_modules/rxjs": { "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -397,11 +443,15 @@ }, "node_modules/@angular-devkit/schematics/node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD", "peer": true }, "node_modules/@angular/animations": { "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-14.3.0.tgz", + "integrity": "sha512-QoBcIKy1ZiU+4qJsAh5Ls20BupWiXiZzKb0s6L9/dntPt5Msr4Ao289XR2P6O1L+kTsCprH9Kt41zyGQ/bkRqg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -415,6 +465,8 @@ }, "node_modules/@angular/cdk": { "version": "14.2.7", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-14.2.7.tgz", + "integrity": "sha512-/tEsYaUbDSnfEmKVvAMramIptmhI67O+9STjOV0i+74XR2NospeK0fkbywIANu1n3w6AHGMotvRWJrjmbCElFg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -430,6 +482,8 @@ }, "node_modules/@angular/cli": { "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-14.2.13.tgz", + "integrity": "sha512-I5EepRem2CCyS3GDzQxZ2ZrqQwVqoGoLY+ZQhsK1QGWUnUyFOjbv3OlUGxRUYwcedu19V1EBAKjmQ96HzMIcVQ==", "dev": true, "license": "MIT", "dependencies": { @@ -465,6 +519,8 @@ }, "node_modules/@angular/cli/node_modules/@angular-devkit/architect": { "version": "0.1402.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.13.tgz", + "integrity": "sha512-n0ISBuvkZHoOpAzuAZql1TU9VLHUE9e/a9g4VNOPHewjMzpN02VqeGKvJfOCKtzkCs6gVssIlILm2/SXxkIFxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -479,6 +535,8 @@ }, "node_modules/@angular/cli/node_modules/@angular-devkit/schematics": { "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.13.tgz", + "integrity": "sha512-2zczyeNzeBcrT2HOysv52X9SH3tZoHfWJvVf6H0SIa74rfDKEl7hFpKNXnh3x8sIMLj5mZn05n5RCqGxCczcIg==", "dev": true, "license": "MIT", "dependencies": { @@ -496,6 +554,8 @@ }, "node_modules/@angular/cli/node_modules/@schematics/angular": { "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.2.13.tgz", + "integrity": "sha512-MLxTpTU3E8QACQ/5c0sENMR2gRiMXpGaKeD5IHY+3wyU2fUSJVB0QPU/l1WhoyZbX8N9ospBgf5UEG7taVF9rg==", "dev": true, "license": "MIT", "dependencies": { @@ -511,6 +571,8 @@ }, "node_modules/@angular/cli/node_modules/rxjs": { "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -522,11 +584,15 @@ }, "node_modules/@angular/cli/node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true, "license": "0BSD" }, "node_modules/@angular/common": { "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-14.3.0.tgz", + "integrity": "sha512-pV9oyG3JhGWeQ+TFB0Qub6a1VZWMNZ6/7zEopvYivdqa5yDLLDSBRWb6P80RuONXyGnM1pa7l5nYopX+r/23GQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -541,6 +607,8 @@ }, "node_modules/@angular/compiler": { "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-14.3.0.tgz", + "integrity": "sha512-E15Rh0t3vA+bctbKnBCaDmLvc3ix+ZBt6yFZmhZalReQ+KpOlvOJv+L9oiFEgg+rYVl2QdvN7US1fvT0PqswLw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -559,6 +627,8 @@ }, "node_modules/@angular/compiler-cli": { "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-14.3.0.tgz", + "integrity": "sha512-eoKpKdQ2X6axMgzcPUMZVYl3bIlTMzMeTo5V29No4BzgiUB+QoOTYGNJZkGRyqTNpwD9uSBJvmT2vG9+eC4ghQ==", "license": "MIT", "dependencies": { "@babel/core": "^7.17.2", @@ -587,6 +657,8 @@ }, "node_modules/@angular/core": { "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-14.3.0.tgz", + "integrity": "sha512-wYiwItc0Uyn4FWZ/OAx/Ubp2/WrD3EgUJ476y1XI7yATGPF8n9Ld5iCXT08HOvc4eBcYlDfh90kTXR6/MfhzdQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -601,6 +673,8 @@ }, "node_modules/@angular/forms": { "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-14.3.0.tgz", + "integrity": "sha512-fBZZC2UFMom2AZPjGQzROPXFWO6kvCsPDKctjJwClVC8PuMrkm+RRyiYRdBbt2qxWHEqOZM2OCQo73xUyZOYHw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -617,6 +691,8 @@ }, "node_modules/@angular/material": { "version": "14.2.7", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-14.2.7.tgz", + "integrity": "sha512-WXHh8pEStpgkXZJmYOg2cI8BSHkV82ET4XTJCNPdveumaCn1UYnaNzsXD13kw5z+zmy8CufhFEzdXTrv/yt7KQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -633,6 +709,8 @@ }, "node_modules/@angular/platform-browser": { "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.3.0.tgz", + "integrity": "sha512-w9Y3740UmTz44T0Egvc+4QV9sEbO61L+aRHbpkLTJdlEGzHByZvxJmJyBYmdqeyTPwc/Zpy7c02frlpfAlyB7A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -653,6 +731,8 @@ }, "node_modules/@angular/platform-browser-dynamic": { "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.3.0.tgz", + "integrity": "sha512-rneZiMrIiYRhrkQvdL40E2ErKRn4Zdo6EtjBM9pAmWeyoM8oMnOZb9gz5vhrkNWg06kVMVg0yKqluP5How7j3A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -669,6 +749,8 @@ }, "node_modules/@angular/router": { "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-14.3.0.tgz", + "integrity": "sha512-uip0V7w7k7xyxxpTPbr7EuMnYLj3FzJrwkLVJSEw3TMMGHt5VU5t4BBa9veGZOta2C205XFrTAHnp8mD+XYY1w==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -685,10 +767,14 @@ }, "node_modules/@assemblyscript/loader": { "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", "license": "Apache-2.0" }, "node_modules/@babel/code-frame": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", @@ -700,7 +786,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.0", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.3.tgz", + "integrity": "sha512-V42wFfx1ymFte+ecf6iXghnnP8kWTO+ZLXIyZq+1LAXHHvTZdVxicn4yiVYdYMGaCO3tmqub11AorKkv+iodqw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -708,6 +796,8 @@ }, "node_modules/@babel/core": { "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", + "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.1.0", @@ -736,6 +826,8 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -743,6 +835,8 @@ }, "node_modules/@babel/generator": { "version": "7.18.12", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", + "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", "license": "MIT", "dependencies": { "@babel/types": "^7.18.10", @@ -754,15 +848,23 @@ } }, "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "license": "MIT", "dependencies": { "@babel/types": "^7.18.6" @@ -773,6 +875,8 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "license": "MIT", "dependencies": { "@babel/compat-data": "^7.27.2", @@ -787,6 +891,8 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -794,6 +900,8 @@ }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", @@ -813,6 +921,8 @@ }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "license": "MIT", "dependencies": { "@babel/types": "^7.27.3" @@ -823,6 +933,8 @@ }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -830,6 +942,8 @@ }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", @@ -845,6 +959,8 @@ }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "license": "MIT", "dependencies": { "@babel/types": "^7.27.3" @@ -855,6 +971,8 @@ }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -862,6 +980,8 @@ }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.17.7", @@ -877,6 +997,8 @@ }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -884,6 +1006,8 @@ }, "node_modules/@babel/helper-environment-visitor": { "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", "license": "MIT", "dependencies": { "@babel/types": "^7.24.7" @@ -892,15 +1016,10 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", @@ -912,6 +1031,8 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", @@ -923,6 +1044,8 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", @@ -938,6 +1061,8 @@ }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "license": "MIT", "dependencies": { "@babel/types": "^7.27.1" @@ -948,6 +1073,8 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -955,6 +1082,8 @@ }, "node_modules/@babel/helper-remap-async-to-generator": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", @@ -970,6 +1099,8 @@ }, "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "license": "MIT", "dependencies": { "@babel/types": "^7.27.3" @@ -980,6 +1111,8 @@ }, "node_modules/@babel/helper-replace-supers": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", "license": "MIT", "dependencies": { "@babel/helper-member-expression-to-functions": "^7.27.1", @@ -995,6 +1128,8 @@ }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", @@ -1006,6 +1141,8 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1013,6 +1150,8 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1020,6 +1159,8 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1027,6 +1168,8 @@ }, "node_modules/@babel/helper-wrap-function": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", + "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", "license": "MIT", "dependencies": { "@babel/template": "^7.27.1", @@ -1039,6 +1182,8 @@ }, "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -1050,11 +1195,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.2", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.3.tgz", + "integrity": "sha512-h/eKy9agOya1IGuLaZ9tEUgz+uIRXcbtOhRtUyyMf8JFmn1iT13vnl/IGVWSkdOCG/pC57U4S1jnAabAavTMwg==", "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -1062,6 +1209,8 @@ }, "node_modules/@babel/helpers/node_modules/@babel/template": { "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -1073,10 +1222,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.0", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.3.tgz", + "integrity": "sha512-xyYxRj6+tLNDTWi0KCBcZ9V7yg3/lwL9DWh9Uwh/RIVlIfFidggcgxKX3GCXwCiswwcGRawBKbEg2LG/Y8eJhw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.0" + "@babel/types": "^7.27.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -1087,6 +1238,8 @@ }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1100,6 +1253,8 @@ }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -1115,6 +1270,9 @@ }, "node_modules/@babel/plugin-proposal-async-generator-functions": { "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", + "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", @@ -1131,6 +1289,9 @@ }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", @@ -1145,6 +1306,9 @@ }, "node_modules/@babel/plugin-proposal-class-static-block": { "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", + "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-static-block instead.", "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.21.0", @@ -1160,6 +1324,9 @@ }, "node_modules/@babel/plugin-proposal-dynamic-import": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-dynamic-import instead.", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -1174,6 +1341,9 @@ }, "node_modules/@babel/plugin-proposal-export-namespace-from": { "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-export-namespace-from instead.", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9", @@ -1188,6 +1358,9 @@ }, "node_modules/@babel/plugin-proposal-json-strings": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-json-strings instead.", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -1202,6 +1375,9 @@ }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead.", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", @@ -1216,6 +1392,9 @@ }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -1230,6 +1409,9 @@ }, "node_modules/@babel/plugin-proposal-numeric-separator": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -1244,6 +1426,9 @@ }, "node_modules/@babel/plugin-proposal-object-rest-spread": { "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", "license": "MIT", "dependencies": { "@babel/compat-data": "^7.20.5", @@ -1261,6 +1446,9 @@ }, "node_modules/@babel/plugin-proposal-optional-catch-binding": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -1275,6 +1463,9 @@ }, "node_modules/@babel/plugin-proposal-optional-chaining": { "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", @@ -1290,6 +1481,9 @@ }, "node_modules/@babel/plugin-proposal-private-methods": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", @@ -1304,6 +1498,9 @@ }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", @@ -1320,6 +1517,9 @@ }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.", "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", @@ -1334,6 +1534,8 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -1344,6 +1546,8 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" @@ -1354,6 +1558,8 @@ }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -1367,6 +1573,8 @@ }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -1377,6 +1585,8 @@ }, "node_modules/@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" @@ -1387,6 +1597,8 @@ }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1400,6 +1612,8 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -1410,6 +1624,8 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -1420,6 +1636,8 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -1430,6 +1648,8 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -1440,6 +1660,8 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -1450,6 +1672,8 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -1460,6 +1684,8 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -1470,6 +1696,8 @@ }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -1483,6 +1711,8 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -1496,6 +1726,8 @@ }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1509,6 +1741,8 @@ }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.18.6", @@ -1524,6 +1758,8 @@ }, "node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1536,7 +1772,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.0", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.3.tgz", + "integrity": "sha512-+F8CnfhuLhwUACIJMLWnjz6zvzYM2r0yeIHKlbgfw7ml8rOMJsXNXV/hyRcb3nb493gRs4WvYpQAndWj/qQmkQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1549,15 +1787,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.0", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", + "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-globals": "^7.28.0", + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.27.1", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" @@ -1568,6 +1808,8 @@ }, "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "license": "MIT", "dependencies": { "@babel/types": "^7.27.3" @@ -1578,6 +1820,8 @@ }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -1592,6 +1836,8 @@ }, "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/template": { "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -1603,11 +1849,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.0", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz", + "integrity": "sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1618,6 +1865,8 @@ }, "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", @@ -1632,6 +1881,8 @@ }, "node_modules/@babel/plugin-transform-duplicate-keys": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1645,6 +1896,8 @@ }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1658,6 +1911,8 @@ }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -1672,6 +1927,8 @@ }, "node_modules/@babel/plugin-transform-function-name": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.27.1", @@ -1687,6 +1944,8 @@ }, "node_modules/@babel/plugin-transform-literals": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1700,6 +1959,8 @@ }, "node_modules/@babel/plugin-transform-member-expression-literals": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1713,6 +1974,8 @@ }, "node_modules/@babel/plugin-transform-modules-amd": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.27.1", @@ -1727,6 +1990,8 @@ }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.27.1", @@ -1741,6 +2006,8 @@ }, "node_modules/@babel/plugin-transform-modules-systemjs": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.27.1", @@ -1757,6 +2024,8 @@ }, "node_modules/@babel/plugin-transform-modules-umd": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.27.1", @@ -1771,6 +2040,8 @@ }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", @@ -1785,6 +2056,8 @@ }, "node_modules/@babel/plugin-transform-new-target": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1798,6 +2071,8 @@ }, "node_modules/@babel/plugin-transform-object-super": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -1812,6 +2087,8 @@ }, "node_modules/@babel/plugin-transform-optional-chaining": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -1825,7 +2102,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.7", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", + "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1839,6 +2118,8 @@ }, "node_modules/@babel/plugin-transform-property-literals": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1851,7 +2132,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.1", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.1.tgz", + "integrity": "sha512-B19lbbL7PMrKr52BNPjCqg1IyNUIjTcxKj8uX9zHO+PmWN93s19NDr/f69mIkEp2x9nmDJ08a7lgHaTTzvW7mw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1865,6 +2148,8 @@ }, "node_modules/@babel/plugin-transform-reserved-words": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1878,6 +2163,8 @@ }, "node_modules/@babel/plugin-transform-runtime": { "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", + "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.18.6", @@ -1896,6 +2183,8 @@ }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -1903,6 +2192,8 @@ }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1916,6 +2207,8 @@ }, "node_modules/@babel/plugin-transform-spread": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -1930,6 +2223,8 @@ }, "node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1943,6 +2238,8 @@ }, "node_modules/@babel/plugin-transform-template-literals": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1956,6 +2253,8 @@ }, "node_modules/@babel/plugin-transform-typeof-symbol": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1969,6 +2268,8 @@ }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1982,6 +2283,8 @@ }, "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", @@ -1996,6 +2299,8 @@ }, "node_modules/@babel/preset-env": { "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", + "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", "license": "MIT", "dependencies": { "@babel/compat-data": "^7.18.8", @@ -2083,6 +2388,8 @@ }, "node_modules/@babel/preset-env/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -2090,6 +2397,8 @@ }, "node_modules/@babel/preset-modules": { "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", + "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", @@ -2104,6 +2413,8 @@ }, "node_modules/@babel/runtime": { "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", + "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.13.4" @@ -2114,6 +2425,8 @@ }, "node_modules/@babel/template": { "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.18.6", @@ -2125,29 +2438,33 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.0", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.3.tgz", + "integrity": "sha512-lId/IfN/Ye1CIu8xG7oKBHXd2iNb2aW1ilPszzGcJug6M8RCKfVNcYhpI5+bMvFYjK7lXIM0R+a+6r8xhHp2FQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.0", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.3", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.0", - "debug": "^4.3.1" + "@babel/types": "^7.27.3", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.28.0", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.3.tgz", + "integrity": "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.0", - "@babel/types": "^7.28.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", + "@babel/parser": "^7.27.3", + "@babel/types": "^7.27.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" }, "engines": { @@ -2156,6 +2473,8 @@ }, "node_modules/@babel/traverse/node_modules/@babel/template": { "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -2167,15 +2486,23 @@ } }, "node_modules/@babel/traverse/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/@babel/traverse/node_modules/jsesc": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -2185,7 +2512,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.2", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.3.tgz", + "integrity": "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -2197,6 +2526,8 @@ }, "node_modules/@colors/colors": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "devOptional": true, "license": "MIT", "engines": { @@ -2205,6 +2536,8 @@ }, "node_modules/@csstools/postcss-cascade-layers": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", + "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.2", @@ -2223,6 +2556,8 @@ }, "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", "license": "CC0-1.0", "engines": { "node": "^14 || ^16 || >=18" @@ -2237,6 +2572,8 @@ }, "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -2248,6 +2585,8 @@ }, "node_modules/@csstools/postcss-color-function": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", @@ -2266,6 +2605,8 @@ }, "node_modules/@csstools/postcss-font-format-keywords": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -2283,6 +2624,8 @@ }, "node_modules/@csstools/postcss-hwb-function": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -2300,6 +2643,8 @@ }, "node_modules/@csstools/postcss-ic-unit": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", @@ -2318,6 +2663,8 @@ }, "node_modules/@csstools/postcss-is-pseudo-class": { "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.0", @@ -2336,6 +2683,8 @@ }, "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", "license": "CC0-1.0", "engines": { "node": "^14 || ^16 || >=18" @@ -2350,6 +2699,8 @@ }, "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -2361,6 +2712,8 @@ }, "node_modules/@csstools/postcss-nested-calc": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", + "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -2378,6 +2731,8 @@ }, "node_modules/@csstools/postcss-normalize-display-values": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -2395,6 +2750,8 @@ }, "node_modules/@csstools/postcss-oklab-function": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", @@ -2413,6 +2770,8 @@ }, "node_modules/@csstools/postcss-progressive-custom-properties": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -2426,6 +2785,8 @@ }, "node_modules/@csstools/postcss-stepped-value-functions": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -2443,6 +2804,8 @@ }, "node_modules/@csstools/postcss-text-decoration-shorthand": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", + "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -2460,6 +2823,8 @@ }, "node_modules/@csstools/postcss-trigonometric-functions": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", + "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -2477,6 +2842,8 @@ }, "node_modules/@csstools/postcss-unset-value": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", "license": "CC0-1.0", "engines": { "node": "^12 || ^14 || >=16" @@ -2491,17 +2858,39 @@ }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "license": "MIT", "engines": { "node": ">=10.0.0" } }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz", + "integrity": "sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@gar/promisify": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "license": "MIT" }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "license": "ISC", "dependencies": { "camelcase": "^5.3.1", @@ -2516,6 +2905,8 @@ }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "license": "MIT", "engines": { "node": ">=8" @@ -2523,6 +2914,8 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.0.0", @@ -2534,6 +2927,8 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "license": "MIT", "engines": { "node": ">=6.0.0" @@ -2541,13 +2936,17 @@ }, "node_modules/@jridgewell/set-array": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.10", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -2555,19 +2954,29 @@ } }, "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -2576,10 +2985,14 @@ }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", "license": "MIT" }, "node_modules/@ng-select/ng-select": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-9.1.0.tgz", + "integrity": "sha512-vxSRD2d84H39eqtTJaethlpQ+xkJUU8epQNUr3yPiah23z8MBCqSDE1t0chxi+rXJz7+xoC9qFa1aYnUVFan4w==", "license": "MIT", "peer": true, "dependencies": { @@ -2597,6 +3010,8 @@ }, "node_modules/@ngageoint/mage.web-core-lib": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@ngageoint/mage.web-core-lib/-/mage.web-core-lib-6.3.0.tgz", + "integrity": "sha512-YbPNq4HfOjmWvO4Z9DPA2wiaBCAvYaocTrhSY7rAjtGMSjpr6ol9AO5Rah1rdgYtOq98REgrfq8R3NWdG69cmw==", "dependencies": { "@rollup/plugin-commonjs": "25.0.8", "@rollup/plugin-node-resolve": "15.3.1", @@ -2623,6 +3038,8 @@ }, "node_modules/@ngtools/webpack": { "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-14.2.13.tgz", + "integrity": "sha512-RQx/rGX7K/+R55x1R6Ax1JzyeHi8cW11dEXpzHWipyuSpusQLUN53F02eMB4VTakXsL3mFNWWy4bX3/LSq8/9w==", "license": "MIT", "engines": { "node": "^14.15.0 || >=16.10.0", @@ -2637,6 +3054,8 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -2648,6 +3067,8 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "license": "MIT", "engines": { "node": ">= 8" @@ -2655,6 +3076,8 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -2666,6 +3089,8 @@ }, "node_modules/@npmcli/fs": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", "license": "ISC", "dependencies": { "@gar/promisify": "^1.1.3", @@ -2677,6 +3102,8 @@ }, "node_modules/@npmcli/git": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.2.tgz", + "integrity": "sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w==", "dev": true, "license": "ISC", "dependencies": { @@ -2696,6 +3123,8 @@ }, "node_modules/@npmcli/git/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "license": "ISC", "engines": { @@ -2704,6 +3133,8 @@ }, "node_modules/@npmcli/git/node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { @@ -2718,6 +3149,8 @@ }, "node_modules/@npmcli/installed-package-contents": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", + "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", "dev": true, "license": "ISC", "dependencies": { @@ -2733,6 +3166,9 @@ }, "node_modules/@npmcli/move-file": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", "license": "MIT", "dependencies": { "mkdirp": "^1.0.4", @@ -2744,6 +3180,8 @@ }, "node_modules/@npmcli/node-gyp": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", + "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", "dev": true, "license": "ISC", "engines": { @@ -2752,6 +3190,8 @@ }, "node_modules/@npmcli/promise-spawn": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", + "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", "dev": true, "license": "ISC", "dependencies": { @@ -2763,6 +3203,8 @@ }, "node_modules/@npmcli/run-script": { "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.1.tgz", + "integrity": "sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg==", "dev": true, "license": "ISC", "dependencies": { @@ -2778,6 +3220,8 @@ }, "node_modules/@npmcli/run-script/node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { @@ -2792,6 +3236,8 @@ }, "node_modules/@rollup/plugin-commonjs": { "version": "25.0.8", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.8.tgz", + "integrity": "sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==", "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", @@ -2815,6 +3261,8 @@ }, "node_modules/@rollup/plugin-commonjs/node_modules/magic-string": { "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" @@ -2822,6 +3270,8 @@ }, "node_modules/@rollup/plugin-json": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz", + "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==", "license": "MIT", "dependencies": { "@rollup/pluginutils": "^3.0.8" @@ -2832,6 +3282,8 @@ }, "node_modules/@rollup/plugin-json/node_modules/@rollup/pluginutils": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "license": "MIT", "dependencies": { "@types/estree": "0.0.39", @@ -2847,14 +3299,20 @@ }, "node_modules/@rollup/plugin-json/node_modules/@types/estree": { "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "license": "MIT" }, "node_modules/@rollup/plugin-json/node_modules/estree-walker": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "license": "MIT" }, "node_modules/@rollup/plugin-json/node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -2865,6 +3323,8 @@ }, "node_modules/@rollup/plugin-node-resolve": { "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", + "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", @@ -2886,7 +3346,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.2.0", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -2907,6 +3369,8 @@ }, "node_modules/@schematics/angular": { "version": "14.2.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.2.0.tgz", + "integrity": "sha512-9y5nnL4XpxhRIrkV2C8H12LbLEVhQP8VK7/V7sbXJ/V4ioUi5BT6P6t3qLcFNOrk9/+mJIVbsXdZkXnyxy2dRA==", "license": "MIT", "peer": true, "dependencies": { @@ -2922,6 +3386,8 @@ }, "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { "version": "14.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.0.tgz", + "integrity": "sha512-IwiS6uDs3drR4i3nuqVinh5jtI1SHIyn/OaoWL6t3V7Y6b65BdJN1liyd+WBUEZmEwGCkY2/FjnLx1G8Dflc8A==", "license": "MIT", "peer": true, "dependencies": { @@ -2947,6 +3413,8 @@ }, "node_modules/@schematics/angular/node_modules/rxjs": { "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -2958,16 +3426,22 @@ }, "node_modules/@schematics/angular/node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD", "peer": true }, "node_modules/@socket.io/component-emitter": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", "devOptional": true, "license": "MIT" }, "node_modules/@tootallnate/once": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, "license": "MIT", "engines": { @@ -2975,7 +3449,9 @@ } }, "node_modules/@types/body-parser": { - "version": "1.19.6", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "license": "MIT", "dependencies": { "@types/connect": "*", @@ -2984,6 +3460,8 @@ }, "node_modules/@types/bonjour": { "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -2991,6 +3469,8 @@ }, "node_modules/@types/connect": { "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -2998,6 +3478,8 @@ }, "node_modules/@types/connect-history-api-fallback": { "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "license": "MIT", "dependencies": { "@types/express-serve-static-core": "*", @@ -3005,7 +3487,9 @@ } }, "node_modules/@types/cors": { - "version": "2.8.19", + "version": "2.8.18", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.18.tgz", + "integrity": "sha512-nX3d0sxJW41CqQvfOzVG1NCTXfFDrDWIghCZncpHeWlVFd81zxB/DLhg7avFg6eHLCRX7ckBmoIIcqa++upvJA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -3014,6 +3498,8 @@ }, "node_modules/@types/eslint": { "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "license": "MIT", "dependencies": { "@types/estree": "*", @@ -3022,6 +3508,8 @@ }, "node_modules/@types/eslint-scope": { "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "license": "MIT", "dependencies": { "@types/eslint": "*", @@ -3029,11 +3517,15 @@ } }, "node_modules/@types/estree": { - "version": "1.0.8", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", "license": "MIT" }, "node_modules/@types/express": { - "version": "4.17.23", + "version": "4.17.22", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.22.tgz", + "integrity": "sha512-eZUmSnhRX9YRSkplpz0N+k6NljUUn5l3EWZIKZvYzhvMphEuNiyyy1viH/ejgt66JWgALwC/gtSUAeQKtSwW/w==", "license": "MIT", "dependencies": { "@types/body-parser": "*", @@ -3043,7 +3535,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "5.0.7", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -3054,6 +3548,8 @@ }, "node_modules/@types/express/node_modules/@types/express-serve-static-core": { "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -3064,15 +3560,21 @@ }, "node_modules/@types/geojson": { "version": "7946.0.7", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.7.tgz", + "integrity": "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ==", "dev": true, "license": "MIT" }, "node_modules/@types/http-errors": { - "version": "2.0.5", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "license": "MIT" }, "node_modules/@types/http-proxy": { "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -3080,23 +3582,33 @@ }, "node_modules/@types/jasmine": { "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.0.tgz", + "integrity": "sha512-kGCRI9oiCxFS6soGKlyzhMzDydfcPix9PpTkr7h11huxOxhWwP37Tg7DYBaQ18eQTNreZEuLkhpbGSqVNZPnnw==", "dev": true, "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "license": "MIT" }, "node_modules/@types/mime": { "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "license": "MIT" }, "node_modules/@types/node": { "version": "12.11.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.11.1.tgz", + "integrity": "sha512-TJtwsqZ39pqcljJpajeoofYRfeZ7/I/OMUQ5pR4q5wOKf2ocrUvBAZUMhWsOvKx3dVc/aaV5GluBivt0sWqA5A==", "license": "MIT" }, "node_modules/@types/node-forge": { - "version": "1.3.13", + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -3104,26 +3616,38 @@ }, "node_modules/@types/parse-json": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "license": "MIT" }, "node_modules/@types/qs": { "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "license": "MIT" }, "node_modules/@types/resolve": { "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", "license": "MIT" }, "node_modules/@types/retry": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "license": "MIT" }, "node_modules/@types/send": { - "version": "0.17.5", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "license": "MIT", "dependencies": { "@types/mime": "^1", @@ -3132,13 +3656,17 @@ }, "node_modules/@types/serve-index": { "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "license": "MIT", "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.8", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "license": "MIT", "dependencies": { "@types/http-errors": "*", @@ -3148,6 +3676,8 @@ }, "node_modules/@types/sockjs": { "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -3155,6 +3685,8 @@ }, "node_modules/@types/ws": { "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -3162,6 +3694,8 @@ }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.11.1", @@ -3170,18 +3704,26 @@ }, "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.1", @@ -3191,10 +3733,14 @@ }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.1", @@ -3205,6 +3751,8 @@ }, "node_modules/@webassemblyjs/ieee754": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" @@ -3212,6 +3760,8 @@ }, "node_modules/@webassemblyjs/leb128": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" @@ -3219,10 +3769,14 @@ }, "node_modules/@webassemblyjs/utf8": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.1", @@ -3237,6 +3791,8 @@ }, "node_modules/@webassemblyjs/wasm-gen": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.1", @@ -3248,6 +3804,8 @@ }, "node_modules/@webassemblyjs/wasm-opt": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.1", @@ -3258,6 +3816,8 @@ }, "node_modules/@webassemblyjs/wasm-parser": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.1", @@ -3270,6 +3830,8 @@ }, "node_modules/@webassemblyjs/wast-printer": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.1", @@ -3278,28 +3840,41 @@ }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "license": "Apache-2.0" }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true, "license": "BSD-2-Clause" }, "node_modules/abab": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", "license": "BSD-3-Clause" }, "node_modules/abbrev": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "license": "ISC" }, "node_modules/accepts": { "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "license": "MIT", "dependencies": { "mime-types": "~2.1.34", @@ -3311,13 +3886,17 @@ }, "node_modules/accepts/node_modules/negotiator": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/acorn": { - "version": "8.15.0", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -3328,6 +3907,9 @@ }, "node_modules/acorn-import-assertions": { "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "deprecated": "package has been renamed to acorn-import-attributes", "license": "MIT", "peerDependencies": { "acorn": "^8" @@ -3335,6 +3917,8 @@ }, "node_modules/adjust-sourcemap-loader": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", @@ -3346,6 +3930,8 @@ }, "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "license": "MIT", "dependencies": { "big.js": "^5.2.2", @@ -3358,6 +3944,8 @@ }, "node_modules/agent-base": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "license": "MIT", "dependencies": { "debug": "4" @@ -3368,6 +3956,8 @@ }, "node_modules/agentkeepalive": { "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3379,6 +3969,8 @@ }, "node_modules/aggregate-error": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", @@ -3390,6 +3982,8 @@ }, "node_modules/ajv": { "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -3404,6 +3998,8 @@ }, "node_modules/ajv-formats": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -3419,6 +4015,8 @@ }, "node_modules/ajv-keywords": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" @@ -3429,6 +4027,8 @@ }, "node_modules/ansi-colors": { "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "license": "MIT", "engines": { "node": ">=6" @@ -3436,6 +4036,8 @@ }, "node_modules/ansi-escapes": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "license": "MIT", "dependencies": { "type-fest": "^0.21.3" @@ -3449,6 +4051,8 @@ }, "node_modules/ansi-html-community": { "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "engines": [ "node >= 0.8.0" ], @@ -3459,6 +4063,8 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", "engines": { "node": ">=8" @@ -3466,6 +4072,8 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -3479,6 +4087,8 @@ }, "node_modules/anymatch": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -3490,6 +4100,8 @@ }, "node_modules/anymatch/node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -3499,12 +4111,17 @@ } }, "node_modules/aproba": { - "version": "2.1.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true, "license": "ISC" }, "node_modules/are-we-there-yet": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", "dev": true, "license": "ISC", "dependencies": { @@ -3517,6 +4134,8 @@ }, "node_modules/argparse": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" @@ -3524,10 +4143,14 @@ }, "node_modules/array-flatten": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "license": "MIT" }, "node_modules/atob": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "license": "(MIT OR Apache-2.0)", "bin": { "atob": "bin/atob.js" @@ -3538,6 +4161,8 @@ }, "node_modules/autoprefixer": { "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", "funding": [ { "type": "opencollective", @@ -3573,6 +4198,8 @@ }, "node_modules/babel-loader": { "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", + "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", "license": "MIT", "dependencies": { "find-cache-dir": "^3.3.1", @@ -3590,6 +4217,8 @@ }, "node_modules/babel-loader/node_modules/loader-utils": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "license": "MIT", "dependencies": { "big.js": "^5.2.2", @@ -3602,6 +4231,8 @@ }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "license": "BSD-3-Clause", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", @@ -3616,6 +4247,8 @@ }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", "license": "MIT", "dependencies": { "@babel/compat-data": "^7.17.7", @@ -3628,6 +4261,8 @@ }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -3635,6 +4270,8 @@ }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", + "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.3.2", @@ -3646,6 +4283,8 @@ }, "node_modules/babel-plugin-polyfill-regenerator": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.3.3" @@ -3656,10 +4295,14 @@ }, "node_modules/balanced-match": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -3678,6 +4321,8 @@ }, "node_modules/base64id": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "devOptional": true, "license": "MIT", "engines": { @@ -3686,10 +4331,14 @@ }, "node_modules/batch": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "license": "MIT" }, "node_modules/big.js": { "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "license": "MIT", "engines": { "node": "*" @@ -3697,6 +4346,8 @@ }, "node_modules/binary-extensions": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "license": "MIT", "engines": { "node": ">=8" @@ -3707,6 +4358,8 @@ }, "node_modules/bl": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", "dependencies": { "buffer": "^5.5.0", @@ -3716,6 +4369,8 @@ }, "node_modules/body-parser": { "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "license": "MIT", "dependencies": { "bytes": "3.1.2", @@ -3738,6 +4393,8 @@ }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -3745,10 +4402,14 @@ }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/bonjour-service": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -3757,10 +4418,14 @@ }, "node_modules/boolbase": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "license": "ISC" }, "node_modules/brace-expansion": { - "version": "2.0.2", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -3768,6 +4433,8 @@ }, "node_modules/braces": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -3777,7 +4444,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.1", + "version": "4.24.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", + "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", "funding": [ { "type": "opencollective", @@ -3794,8 +4463,8 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", + "caniuse-lite": "^1.0.30001716", + "electron-to-chromium": "^1.5.149", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, @@ -3808,6 +4477,8 @@ }, "node_modules/buffer": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -3830,10 +4501,14 @@ }, "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==", "license": "MIT" }, "node_modules/builtin-modules": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "license": "MIT", "engines": { "node": ">=6" @@ -3844,6 +4519,8 @@ }, "node_modules/builtins": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", + "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", "dev": true, "license": "MIT", "dependencies": { @@ -3852,6 +4529,8 @@ }, "node_modules/bytes": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -3859,6 +4538,8 @@ }, "node_modules/cacache": { "version": "16.1.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.2.tgz", + "integrity": "sha512-Xx+xPlfCZIUHagysjjOAje9nRo8pRDczQCcXb4J2O0BLtH+xeVue6ba4y1kfJfQMAnM2mkcoMIAyOctlaRGWYA==", "license": "ISC", "dependencies": { "@npmcli/fs": "^2.1.0", @@ -3886,6 +4567,8 @@ }, "node_modules/cacache/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "license": "ISC", "engines": { "node": ">=12" @@ -3893,6 +4576,8 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -3904,6 +4589,8 @@ }, "node_modules/call-bound": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -3918,6 +4605,8 @@ }, "node_modules/callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "license": "MIT", "engines": { "node": ">=6" @@ -3925,13 +4614,17 @@ }, "node_modules/camelcase": { "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001731", + "version": "1.0.30001718", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", + "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", "funding": [ { "type": "opencollective", @@ -3950,6 +4643,8 @@ }, "node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -3964,10 +4659,14 @@ }, "node_modules/chardet": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "license": "MIT" }, "node_modules/chokidar": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "license": "MIT", "dependencies": { "anymatch": "~3.1.2", @@ -3990,6 +4689,8 @@ }, "node_modules/chownr": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "license": "ISC", "engines": { "node": ">=10" @@ -3997,6 +4698,8 @@ }, "node_modules/chrome-trace-event": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "license": "MIT", "engines": { "node": ">=6.0" @@ -4004,6 +4707,8 @@ }, "node_modules/clean-stack": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "license": "MIT", "engines": { "node": ">=6" @@ -4011,6 +4716,8 @@ }, "node_modules/cli-cursor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" @@ -4021,6 +4728,8 @@ }, "node_modules/cli-spinners": { "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "license": "MIT", "engines": { "node": ">=6" @@ -4031,6 +4740,8 @@ }, "node_modules/cli-width": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "license": "ISC", "engines": { "node": ">= 10" @@ -4038,6 +4749,8 @@ }, "node_modules/cliui": { "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "license": "ISC", "dependencies": { "string-width": "^4.2.0", @@ -4047,6 +4760,8 @@ }, "node_modules/clone": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "license": "MIT", "engines": { "node": ">=0.8" @@ -4054,6 +4769,8 @@ }, "node_modules/clone-deep": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", @@ -4066,6 +4783,8 @@ }, "node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -4076,10 +4795,14 @@ }, "node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/color-support": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true, "license": "ISC", "bin": { @@ -4088,10 +4811,14 @@ }, "node_modules/colorette": { "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "license": "MIT" }, "node_modules/commander": { "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "license": "MIT", "engines": { "node": "^12.20.0 || >=14" @@ -4099,10 +4826,14 @@ }, "node_modules/commondir": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "license": "MIT" }, "node_modules/compressible": { "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" @@ -4112,14 +4843,16 @@ } }, "node_modules/compression": { - "version": "1.8.1", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz", + "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", "license": "MIT", "dependencies": { "bytes": "3.1.2", "compressible": "~2.0.18", "debug": "2.6.9", "negotiator": "~0.6.4", - "on-headers": "~1.1.0", + "on-headers": "~1.0.2", "safe-buffer": "5.2.1", "vary": "~1.1.2" }, @@ -4129,6 +4862,8 @@ }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -4136,14 +4871,20 @@ }, "node_modules/compression/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, "node_modules/connect": { "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4158,6 +4899,8 @@ }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "license": "MIT", "engines": { "node": ">=0.8" @@ -4165,6 +4908,8 @@ }, "node_modules/connect/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4173,16 +4918,22 @@ }, "node_modules/connect/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "devOptional": true, "license": "MIT" }, "node_modules/console-control-strings": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true, "license": "ISC" }, "node_modules/content-disposition": { "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" @@ -4193,6 +4944,8 @@ }, "node_modules/content-type": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -4200,10 +4953,14 @@ }, "node_modules/convert-source-map": { "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "license": "MIT" }, "node_modules/cookie": { "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "devOptional": true, "license": "MIT", "engines": { @@ -4212,10 +4969,14 @@ }, "node_modules/cookie-signature": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "license": "MIT" }, "node_modules/copy-anything": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", "license": "MIT", "dependencies": { "is-what": "^3.14.1" @@ -4226,6 +4987,8 @@ }, "node_modules/copy-webpack-plugin": { "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "license": "MIT", "dependencies": { "fast-glob": "^3.2.11", @@ -4248,6 +5011,8 @@ }, "node_modules/copy-webpack-plugin/node_modules/glob-parent": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "license": "ISC", "dependencies": { "is-glob": "^4.0.3" @@ -4258,6 +5023,8 @@ }, "node_modules/copy-webpack-plugin/node_modules/schema-utils": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -4274,10 +5041,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.45.0", + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.42.0.tgz", + "integrity": "sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==", "license": "MIT", "dependencies": { - "browserslist": "^4.25.1" + "browserslist": "^4.24.4" }, "funding": { "type": "opencollective", @@ -4286,10 +5055,14 @@ }, "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==", "license": "MIT" }, "node_modules/cors": { "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4302,6 +5075,8 @@ }, "node_modules/cosmiconfig": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", @@ -4316,6 +5091,8 @@ }, "node_modules/critters": { "version": "0.0.16", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", + "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", "license": "Apache-2.0", "dependencies": { "chalk": "^4.1.0", @@ -4328,10 +5105,14 @@ }, "node_modules/critters/node_modules/parse5": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -4344,6 +5125,8 @@ }, "node_modules/cross-spawn/node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -4357,6 +5140,8 @@ }, "node_modules/css-blank-pseudo": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" @@ -4373,6 +5158,8 @@ }, "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -4384,6 +5171,8 @@ }, "node_modules/css-has-pseudo": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" @@ -4400,6 +5189,8 @@ }, "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -4411,6 +5202,8 @@ }, "node_modules/css-loader": { "version": "6.7.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", + "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", @@ -4435,6 +5228,8 @@ }, "node_modules/css-prefers-color-scheme": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", "license": "CC0-1.0", "bin": { "css-prefers-color-scheme": "dist/cli.cjs" @@ -4448,6 +5243,8 @@ }, "node_modules/css-select": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -4461,7 +5258,9 @@ } }, "node_modules/css-what": { - "version": "6.2.2", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "license": "BSD-2-Clause", "engines": { "node": ">= 6" @@ -4472,6 +5271,8 @@ }, "node_modules/cssdb": { "version": "7.11.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", + "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==", "funding": [ { "type": "opencollective", @@ -4486,6 +5287,8 @@ }, "node_modules/cssesc": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "license": "MIT", "bin": { "cssesc": "bin/cssesc" @@ -4496,15 +5299,21 @@ }, "node_modules/cuint": { "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==", "license": "MIT" }, "node_modules/custom-event": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", "devOptional": true, "license": "MIT" }, "node_modules/date-format": { "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", "devOptional": true, "license": "MIT", "engines": { @@ -4513,6 +5322,8 @@ }, "node_modules/debug": { "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "license": "MIT", "dependencies": { "ms": "2.1.2" @@ -4528,6 +5339,8 @@ }, "node_modules/decode-uri-component": { "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "license": "MIT", "engines": { "node": ">=0.10" @@ -4535,6 +5348,8 @@ }, "node_modules/deepmerge": { "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -4542,6 +5357,8 @@ }, "node_modules/default-gateway": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "license": "BSD-2-Clause", "dependencies": { "execa": "^5.0.0" @@ -4552,6 +5369,8 @@ }, "node_modules/defaults": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "license": "MIT", "dependencies": { "clone": "^1.0.2" @@ -4562,6 +5381,8 @@ }, "node_modules/define-lazy-prop": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "license": "MIT", "engines": { "node": ">=8" @@ -4569,11 +5390,15 @@ }, "node_modules/delegates": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true, "license": "MIT" }, "node_modules/depd": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -4581,6 +5406,8 @@ }, "node_modules/dependency-graph": { "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", "license": "MIT", "engines": { "node": ">= 0.6.0" @@ -4588,6 +5415,8 @@ }, "node_modules/destroy": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "license": "MIT", "engines": { "node": ">= 0.8", @@ -4596,15 +5425,21 @@ }, "node_modules/detect-node": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "license": "MIT" }, "node_modules/di": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", "devOptional": true, "license": "MIT" }, "node_modules/dir-glob": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "license": "MIT", "dependencies": { "path-type": "^4.0.0" @@ -4615,6 +5450,8 @@ }, "node_modules/dns-packet": { "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "license": "MIT", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" @@ -4625,6 +5462,8 @@ }, "node_modules/dom-serialize": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4636,6 +5475,8 @@ }, "node_modules/dom-serializer": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", @@ -4648,6 +5489,8 @@ }, "node_modules/domelementtype": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", @@ -4658,6 +5501,8 @@ }, "node_modules/domhandler": { "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.2.0" @@ -4671,6 +5516,8 @@ }, "node_modules/domutils": { "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^1.0.1", @@ -4683,6 +5530,8 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -4695,18 +5544,26 @@ }, "node_modules/ee-first": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.195", + "version": "1.5.159", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.159.tgz", + "integrity": "sha512-CEvHptWAMV5p6GJ0Lq8aheyvVbfzVrv5mmidu1D3pidoVNkB3tTBsTMVtPJ+rzRK5oV229mCLz9Zj/hNvU8GBA==", "license": "ISC" }, "node_modules/emoji-regex": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, "node_modules/emojis-list": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "license": "MIT", "engines": { "node": ">= 4" @@ -4714,6 +5571,8 @@ }, "node_modules/encodeurl": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -4721,6 +5580,8 @@ }, "node_modules/encoding": { "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, "license": "MIT", "optional": true, @@ -4730,6 +5591,8 @@ }, "node_modules/encoding/node_modules/iconv-lite": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "license": "MIT", "optional": true, @@ -4742,6 +5605,8 @@ }, "node_modules/engine.io": { "version": "6.6.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", + "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4761,6 +5626,8 @@ }, "node_modules/engine.io-parser": { "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "devOptional": true, "license": "MIT", "engines": { @@ -4768,7 +5635,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.2", + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -4780,6 +5649,8 @@ }, "node_modules/ent": { "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.2.tgz", + "integrity": "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4794,6 +5665,8 @@ }, "node_modules/entities": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" @@ -4801,6 +5674,8 @@ }, "node_modules/env-paths": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, "license": "MIT", "engines": { @@ -4809,11 +5684,15 @@ }, "node_modules/err-code": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true, "license": "MIT" }, "node_modules/errno": { "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "license": "MIT", "optional": true, "dependencies": { @@ -4825,6 +5704,8 @@ }, "node_modules/error-ex": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" @@ -4832,6 +5713,8 @@ }, "node_modules/es-define-property": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4839,6 +5722,8 @@ }, "node_modules/es-errors": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4846,10 +5731,14 @@ }, "node_modules/es-module-lexer": { "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -4860,6 +5749,8 @@ }, "node_modules/esbuild": { "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.5.tgz", + "integrity": "sha512-VSf6S1QVqvxfIsSKb3UKr3VhUCis7wgDbtF4Vd9z84UJr05/Sp2fRKmzC+CSPG/dNAPPJZ0BTBLTT1Fhd6N9Gg==", "hasInstallScript": true, "license": "MIT", "optional": true, @@ -4893,8 +5784,58 @@ "esbuild-windows-arm64": "0.15.5" } }, + "node_modules/esbuild-android-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz", + "integrity": "sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz", + "integrity": "sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz", + "integrity": "sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/esbuild-darwin-arm64": { "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz", + "integrity": "sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg==", "cpu": [ "arm64" ], @@ -4907,8 +5848,218 @@ "node": ">=12" } }, + "node_modules/esbuild-freebsd-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz", + "integrity": "sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz", + "integrity": "sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz", + "integrity": "sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz", + "integrity": "sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz", + "integrity": "sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz", + "integrity": "sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz", + "integrity": "sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz", + "integrity": "sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz", + "integrity": "sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz", + "integrity": "sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz", + "integrity": "sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz", + "integrity": "sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz", + "integrity": "sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/esbuild-wasm": { "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.15.5.tgz", + "integrity": "sha512-lTJOEKekN/4JI/eOEq0wLcx53co2N6vaT/XjBz46D1tvIVoUEyM0o2K6txW6gEotf31szFD/J1PbxmnbkGlK9A==", "license": "MIT", "bin": { "esbuild": "bin/esbuild" @@ -4917,8 +6068,58 @@ "node": ">=12" } }, + "node_modules/esbuild-windows-32": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz", + "integrity": "sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz", + "integrity": "sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz", + "integrity": "sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/escalade": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", "engines": { "node": ">=6" @@ -4926,10 +6127,14 @@ }, "node_modules/escape-html": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "license": "MIT", "engines": { "node": ">=0.8.0" @@ -4937,6 +6142,8 @@ }, "node_modules/eslint-scope": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -4948,6 +6155,8 @@ }, "node_modules/esprima": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -4959,6 +6168,8 @@ }, "node_modules/esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -4969,6 +6180,8 @@ }, "node_modules/esrecurse/node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -4976,6 +6189,8 @@ }, "node_modules/estraverse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -4983,10 +6198,14 @@ }, "node_modules/estree-walker": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" @@ -4994,6 +6213,8 @@ }, "node_modules/etag": { "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -5001,14 +6222,20 @@ }, "node_modules/eventemitter-asyncresource": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", "license": "MIT" }, "node_modules/eventemitter3": { "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "license": "MIT" }, "node_modules/events": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "license": "MIT", "engines": { "node": ">=0.8.x" @@ -5016,6 +6243,8 @@ }, "node_modules/execa": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", @@ -5037,11 +6266,15 @@ }, "node_modules/exponential-backoff": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", "dev": true, "license": "Apache-2.0" }, "node_modules/express": { "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", @@ -5086,6 +6319,8 @@ }, "node_modules/express/node_modules/cookie": { "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -5093,6 +6328,8 @@ }, "node_modules/express/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -5100,6 +6337,8 @@ }, "node_modules/express/node_modules/encodeurl": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -5107,6 +6346,8 @@ }, "node_modules/express/node_modules/finalhandler": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "license": "MIT", "dependencies": { "debug": "2.6.9", @@ -5123,10 +6364,14 @@ }, "node_modules/express/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/express/node_modules/statuses": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -5134,11 +6379,15 @@ }, "node_modules/extend": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "devOptional": true, "license": "MIT" }, "node_modules/external-editor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "license": "MIT", "dependencies": { "chardet": "^0.7.0", @@ -5151,10 +6400,14 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -5169,10 +6422,14 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "license": "MIT" }, "node_modules/fastq": { "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -5180,6 +6437,8 @@ }, "node_modules/faye-websocket": { "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" @@ -5190,6 +6449,8 @@ }, "node_modules/figures": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" @@ -5203,6 +6464,8 @@ }, "node_modules/fill-range": { "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -5213,6 +6476,8 @@ }, "node_modules/finalhandler": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5230,6 +6495,8 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5238,11 +6505,15 @@ }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "devOptional": true, "license": "MIT" }, "node_modules/finalhandler/node_modules/on-finished": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5254,6 +6525,8 @@ }, "node_modules/find-cache-dir": { "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "license": "MIT", "dependencies": { "commondir": "^1.0.1", @@ -5269,6 +6542,8 @@ }, "node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "license": "MIT", "dependencies": { "locate-path": "^5.0.0", @@ -5280,11 +6555,15 @@ }, "node_modules/flatted": { "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "devOptional": true, "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.11", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", @@ -5303,6 +6582,8 @@ }, "node_modules/forwarded": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -5310,6 +6591,8 @@ }, "node_modules/fraction.js": { "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "license": "MIT", "engines": { "node": "*" @@ -5321,6 +6604,8 @@ }, "node_modules/fresh": { "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -5328,6 +6613,8 @@ }, "node_modules/fs-extra": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5341,6 +6628,8 @@ }, "node_modules/fs-minipass": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -5350,15 +6639,22 @@ } }, "node_modules/fs-monkey": { - "version": "1.1.0", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", "license": "Unlicense" }, "node_modules/fs.realpath": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ @@ -5370,6 +6666,8 @@ }, "node_modules/function-bind": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5377,6 +6675,9 @@ }, "node_modules/gauge": { "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", "dev": true, "license": "ISC", "dependencies": { @@ -5395,6 +6696,8 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -5402,6 +6705,8 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" @@ -5409,6 +6714,8 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -5431,6 +6738,8 @@ }, "node_modules/get-package-type": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "license": "MIT", "engines": { "node": ">=8.0.0" @@ -5438,6 +6747,8 @@ }, "node_modules/get-proto": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -5449,6 +6760,8 @@ }, "node_modules/get-stream": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "license": "MIT", "engines": { "node": ">=10" @@ -5459,6 +6772,9 @@ }, "node_modules/glob": { "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -5476,6 +6792,8 @@ }, "node_modules/glob-parent": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -5486,10 +6804,23 @@ }, "node_modules/glob-to-regexp": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "license": "BSD-2-Clause" }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/globby": { "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "license": "MIT", "dependencies": { "dir-glob": "^3.0.1", @@ -5507,6 +6838,8 @@ }, "node_modules/gopd": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -5517,14 +6850,20 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, "node_modules/handle-thing": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "license": "MIT" }, "node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -5532,6 +6871,8 @@ }, "node_modules/has-symbols": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -5542,6 +6883,8 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5556,11 +6899,15 @@ }, "node_modules/has-unicode": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true, "license": "ISC" }, "node_modules/hasown": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -5571,6 +6918,8 @@ }, "node_modules/hdr-histogram-js": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", "license": "BSD", "dependencies": { "@assemblyscript/loader": "^0.10.1", @@ -5580,10 +6929,14 @@ }, "node_modules/hdr-histogram-percentiles-obj": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", "license": "MIT" }, "node_modules/hosted-git-info": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, "license": "ISC", "dependencies": { @@ -5595,6 +6948,8 @@ }, "node_modules/hosted-git-info/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "license": "ISC", "engines": { @@ -5603,6 +6958,8 @@ }, "node_modules/hpack.js": { "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "license": "MIT", "dependencies": { "inherits": "^2.0.1", @@ -5613,6 +6970,8 @@ }, "node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", @@ -5626,10 +6985,14 @@ }, "node_modules/hpack.js/node_modules/safe-buffer": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" @@ -5637,6 +7000,8 @@ }, "node_modules/html-entities": { "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", "funding": [ { "type": "github", @@ -5651,20 +7016,28 @@ }, "node_modules/html-escaper": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, "node_modules/http-cache-semantics": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "dev": true, "license": "BSD-2-Clause" }, "node_modules/http-deceiver": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "license": "MIT" }, "node_modules/http-errors": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "license": "MIT", "dependencies": { "depd": "2.0.0", @@ -5679,6 +7052,8 @@ }, "node_modules/http-errors/node_modules/statuses": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -5686,10 +7061,14 @@ }, "node_modules/http-parser-js": { "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", "license": "MIT" }, "node_modules/http-proxy": { "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", @@ -5702,6 +7081,8 @@ }, "node_modules/http-proxy-agent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, "license": "MIT", "dependencies": { @@ -5715,6 +7096,8 @@ }, "node_modules/http-proxy-middleware": { "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", @@ -5737,6 +7120,8 @@ }, "node_modules/https-proxy-agent": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "license": "MIT", "dependencies": { "agent-base": "6", @@ -5748,6 +7133,8 @@ }, "node_modules/human-signals": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "license": "Apache-2.0", "engines": { "node": ">=10.17.0" @@ -5755,6 +7142,8 @@ }, "node_modules/humanize-ms": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5763,6 +7152,8 @@ }, "node_modules/iconv-lite": { "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" @@ -5773,6 +7164,8 @@ }, "node_modules/icss-utils": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" @@ -5783,6 +7176,8 @@ }, "node_modules/ieee754": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -5801,6 +7196,8 @@ }, "node_modules/ignore": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "license": "MIT", "engines": { "node": ">= 4" @@ -5808,6 +7205,8 @@ }, "node_modules/ignore-walk": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", + "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", "dev": true, "license": "ISC", "dependencies": { @@ -5819,6 +7218,8 @@ }, "node_modules/image-size": { "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "license": "MIT", "optional": true, "bin": { @@ -5830,10 +7231,14 @@ }, "node_modules/immutable": { "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -5848,6 +7253,8 @@ }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "license": "MIT", "engines": { "node": ">=4" @@ -5855,6 +7262,8 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "license": "MIT", "engines": { "node": ">=0.8.19" @@ -5862,6 +7271,8 @@ }, "node_modules/indent-string": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "license": "MIT", "engines": { "node": ">=8" @@ -5869,10 +7280,15 @@ }, "node_modules/infer-owner": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", "license": "ISC" }, "node_modules/inflight": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -5881,10 +7297,14 @@ }, "node_modules/inherits": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/ini": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.0.tgz", + "integrity": "sha512-TxYQaeNW/N8ymDvwAxPyRbhMBtnEwuvaTYpOQkFx1nSeusgezHniEc/l35Vo4iCq/mMiTJbpD7oYxN98hFlfmw==", "dev": true, "license": "ISC", "engines": { @@ -5893,6 +7313,8 @@ }, "node_modules/injection-js": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.5.0.tgz", + "integrity": "sha512-UpY2ONt4xbht4GhSqQ2zMJ1rBIQq4uOY+DlR6aOeYyqK7xadXt7UQbJIyxmgk288bPMkIZKjViieHm0O0i72Jw==", "license": "MIT", "dependencies": { "tslib": "^2.0.0" @@ -5900,6 +7322,8 @@ }, "node_modules/inquirer": { "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", "license": "MIT", "dependencies": { "ansi-escapes": "^4.2.1", @@ -5924,6 +7348,8 @@ }, "node_modules/ip-address": { "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", "dev": true, "license": "MIT", "dependencies": { @@ -5936,11 +7362,15 @@ }, "node_modules/ip-address/node_modules/sprintf-js": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/ipaddr.js": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "license": "MIT", "engines": { "node": ">= 10" @@ -5948,10 +7378,14 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "license": "MIT" }, "node_modules/is-binary-path": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" @@ -5962,6 +7396,8 @@ }, "node_modules/is-builtin-module": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "license": "MIT", "dependencies": { "builtin-modules": "^3.3.0" @@ -5975,6 +7411,8 @@ }, "node_modules/is-core-module": { "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -5988,6 +7426,8 @@ }, "node_modules/is-docker": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "license": "MIT", "bin": { "is-docker": "cli.js" @@ -6001,6 +7441,8 @@ }, "node_modules/is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -6008,6 +7450,8 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", "engines": { "node": ">=8" @@ -6015,6 +7459,8 @@ }, "node_modules/is-glob": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -6025,6 +7471,8 @@ }, "node_modules/is-interactive": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "license": "MIT", "engines": { "node": ">=8" @@ -6032,15 +7480,21 @@ }, "node_modules/is-lambda": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true, "license": "MIT" }, "node_modules/is-module": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "license": "MIT" }, "node_modules/is-number": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "license": "MIT", "engines": { "node": ">=0.12.0" @@ -6048,6 +7502,8 @@ }, "node_modules/is-plain-obj": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "license": "MIT", "engines": { "node": ">=10" @@ -6058,6 +7514,8 @@ }, "node_modules/is-plain-object": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "license": "MIT", "dependencies": { "isobject": "^3.0.1" @@ -6068,6 +7526,8 @@ }, "node_modules/is-reference": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", "license": "MIT", "dependencies": { "@types/estree": "*" @@ -6075,6 +7535,8 @@ }, "node_modules/is-regex": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "devOptional": true, "license": "MIT", "dependencies": { @@ -6092,6 +7554,8 @@ }, "node_modules/is-stream": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "license": "MIT", "engines": { "node": ">=8" @@ -6102,6 +7566,8 @@ }, "node_modules/is-unicode-supported": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "license": "MIT", "engines": { "node": ">=10" @@ -6112,10 +7578,14 @@ }, "node_modules/is-what": { "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", "license": "MIT" }, "node_modules/is-wsl": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "license": "MIT", "dependencies": { "is-docker": "^2.0.0" @@ -6126,10 +7596,14 @@ }, "node_modules/isarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT" }, "node_modules/isbinaryfile": { "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", "devOptional": true, "license": "MIT", "engines": { @@ -6141,10 +7615,14 @@ }, "node_modules/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -6152,6 +7630,8 @@ }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "license": "BSD-3-Clause", "engines": { "node": ">=8" @@ -6159,6 +7639,8 @@ }, "node_modules/istanbul-lib-instrument": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", @@ -6173,6 +7655,8 @@ }, "node_modules/istanbul-lib-instrument/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -6180,6 +7664,8 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -6193,6 +7679,8 @@ }, "node_modules/istanbul-lib-report/node_modules/make-dir": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { @@ -6207,6 +7695,8 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -6220,6 +7710,8 @@ }, "node_modules/istanbul-lib-source-maps/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -6228,6 +7720,8 @@ }, "node_modules/istanbul-reports": { "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -6240,11 +7734,15 @@ }, "node_modules/jasmine-core": { "version": "4.6.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.1.tgz", + "integrity": "sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==", "dev": true, "license": "MIT" }, "node_modules/jest-worker": { "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -6257,6 +7755,8 @@ }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -6270,10 +7770,14 @@ }, "node_modules/js-tokens": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "license": "MIT" }, "node_modules/js-yaml": { "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "license": "MIT", "dependencies": { "argparse": "^1.0.7", @@ -6285,11 +7789,15 @@ }, "node_modules/jsbn": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", "dev": true, "license": "MIT" }, "node_modules/jsesc": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -6300,14 +7808,20 @@ }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "license": "MIT", "bin": { "json5": "lib/cli.js" @@ -6318,10 +7832,14 @@ }, "node_modules/jsonc-parser": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", + "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", "license": "MIT" }, "node_modules/jsonfile": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "devOptional": true, "license": "MIT", "optionalDependencies": { @@ -6330,6 +7848,8 @@ }, "node_modules/jsonparse": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true, "engines": [ "node >= 0.2.0" @@ -6338,6 +7858,8 @@ }, "node_modules/karma": { "version": "6.4.3", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.3.tgz", + "integrity": "sha512-LuucC/RE92tJ8mlCwqEoRWXP38UMAqpnq98vktmS9SznSoUPPUJQbc91dHcxcunROvfQjdORVA/YFviH+Xci9Q==", "devOptional": true, "license": "MIT", "dependencies": { @@ -6375,6 +7897,8 @@ }, "node_modules/karma-chrome-launcher": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", + "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", "dev": true, "license": "MIT", "dependencies": { @@ -6383,6 +7907,8 @@ }, "node_modules/karma-coverage": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", + "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", "dev": true, "license": "MIT", "dependencies": { @@ -6398,7 +7924,9 @@ } }, "node_modules/karma-coverage/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", "dependencies": { @@ -6408,6 +7936,8 @@ }, "node_modules/karma-coverage/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -6419,6 +7949,8 @@ }, "node_modules/karma-jasmine": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", + "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6433,6 +7965,8 @@ }, "node_modules/karma-jasmine-html-reporter": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", + "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -6443,13 +7977,17 @@ }, "node_modules/karma-source-map-support": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", "license": "MIT", "dependencies": { "source-map-support": "^0.5.5" } }, "node_modules/karma/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -6459,6 +7997,9 @@ }, "node_modules/karma/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "devOptional": true, "license": "ISC", "dependencies": { @@ -6478,6 +8019,8 @@ }, "node_modules/karma/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "devOptional": true, "license": "ISC", "dependencies": { @@ -6489,6 +8032,8 @@ }, "node_modules/karma/node_modules/mkdirp": { "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -6500,6 +8045,8 @@ }, "node_modules/karma/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "devOptional": true, "license": "BSD-3-Clause", "engines": { @@ -6508,6 +8055,8 @@ }, "node_modules/karma/node_modules/tmp": { "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "devOptional": true, "license": "MIT", "engines": { @@ -6516,6 +8065,8 @@ }, "node_modules/karma/node_modules/yargs": { "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -6533,6 +8084,8 @@ }, "node_modules/karma/node_modules/yargs-parser": { "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "devOptional": true, "license": "ISC", "engines": { @@ -6541,6 +8094,8 @@ }, "node_modules/kind-of": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -6548,6 +8103,8 @@ }, "node_modules/klona": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "license": "MIT", "engines": { "node": ">= 8" @@ -6555,6 +8112,8 @@ }, "node_modules/less": { "version": "4.1.3", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", "license": "Apache-2.0", "dependencies": { "copy-anything": "^2.0.1", @@ -6579,6 +8138,8 @@ }, "node_modules/less-loader": { "version": "11.0.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.0.0.tgz", + "integrity": "sha512-9+LOWWjuoectIEx3zrfN83NAGxSUB5pWEabbbidVQVgZhN+wN68pOvuyirVlH1IK4VT1f3TmlyvAnCXh8O5KEw==", "license": "MIT", "dependencies": { "klona": "^2.0.4" @@ -6597,6 +8158,8 @@ }, "node_modules/less/node_modules/make-dir": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "license": "MIT", "optional": true, "dependencies": { @@ -6609,6 +8172,8 @@ }, "node_modules/less/node_modules/mime": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "license": "MIT", "optional": true, "bin": { @@ -6620,6 +8185,8 @@ }, "node_modules/less/node_modules/pify": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "license": "MIT", "optional": true, "engines": { @@ -6628,6 +8195,8 @@ }, "node_modules/less/node_modules/semver": { "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "license": "ISC", "optional": true, "bin": { @@ -6636,6 +8205,8 @@ }, "node_modules/less/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", "optional": true, "engines": { @@ -6644,6 +8215,8 @@ }, "node_modules/license-webpack-plugin": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", "license": "ISC", "dependencies": { "webpack-sources": "^3.0.0" @@ -6659,10 +8232,14 @@ }, "node_modules/lines-and-columns": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "license": "MIT" }, "node_modules/loader-runner": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "license": "MIT", "engines": { "node": ">=6.11.5" @@ -6670,6 +8247,8 @@ }, "node_modules/loader-utils": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", "license": "MIT", "engines": { "node": ">= 12.13.0" @@ -6677,6 +8256,8 @@ }, "node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "license": "MIT", "dependencies": { "p-locate": "^4.1.0" @@ -6687,14 +8268,20 @@ }, "node_modules/lodash": { "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "license": "MIT", "dependencies": { "chalk": "^4.1.0", @@ -6709,6 +8296,8 @@ }, "node_modules/log4js": { "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -6724,6 +8313,8 @@ }, "node_modules/lru-cache": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "license": "ISC", "dependencies": { "yallist": "^3.0.2" @@ -6731,6 +8322,8 @@ }, "node_modules/magic-string": { "version": "0.26.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", + "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", "license": "MIT", "dependencies": { "sourcemap-codec": "^1.4.8" @@ -6741,6 +8334,8 @@ }, "node_modules/make-dir": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "license": "MIT", "dependencies": { "semver": "^6.0.0" @@ -6754,6 +8349,8 @@ }, "node_modules/make-dir/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -6761,6 +8358,8 @@ }, "node_modules/make-fetch-happen": { "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", "dev": true, "license": "ISC", "dependencies": { @@ -6787,6 +8386,8 @@ }, "node_modules/make-fetch-happen/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "license": "ISC", "engines": { @@ -6795,6 +8396,8 @@ }, "node_modules/math-intrinsics": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -6802,6 +8405,8 @@ }, "node_modules/media-typer": { "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -6809,6 +8414,8 @@ }, "node_modules/memfs": { "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "license": "Unlicense", "dependencies": { "fs-monkey": "^1.0.4" @@ -6819,6 +8426,8 @@ }, "node_modules/merge-descriptors": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6826,10 +8435,14 @@ }, "node_modules/merge-stream": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "license": "MIT", "engines": { "node": ">= 8" @@ -6837,6 +8450,8 @@ }, "node_modules/methods": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -6844,6 +8459,8 @@ }, "node_modules/micromatch": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -6855,6 +8472,8 @@ }, "node_modules/micromatch/node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -6865,6 +8484,8 @@ }, "node_modules/mime": { "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "devOptional": true, "license": "MIT", "bin": { @@ -6876,6 +8497,8 @@ }, "node_modules/mime-db": { "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -6883,6 +8506,8 @@ }, "node_modules/mime-types": { "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -6893,6 +8518,8 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "license": "MIT", "engines": { "node": ">=6" @@ -6900,6 +8527,8 @@ }, "node_modules/mini-css-extract-plugin": { "version": "2.6.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", + "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", "license": "MIT", "dependencies": { "schema-utils": "^4.0.0" @@ -6917,6 +8546,8 @@ }, "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -6934,10 +8565,14 @@ }, "node_modules/minimalistic-assert": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "license": "ISC" }, "node_modules/minimatch": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -6948,6 +8583,8 @@ }, "node_modules/minimist": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "devOptional": true, "license": "MIT", "funding": { @@ -6956,6 +8593,8 @@ }, "node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -6966,6 +8605,8 @@ }, "node_modules/minipass-collect": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -6976,6 +8617,8 @@ }, "node_modules/minipass-fetch": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "dev": true, "license": "MIT", "dependencies": { @@ -6992,6 +8635,8 @@ }, "node_modules/minipass-flush": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -7002,6 +8647,8 @@ }, "node_modules/minipass-json-stream": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.2.tgz", + "integrity": "sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg==", "dev": true, "license": "MIT", "dependencies": { @@ -7011,6 +8658,8 @@ }, "node_modules/minipass-pipeline": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -7021,6 +8670,8 @@ }, "node_modules/minipass-sized": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, "license": "ISC", "dependencies": { @@ -7032,10 +8683,14 @@ }, "node_modules/minipass/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/minizlib": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "license": "MIT", "dependencies": { "minipass": "^3.0.0", @@ -7047,10 +8702,14 @@ }, "node_modules/minizlib/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/mkdirp": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" @@ -7061,10 +8720,14 @@ }, "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==", "license": "MIT" }, "node_modules/multicast-dns": { "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "license": "MIT", "dependencies": { "dns-packet": "^5.2.2", @@ -7076,10 +8739,14 @@ }, "node_modules/mute-stream": { "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "license": "ISC" }, "node_modules/nanoid": { "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", @@ -7096,6 +8763,8 @@ }, "node_modules/needle": { "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", "license": "MIT", "optional": true, "dependencies": { @@ -7111,6 +8780,8 @@ }, "node_modules/needle/node_modules/iconv-lite": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "optional": true, "dependencies": { @@ -7122,6 +8793,8 @@ }, "node_modules/negotiator": { "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -7129,10 +8802,14 @@ }, "node_modules/neo-async": { "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "license": "MIT" }, "node_modules/ng-packagr": { "version": "14.2.0", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-14.2.0.tgz", + "integrity": "sha512-Nb+2/L37CFcWmCz91USwNd87mdTfTXDb4MBl87Dkj2H53KfrAltX2psa+gTRbjE5USCX8bQeu4nRzf/Bp6Vivg==", "license": "MIT", "dependencies": { "@rollup/plugin-json": "^4.1.0", @@ -7177,6 +8854,8 @@ }, "node_modules/ng-packagr/node_modules/@rollup/plugin-node-resolve": { "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", + "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", "license": "MIT", "dependencies": { "@rollup/pluginutils": "^3.1.0", @@ -7195,6 +8874,8 @@ }, "node_modules/ng-packagr/node_modules/@rollup/pluginutils": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "license": "MIT", "dependencies": { "@types/estree": "0.0.39", @@ -7210,10 +8891,14 @@ }, "node_modules/ng-packagr/node_modules/@types/estree": { "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "license": "MIT" }, "node_modules/ng-packagr/node_modules/@types/resolve": { "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -7221,10 +8906,14 @@ }, "node_modules/ng-packagr/node_modules/estree-walker": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "license": "MIT" }, "node_modules/ng-packagr/node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -7233,8 +8922,32 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "!win32" + ], + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "license": "MIT", + "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==", "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" @@ -7242,6 +8955,8 @@ }, "node_modules/node-gyp": { "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7264,8 +8979,22 @@ "node": "^12.13 || ^14.13 || >=16" } }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", "dependencies": { @@ -7275,6 +9004,9 @@ }, "node_modules/node-gyp/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -7294,6 +9026,8 @@ }, "node_modules/node-gyp/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -7305,6 +9039,8 @@ }, "node_modules/node-gyp/node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { @@ -7319,10 +9055,14 @@ }, "node_modules/node-releases": { "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "license": "MIT" }, "node_modules/nopt": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "dev": true, "license": "ISC", "dependencies": { @@ -7337,6 +9077,8 @@ }, "node_modules/normalize-package-data": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", + "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -7351,6 +9093,8 @@ }, "node_modules/normalize-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -7358,6 +9102,8 @@ }, "node_modules/normalize-range": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -7365,6 +9111,8 @@ }, "node_modules/npm-bundled": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", "dev": true, "license": "ISC", "dependencies": { @@ -7373,6 +9121,8 @@ }, "node_modules/npm-install-checks": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz", + "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -7384,11 +9134,15 @@ }, "node_modules/npm-normalize-package-bin": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "dev": true, "license": "ISC" }, "node_modules/npm-package-arg": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", + "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", "dev": true, "license": "ISC", "dependencies": { @@ -7403,6 +9157,8 @@ }, "node_modules/npm-packlist": { "version": "5.1.3", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", + "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", "dev": true, "license": "ISC", "dependencies": { @@ -7420,6 +9176,8 @@ }, "node_modules/npm-packlist/node_modules/npm-bundled": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", + "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", "dev": true, "license": "ISC", "dependencies": { @@ -7431,6 +9189,8 @@ }, "node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "dev": true, "license": "ISC", "engines": { @@ -7439,6 +9199,8 @@ }, "node_modules/npm-pick-manifest": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz", + "integrity": "sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg==", "dev": true, "license": "ISC", "dependencies": { @@ -7453,6 +9215,8 @@ }, "node_modules/npm-registry-fetch": { "version": "13.3.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz", + "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", "dev": true, "license": "ISC", "dependencies": { @@ -7470,6 +9234,8 @@ }, "node_modules/npm-run-path": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "license": "MIT", "dependencies": { "path-key": "^3.0.0" @@ -7480,6 +9246,9 @@ }, "node_modules/npmlog": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", "dev": true, "license": "ISC", "dependencies": { @@ -7494,6 +9263,8 @@ }, "node_modules/nth-check": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" @@ -7504,6 +9275,8 @@ }, "node_modules/object-assign": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "devOptional": true, "license": "MIT", "engines": { @@ -7512,6 +9285,8 @@ }, "node_modules/object-inspect": { "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -7522,10 +9297,14 @@ }, "node_modules/obuf": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "license": "MIT" }, "node_modules/on-finished": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", "dependencies": { "ee-first": "1.1.1" @@ -7535,7 +9314,9 @@ } }, "node_modules/on-headers": { - "version": "1.1.0", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -7543,6 +9324,8 @@ }, "node_modules/once": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", "dependencies": { "wrappy": "1" @@ -7550,6 +9333,8 @@ }, "node_modules/onetime": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" @@ -7563,6 +9348,8 @@ }, "node_modules/open": { "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", @@ -7578,6 +9365,8 @@ }, "node_modules/ora": { "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "license": "MIT", "dependencies": { "bl": "^4.1.0", @@ -7599,6 +9388,8 @@ }, "node_modules/os-tmpdir": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -7606,6 +9397,8 @@ }, "node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "license": "MIT", "dependencies": { "p-try": "^2.0.0" @@ -7619,6 +9412,8 @@ }, "node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "license": "MIT", "dependencies": { "p-limit": "^2.2.0" @@ -7629,6 +9424,8 @@ }, "node_modules/p-map": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" @@ -7642,6 +9439,8 @@ }, "node_modules/p-retry": { "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "license": "MIT", "dependencies": { "@types/retry": "0.12.0", @@ -7653,6 +9452,8 @@ }, "node_modules/p-retry/node_modules/retry": { "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "license": "MIT", "engines": { "node": ">= 4" @@ -7660,6 +9461,8 @@ }, "node_modules/p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "license": "MIT", "engines": { "node": ">=6" @@ -7667,6 +9470,8 @@ }, "node_modules/pacote": { "version": "13.6.2", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.6.2.tgz", + "integrity": "sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg==", "dev": true, "license": "ISC", "dependencies": { @@ -7701,10 +9506,14 @@ }, "node_modules/pako": { "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "license": "(MIT AND Zlib)" }, "node_modules/parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -7715,6 +9524,8 @@ }, "node_modules/parse-json": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", @@ -7731,6 +9542,8 @@ }, "node_modules/parse-node-version": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -7738,11 +9551,15 @@ }, "node_modules/parse5": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", "license": "MIT", "optional": true }, "node_modules/parse5-html-rewriting-stream": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", + "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", "license": "MIT", "dependencies": { "parse5": "^6.0.1", @@ -7751,10 +9568,14 @@ }, "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "license": "MIT" }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", "license": "MIT", "dependencies": { "parse5": "^6.0.1" @@ -7762,10 +9583,14 @@ }, "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "license": "MIT" }, "node_modules/parse5-sax-parser": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", + "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", "license": "MIT", "dependencies": { "parse5": "^6.0.1" @@ -7773,10 +9598,14 @@ }, "node_modules/parse5-sax-parser/node_modules/parse5": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "license": "MIT" }, "node_modules/parseurl": { "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -7784,6 +9613,8 @@ }, "node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "license": "MIT", "engines": { "node": ">=8" @@ -7791,6 +9622,8 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -7798,6 +9631,8 @@ }, "node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", "engines": { "node": ">=8" @@ -7805,14 +9640,20 @@ }, "node_modules/path-parse": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "license": "MIT" }, "node_modules/path-to-regexp": { "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "license": "MIT", "engines": { "node": ">=8" @@ -7820,10 +9661,14 @@ }, "node_modules/picocolors": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.3", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "license": "MIT", "engines": { "node": ">=12" @@ -7834,6 +9679,8 @@ }, "node_modules/pify": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -7841,6 +9688,8 @@ }, "node_modules/piscina": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", + "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", "license": "MIT", "dependencies": { "eventemitter-asyncresource": "^1.0.0", @@ -7853,6 +9702,8 @@ }, "node_modules/pkg-dir": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "license": "MIT", "dependencies": { "find-up": "^4.0.0" @@ -7863,6 +9714,8 @@ }, "node_modules/postcss": { "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -7889,6 +9742,8 @@ }, "node_modules/postcss-attribute-case-insensitive": { "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.10" @@ -7906,6 +9761,8 @@ }, "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -7917,6 +9774,8 @@ }, "node_modules/postcss-clamp": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -7930,6 +9789,8 @@ }, "node_modules/postcss-color-functional-notation": { "version": "4.2.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -7947,6 +9808,8 @@ }, "node_modules/postcss-color-hex-alpha": { "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -7964,6 +9827,8 @@ }, "node_modules/postcss-color-rebeccapurple": { "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -7981,6 +9846,8 @@ }, "node_modules/postcss-custom-media": { "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -7998,6 +9865,8 @@ }, "node_modules/postcss-custom-properties": { "version": "12.1.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -8015,6 +9884,8 @@ }, "node_modules/postcss-custom-selectors": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.4" @@ -8032,6 +9903,8 @@ }, "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -8043,6 +9916,8 @@ }, "node_modules/postcss-dir-pseudo-class": { "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.10" @@ -8060,6 +9935,8 @@ }, "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -8071,6 +9948,8 @@ }, "node_modules/postcss-double-position-gradients": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", @@ -8089,6 +9968,8 @@ }, "node_modules/postcss-env-function": { "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -8102,6 +9983,8 @@ }, "node_modules/postcss-focus-visible": { "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" @@ -8115,6 +9998,8 @@ }, "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -8126,6 +10011,8 @@ }, "node_modules/postcss-focus-within": { "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" @@ -8139,6 +10026,8 @@ }, "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -8150,6 +10039,8 @@ }, "node_modules/postcss-font-variant": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", "license": "MIT", "peerDependencies": { "postcss": "^8.1.0" @@ -8157,6 +10048,8 @@ }, "node_modules/postcss-gap-properties": { "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", "license": "CC0-1.0", "engines": { "node": "^12 || ^14 || >=16" @@ -8171,6 +10064,8 @@ }, "node_modules/postcss-image-set-function": { "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -8188,6 +10083,8 @@ }, "node_modules/postcss-import": { "version": "15.0.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.0.0.tgz", + "integrity": "sha512-Y20shPQ07RitgBGv2zvkEAu9bqvrD77C9axhj/aA1BQj4czape2MdClCExvB27EwYEJdGgKZBpKanb0t1rK2Kg==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.0.0", @@ -8203,6 +10100,8 @@ }, "node_modules/postcss-initial": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", "license": "MIT", "peerDependencies": { "postcss": "^8.0.0" @@ -8210,6 +10109,8 @@ }, "node_modules/postcss-lab-function": { "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", @@ -8228,6 +10129,8 @@ }, "node_modules/postcss-loader": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz", + "integrity": "sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==", "license": "MIT", "dependencies": { "cosmiconfig": "^7.0.0", @@ -8248,6 +10151,8 @@ }, "node_modules/postcss-logical": { "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", "license": "CC0-1.0", "engines": { "node": "^12 || ^14 || >=16" @@ -8258,6 +10163,8 @@ }, "node_modules/postcss-media-minmax": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -8268,6 +10175,8 @@ }, "node_modules/postcss-modules-extract-imports": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" @@ -8278,6 +10187,8 @@ }, "node_modules/postcss-modules-local-by-default": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", @@ -8293,6 +10204,8 @@ }, "node_modules/postcss-modules-scope": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", "license": "ISC", "dependencies": { "postcss-selector-parser": "^7.0.0" @@ -8306,6 +10219,8 @@ }, "node_modules/postcss-modules-values": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "license": "ISC", "dependencies": { "icss-utils": "^5.0.0" @@ -8319,6 +10234,8 @@ }, "node_modules/postcss-nesting": { "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.0", @@ -8337,6 +10254,8 @@ }, "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", "license": "CC0-1.0", "engines": { "node": "^14 || ^16 || >=18" @@ -8351,6 +10270,8 @@ }, "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -8362,6 +10283,8 @@ }, "node_modules/postcss-opacity-percentage": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", "funding": [ { "type": "kofi", @@ -8382,6 +10305,8 @@ }, "node_modules/postcss-overflow-shorthand": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -8399,6 +10324,8 @@ }, "node_modules/postcss-page-break": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", "license": "MIT", "peerDependencies": { "postcss": "^8" @@ -8406,6 +10333,8 @@ }, "node_modules/postcss-place": { "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -8423,6 +10352,8 @@ }, "node_modules/postcss-preset-env": { "version": "7.8.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.0.tgz", + "integrity": "sha512-leqiqLOellpLKfbHkD06E04P6d9ZQ24mat6hu4NSqun7WG0UhspHR5Myiv/510qouCjoo4+YJtNOqg5xHaFnCA==", "license": "CC0-1.0", "dependencies": { "@csstools/postcss-cascade-layers": "^1.0.5", @@ -8488,6 +10419,8 @@ }, "node_modules/postcss-pseudo-class-any-link": { "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.10" @@ -8505,6 +10438,8 @@ }, "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -8516,6 +10451,8 @@ }, "node_modules/postcss-replace-overflow-wrap": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", "license": "MIT", "peerDependencies": { "postcss": "^8.0.3" @@ -8523,6 +10460,8 @@ }, "node_modules/postcss-selector-not": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", + "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.10" @@ -8540,6 +10479,8 @@ }, "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -8551,6 +10492,8 @@ }, "node_modules/postcss-selector-parser": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -8562,6 +10505,8 @@ }, "node_modules/postcss-url": { "version": "10.1.3", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-10.1.3.tgz", + "integrity": "sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==", "license": "MIT", "dependencies": { "make-dir": "~3.1.0", @@ -8577,7 +10522,9 @@ } }, "node_modules/postcss-url/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -8586,6 +10533,8 @@ }, "node_modules/postcss-url/node_modules/mime": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", "license": "MIT", "bin": { "mime": "cli.js" @@ -8596,6 +10545,8 @@ }, "node_modules/postcss-url/node_modules/minimatch": { "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -8606,10 +10557,14 @@ }, "node_modules/postcss-value-parser": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "license": "MIT" }, "node_modules/pretty-bytes": { "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "license": "MIT", "engines": { "node": ">=6" @@ -8620,6 +10575,8 @@ }, "node_modules/proc-log": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", "dev": true, "license": "ISC", "engines": { @@ -8628,14 +10585,20 @@ }, "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==", "license": "MIT" }, "node_modules/promise-inflight": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "license": "ISC" }, "node_modules/promise-retry": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, "license": "MIT", "dependencies": { @@ -8648,6 +10611,8 @@ }, "node_modules/proxy-addr": { "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", "dependencies": { "forwarded": "0.2.0", @@ -8659,6 +10624,8 @@ }, "node_modules/proxy-addr/node_modules/ipaddr.js": { "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -8666,16 +10633,22 @@ }, "node_modules/prr": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "license": "MIT", "optional": true }, "node_modules/punycode": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "devOptional": true, "license": "MIT" }, "node_modules/qjobs": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", "devOptional": true, "license": "MIT", "engines": { @@ -8684,6 +10657,8 @@ }, "node_modules/qs": { "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.6" @@ -8697,6 +10672,8 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { "type": "github", @@ -8715,6 +10692,8 @@ }, "node_modules/randombytes": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" @@ -8722,6 +10701,8 @@ }, "node_modules/range-parser": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -8729,6 +10710,8 @@ }, "node_modules/raw-body": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "license": "MIT", "dependencies": { "bytes": "3.1.2", @@ -8742,6 +10725,8 @@ }, "node_modules/read-cache": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "license": "MIT", "dependencies": { "pify": "^2.3.0" @@ -8749,6 +10734,9 @@ }, "node_modules/read-package-json": { "version": "5.0.2", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.2.tgz", + "integrity": "sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q==", + "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.", "dev": true, "license": "ISC", "dependencies": { @@ -8763,6 +10751,8 @@ }, "node_modules/read-package-json-fast": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", + "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", "dev": true, "license": "ISC", "dependencies": { @@ -8775,6 +10765,8 @@ }, "node_modules/read-package-json/node_modules/npm-normalize-package-bin": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "dev": true, "license": "ISC", "engines": { @@ -8783,6 +10775,8 @@ }, "node_modules/readable-stream": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -8795,6 +10789,8 @@ }, "node_modules/readdirp": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "license": "MIT", "dependencies": { "picomatch": "^2.2.1" @@ -8805,6 +10801,8 @@ }, "node_modules/readdirp/node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -8815,14 +10813,20 @@ }, "node_modules/reflect-metadata": { "version": "0.1.14", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", + "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==", "license": "Apache-2.0" }, "node_modules/regenerate": { "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "license": "MIT" }, "node_modules/regenerate-unicode-properties": { "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "license": "MIT", "dependencies": { "regenerate": "^1.4.2" @@ -8833,14 +10837,20 @@ }, "node_modules/regenerator-runtime": { "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", "license": "MIT" }, "node_modules/regex-parser": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", + "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==", "license": "MIT" }, "node_modules/regexpu-core": { "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", "license": "MIT", "dependencies": { "regenerate": "^1.4.2", @@ -8856,10 +10866,14 @@ }, "node_modules/regjsgen": { "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", "license": "MIT" }, "node_modules/regjsparser": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "license": "BSD-2-Clause", "dependencies": { "jsesc": "~3.0.2" @@ -8870,6 +10884,8 @@ }, "node_modules/regjsparser/node_modules/jsesc": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -8880,6 +10896,8 @@ }, "node_modules/require-directory": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -8887,6 +10905,8 @@ }, "node_modules/require-from-string": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -8894,10 +10914,14 @@ }, "node_modules/requires-port": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "license": "MIT" }, "node_modules/resolve": { "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "license": "MIT", "dependencies": { "is-core-module": "^2.9.0", @@ -8913,6 +10937,8 @@ }, "node_modules/resolve-from": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "license": "MIT", "engines": { "node": ">=8" @@ -8920,6 +10946,8 @@ }, "node_modules/resolve-url-loader": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", "license": "MIT", "dependencies": { "adjust-sourcemap-loader": "^4.0.0", @@ -8934,6 +10962,8 @@ }, "node_modules/resolve-url-loader/node_modules/loader-utils": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "license": "MIT", "dependencies": { "big.js": "^5.2.2", @@ -8946,6 +10976,8 @@ }, "node_modules/resolve-url-loader/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -8953,6 +10985,8 @@ }, "node_modules/restore-cursor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "license": "MIT", "dependencies": { "onetime": "^5.1.0", @@ -8964,6 +10998,8 @@ }, "node_modules/retry": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, "license": "MIT", "engines": { @@ -8972,6 +11008,8 @@ }, "node_modules/reusify": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -8980,11 +11018,16 @@ }, "node_modules/rfdc": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "devOptional": true, "license": "MIT" }, "node_modules/rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "license": "ISC", "dependencies": { "glob": "^7.1.3" @@ -8997,7 +11040,9 @@ } }, "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -9006,6 +11051,9 @@ }, "node_modules/rimraf/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -9024,6 +11072,8 @@ }, "node_modules/rimraf/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -9034,6 +11084,8 @@ }, "node_modules/rollup": { "version": "2.78.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.0.tgz", + "integrity": "sha512-4+YfbQC9QEVvKTanHhIAFVUFSRsezvQF8vFOJwtGfb9Bb+r014S+qryr9PSmw8x6sMnPkmFBGAvIFVQxvJxjtg==", "license": "MIT", "bin": { "rollup": "dist/bin/rollup" @@ -9047,6 +11099,8 @@ }, "node_modules/rollup-plugin-sourcemaps": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.6.3.tgz", + "integrity": "sha512-paFu+nT1xvuO1tPFYXGe+XnQvg4Hjqv/eIhG8i5EspfYYPBKL57X7iVbfv55aNVASg3dzWvES9dmWsL2KhfByw==", "license": "MIT", "dependencies": { "@rollup/pluginutils": "^3.0.9", @@ -9067,6 +11121,8 @@ }, "node_modules/rollup-plugin-sourcemaps/node_modules/@rollup/pluginutils": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "license": "MIT", "dependencies": { "@types/estree": "0.0.39", @@ -9082,14 +11138,20 @@ }, "node_modules/rollup-plugin-sourcemaps/node_modules/@types/estree": { "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "license": "MIT" }, "node_modules/rollup-plugin-sourcemaps/node_modules/estree-walker": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "license": "MIT" }, "node_modules/rollup-plugin-sourcemaps/node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -9100,6 +11162,8 @@ }, "node_modules/run-async": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "license": "MIT", "engines": { "node": ">=0.12.0" @@ -9107,6 +11171,8 @@ }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "funding": [ { "type": "github", @@ -9128,6 +11194,8 @@ }, "node_modules/rxjs": { "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" @@ -9135,6 +11203,8 @@ }, "node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -9153,6 +11223,8 @@ }, "node_modules/safe-regex-test": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -9169,10 +11241,14 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, "node_modules/sass": { "version": "1.54.4", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.4.tgz", + "integrity": "sha512-3tmF16yvnBwtlPrNBHw/H907j8MlOX8aTBnlNX1yrKx24RKcJGPyLhFUwkoKBKesR3unP93/2z14Ll8NicwQUA==", "license": "MIT", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -9188,6 +11264,8 @@ }, "node_modules/sass-loader": { "version": "13.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz", + "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==", "license": "MIT", "dependencies": { "klona": "^2.0.4", @@ -9224,11 +11302,15 @@ }, "node_modules/sax": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", "license": "ISC", "optional": true }, "node_modules/schema-utils": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.5", @@ -9245,6 +11327,8 @@ }, "node_modules/schema-utils/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -9259,6 +11343,8 @@ }, "node_modules/schema-utils/node_modules/ajv-keywords": { "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" @@ -9266,14 +11352,20 @@ }, "node_modules/schema-utils/node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "license": "MIT" }, "node_modules/select-hose": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "license": "MIT" }, "node_modules/selfsigned": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "license": "MIT", "dependencies": { "@types/node-forge": "^1.3.0", @@ -9285,6 +11377,8 @@ }, "node_modules/semver": { "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" @@ -9298,6 +11392,8 @@ }, "node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -9308,10 +11404,14 @@ }, "node_modules/semver/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/send": { "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "license": "MIT", "dependencies": { "debug": "2.6.9", @@ -9334,6 +11434,8 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -9341,10 +11443,14 @@ }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/send/node_modules/mime": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "license": "MIT", "bin": { "mime": "cli.js" @@ -9355,10 +11461,14 @@ }, "node_modules/send/node_modules/ms": { "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/send/node_modules/statuses": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -9366,6 +11476,8 @@ }, "node_modules/serialize-javascript": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" @@ -9373,6 +11485,8 @@ }, "node_modules/serve-index": { "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "license": "MIT", "dependencies": { "accepts": "~1.3.4", @@ -9389,6 +11503,8 @@ }, "node_modules/serve-index/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -9396,6 +11512,8 @@ }, "node_modules/serve-index/node_modules/depd": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -9403,6 +11521,8 @@ }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "license": "MIT", "dependencies": { "depd": "~1.1.2", @@ -9416,18 +11536,26 @@ }, "node_modules/serve-index/node_modules/inherits": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", "license": "ISC" }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "license": "ISC" }, "node_modules/serve-static": { "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", @@ -9441,6 +11569,8 @@ }, "node_modules/serve-static/node_modules/encodeurl": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -9448,15 +11578,21 @@ }, "node_modules/set-blocking": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true, "license": "ISC" }, "node_modules/setprototypeof": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, "node_modules/shallow-clone": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "license": "MIT", "dependencies": { "kind-of": "^6.0.2" @@ -9467,6 +11603,8 @@ }, "node_modules/shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -9477,6 +11615,8 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", "engines": { "node": ">=8" @@ -9484,6 +11624,8 @@ }, "node_modules/side-channel": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -9501,6 +11643,8 @@ }, "node_modules/side-channel-list": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -9515,6 +11659,8 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -9531,6 +11677,8 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -9548,10 +11696,14 @@ }, "node_modules/signal-exit": { "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, "node_modules/slash": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "license": "MIT", "engines": { "node": ">=12" @@ -9562,6 +11714,8 @@ }, "node_modules/smart-buffer": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, "license": "MIT", "engines": { @@ -9571,6 +11725,8 @@ }, "node_modules/socket.io": { "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -9588,6 +11744,8 @@ }, "node_modules/socket.io-adapter": { "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -9597,6 +11755,8 @@ }, "node_modules/socket.io-parser": { "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "devOptional": true, "license": "MIT", "dependencies": { @@ -9609,6 +11769,8 @@ }, "node_modules/sockjs": { "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "license": "MIT", "dependencies": { "faye-websocket": "^0.11.3", @@ -9617,7 +11779,9 @@ } }, "node_modules/socks": { - "version": "2.8.6", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9631,6 +11795,8 @@ }, "node_modules/socks-proxy-agent": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dev": true, "license": "MIT", "dependencies": { @@ -9644,6 +11810,8 @@ }, "node_modules/source-map": { "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "license": "BSD-3-Clause", "engines": { "node": ">= 8" @@ -9651,6 +11819,8 @@ }, "node_modules/source-map-js": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -9658,6 +11828,8 @@ }, "node_modules/source-map-loader": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.0.tgz", + "integrity": "sha512-i3KVgM3+QPAHNbGavK+VBq03YoJl24m9JWNbLgsjTj8aJzXG9M61bantBTNBt7CNwY2FYf+RJRYJ3pzalKjIrw==", "license": "MIT", "dependencies": { "abab": "^2.0.6", @@ -9677,6 +11849,8 @@ }, "node_modules/source-map-loader/node_modules/iconv-lite": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -9687,6 +11861,9 @@ }, "node_modules/source-map-resolve": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", "license": "MIT", "dependencies": { "atob": "^2.1.2", @@ -9695,6 +11872,8 @@ }, "node_modules/source-map-support": { "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", @@ -9703,6 +11882,8 @@ }, "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -9710,10 +11891,15 @@ }, "node_modules/sourcemap-codec": { "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", "license": "MIT" }, "node_modules/spdx-correct": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -9723,11 +11909,15 @@ }, "node_modules/spdx-exceptions": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true, "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -9737,11 +11927,15 @@ }, "node_modules/spdx-license-ids": { "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", "dev": true, "license": "CC0-1.0" }, "node_modules/spdy": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "license": "MIT", "dependencies": { "debug": "^4.1.0", @@ -9756,6 +11950,8 @@ }, "node_modules/spdy-transport": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "license": "MIT", "dependencies": { "debug": "^4.1.0", @@ -9768,10 +11964,14 @@ }, "node_modules/sprintf-js": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause" }, "node_modules/ssri": { "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "license": "ISC", "dependencies": { "minipass": "^3.1.1" @@ -9782,6 +11982,8 @@ }, "node_modules/statuses": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -9789,6 +11991,8 @@ }, "node_modules/streamroller": { "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -9802,6 +12006,8 @@ }, "node_modules/string_decoder": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" @@ -9809,6 +12015,8 @@ }, "node_modules/string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -9821,6 +12029,8 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -9831,6 +12041,8 @@ }, "node_modules/strip-final-newline": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "license": "MIT", "engines": { "node": ">=6" @@ -9838,6 +12050,8 @@ }, "node_modules/stylus": { "version": "0.59.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.59.0.tgz", + "integrity": "sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg==", "license": "MIT", "dependencies": { "@adobe/css-tools": "^4.0.1", @@ -9858,6 +12072,8 @@ }, "node_modules/stylus-loader": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.0.0.tgz", + "integrity": "sha512-WTbtLrNfOfLgzTaR9Lj/BPhQroKk/LC1hfTXSUbrxmxgfUo3Y3LpmKRVA2R1XbjvTAvOfaian9vOyfv1z99E+A==", "license": "MIT", "dependencies": { "fast-glob": "^3.2.11", @@ -9877,7 +12093,9 @@ } }, "node_modules/stylus/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -9886,6 +12104,9 @@ }, "node_modules/stylus/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -9904,6 +12125,8 @@ }, "node_modules/stylus/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -9914,10 +12137,14 @@ }, "node_modules/stylus/node_modules/sax": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "license": "ISC" }, "node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -9928,6 +12155,8 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -9938,6 +12167,8 @@ }, "node_modules/symbol-observable": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", "dev": true, "license": "MIT", "engines": { @@ -9946,6 +12177,8 @@ }, "node_modules/tapable": { "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", "license": "MIT", "engines": { "node": ">=6" @@ -9953,6 +12186,8 @@ }, "node_modules/tar": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "license": "ISC", "dependencies": { "chownr": "^2.0.0", @@ -9968,6 +12203,8 @@ }, "node_modules/tar/node_modules/minipass": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "license": "ISC", "engines": { "node": ">=8" @@ -9975,10 +12212,14 @@ }, "node_modules/tar/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/terser": { "version": "5.14.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", + "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.2", @@ -9995,6 +12236,8 @@ }, "node_modules/terser-webpack-plugin": { "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", @@ -10027,10 +12270,14 @@ }, "node_modules/terser-webpack-plugin/node_modules/commander": { "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -10047,7 +12294,9 @@ } }, "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.43.1", + "version": "5.40.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.40.0.tgz", + "integrity": "sha512-cfeKl/jjwSR5ar7d0FGmave9hFGJT8obyo0z+CrQOylLDbk7X81nPU6vq9VORa5jU30SkDnT2FXjLbR8HLP+xA==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -10064,10 +12313,14 @@ }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, "node_modules/test-exclude": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", @@ -10079,7 +12332,9 @@ } }, "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -10088,6 +12343,9 @@ }, "node_modules/test-exclude/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -10106,6 +12364,8 @@ }, "node_modules/test-exclude/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -10116,18 +12376,26 @@ }, "node_modules/text-table": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "license": "MIT" }, "node_modules/through": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "license": "MIT" }, "node_modules/thunky": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "license": "MIT" }, "node_modules/tmp": { "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "license": "MIT", "dependencies": { "os-tmpdir": "~1.0.2" @@ -10138,6 +12406,8 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -10148,6 +12418,8 @@ }, "node_modules/toidentifier": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", "engines": { "node": ">=0.6" @@ -10155,6 +12427,8 @@ }, "node_modules/tree-kill": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "license": "MIT", "bin": { "tree-kill": "cli.js" @@ -10162,10 +12436,14 @@ }, "node_modules/tslib": { "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/type-fest": { "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -10176,6 +12454,8 @@ }, "node_modules/type-is": { "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "license": "MIT", "dependencies": { "media-typer": "0.3.0", @@ -10187,10 +12467,14 @@ }, "node_modules/typed-assert": { "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", "license": "MIT" }, "node_modules/typescript": { "version": "4.6.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", + "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -10202,6 +12486,8 @@ }, "node_modules/ua-parser-js": { "version": "0.7.40", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.40.tgz", + "integrity": "sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ==", "devOptional": true, "funding": [ { @@ -10227,6 +12513,8 @@ }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "license": "MIT", "engines": { "node": ">=4" @@ -10234,6 +12522,8 @@ }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", @@ -10245,6 +12535,8 @@ }, "node_modules/unicode-match-property-value-ecmascript": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "license": "MIT", "engines": { "node": ">=4" @@ -10252,6 +12544,8 @@ }, "node_modules/unicode-property-aliases-ecmascript": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "license": "MIT", "engines": { "node": ">=4" @@ -10259,6 +12553,8 @@ }, "node_modules/unique-filename": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "license": "ISC", "dependencies": { "unique-slug": "^2.0.0" @@ -10266,6 +12562,8 @@ }, "node_modules/unique-slug": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" @@ -10273,6 +12571,8 @@ }, "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==", "devOptional": true, "license": "MIT", "engines": { @@ -10281,6 +12581,8 @@ }, "node_modules/unpipe": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -10288,6 +12590,8 @@ }, "node_modules/update-browserslist-db": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "funding": [ { "type": "opencollective", @@ -10316,6 +12620,8 @@ }, "node_modules/uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -10323,6 +12629,8 @@ }, "node_modules/uri-js/node_modules/punycode": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "license": "MIT", "engines": { "node": ">=6" @@ -10330,10 +12638,14 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, "node_modules/utils-merge": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "license": "MIT", "engines": { "node": ">= 0.4.0" @@ -10341,6 +12653,8 @@ }, "node_modules/uuid": { "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "license": "MIT", "bin": { "uuid": "dist/bin/uuid" @@ -10348,6 +12662,8 @@ }, "node_modules/validate-npm-package-license": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -10357,6 +12673,8 @@ }, "node_modules/validate-npm-package-name": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", "dev": true, "license": "ISC", "dependencies": { @@ -10368,6 +12686,8 @@ }, "node_modules/vary": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -10375,6 +12695,8 @@ }, "node_modules/void-elements": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", "devOptional": true, "license": "MIT", "engines": { @@ -10383,6 +12705,8 @@ }, "node_modules/watchpack": { "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", @@ -10394,6 +12718,8 @@ }, "node_modules/wbuf": { "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" @@ -10401,6 +12727,8 @@ }, "node_modules/wcwidth": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "license": "MIT", "dependencies": { "defaults": "^1.0.3" @@ -10408,6 +12736,8 @@ }, "node_modules/webpack": { "version": "5.76.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz", + "integrity": "sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ==", "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -10453,6 +12783,8 @@ }, "node_modules/webpack-dev-middleware": { "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", "license": "MIT", "dependencies": { "colorette": "^2.0.10", @@ -10474,6 +12806,8 @@ }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -10491,6 +12825,8 @@ }, "node_modules/webpack-dev-server": { "version": "4.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.0.tgz", + "integrity": "sha512-L5S4Q2zT57SK7tazgzjMiSMBdsw+rGYIX27MgPgx7LDhWO0lViPrHKoLS7jo5In06PWYAhlYu3PbyoC6yAThbw==", "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.9", @@ -10544,6 +12880,8 @@ }, "node_modules/webpack-dev-server/node_modules/schema-utils": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -10561,6 +12899,8 @@ }, "node_modules/webpack-merge": { "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", @@ -10571,7 +12911,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.3.3", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.0.tgz", + "integrity": "sha512-77R0RDmJfj9dyv5p3bM5pOHa+X8/ZkO9c7kpDstigkC4nIDobadsfSGCwB4bKhMVxqAok8tajaoR8rirM7+VFQ==", "license": "MIT", "engines": { "node": ">=10.13.0" @@ -10579,6 +12921,8 @@ }, "node_modules/webpack-subresource-integrity": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", "license": "MIT", "dependencies": { "typed-assert": "^1.0.8" @@ -10598,10 +12942,14 @@ }, "node_modules/webpack/node_modules/@types/estree": { "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", "license": "MIT" }, "node_modules/webpack/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -10616,6 +12964,8 @@ }, "node_modules/webpack/node_modules/ajv-keywords": { "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" @@ -10623,10 +12973,14 @@ }, "node_modules/webpack/node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "license": "MIT" }, "node_modules/webpack/node_modules/schema-utils": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", @@ -10643,6 +12997,8 @@ }, "node_modules/websocket-driver": { "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", @@ -10655,6 +13011,8 @@ }, "node_modules/websocket-extensions": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "license": "Apache-2.0", "engines": { "node": ">=0.8.0" @@ -10662,6 +13020,8 @@ }, "node_modules/which": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "license": "ISC", "dependencies": { @@ -10673,6 +13033,8 @@ }, "node_modules/wide-align": { "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, "license": "ISC", "dependencies": { @@ -10681,10 +13043,14 @@ }, "node_modules/wildcard": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "license": "MIT" }, "node_modules/wrap-ansi": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -10700,10 +13066,14 @@ }, "node_modules/wrappy": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, "node_modules/ws": { "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -10723,6 +13093,8 @@ }, "node_modules/xxhashjs": { "version": "0.2.2", + "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", + "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", "license": "MIT", "dependencies": { "cuint": "^0.2.2" @@ -10730,6 +13102,8 @@ }, "node_modules/y18n": { "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "license": "ISC", "engines": { "node": ">=10" @@ -10737,10 +13111,14 @@ }, "node_modules/yallist": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "license": "ISC" }, "node_modules/yaml": { "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "license": "ISC", "engines": { "node": ">= 6" @@ -10748,6 +13126,8 @@ }, "node_modules/yargs": { "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", "license": "MIT", "dependencies": { "cliui": "^7.0.2", @@ -10764,6 +13144,8 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "license": "ISC", "engines": { "node": ">=12" @@ -10771,6 +13153,8 @@ }, "node_modules/zone.js": { "version": "0.11.4", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.4.tgz", + "integrity": "sha512-DDh2Ab+A/B+9mJyajPjHFPWfYU1H+pdun4wnnk0OcQTNjem1XQSZ2CDW+rfZEUDjv5M19SBqAkjZi0x5wuB5Qw==", "license": "MIT", "dependencies": { "tslib": "^2.0.0" diff --git a/plugins/arcgis/web-app/package.json b/plugins/arcgis/web-app/package.json index b40496905..b0b0455c8 100644 --- a/plugins/arcgis/web-app/package.json +++ b/plugins/arcgis/web-app/package.json @@ -1,6 +1,6 @@ { "name": "@ngageoint/mage.arcgis.web-app.workspace", - "version": "6.5.0-beta.1", + "version": "1.0.0-beta.2", "scripts": { "ng": "ng", "start": "ng serve", @@ -24,7 +24,7 @@ "@angular/platform-browser": "14.3.0", "@angular/platform-browser-dynamic": "14.3.0", "@angular/router": "14.3.0", - "@ngageoint/mage.web-core-lib": ">=6.3.0 || 6.5.0-beta.1", + "@ngageoint/mage.web-core-lib": "6.3.0", "rxjs": "~7.8.2", "tslib": "2.8.1", "zone.js": "0.11.4" diff --git a/plugins/arcgis/web-app/projects/main/package-lock.json b/plugins/arcgis/web-app/projects/main/package-lock.json index 14d122579..b67fe82ca 100644 --- a/plugins/arcgis/web-app/projects/main/package-lock.json +++ b/plugins/arcgis/web-app/projects/main/package-lock.json @@ -1,23 +1,23 @@ { "name": "@ngageoint/mage.arcgis.web-app", - "version": "6.5.0-beta.1", + "version": "1.0.0-beta.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ngageoint/mage.arcgis.web-app", - "version": "6.5.0-beta.1", + "version": "1.0.0-beta.2", "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { - "@ngageoint/mage.web-app": ">=6.3.0 || 6.5.0-beta.1" + "@ngageoint/mage.web-app": "6.3.0" } }, "node_modules/@ngageoint/mage.service": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/@ngageoint/mage.service/-/mage.service-6.3.0.tgz", - "integrity": "sha512-70TfpGHIhQ5TlGZ8NrjMLGCw4p6Su2jtDLc9SfqC6c0GYFPW9Z3yTFtDyiTYFbQSu1qrWvMIrZ4t4TJGNZDdUQ==", + "integrity": "sha512-Jjyn5uROFnlvAZJ7j1LqSxiWk3PWDzM16/ukX0R/P9JLeOax2HOKwBbQQOEh/5IXk5EkbygL0j9WA5wTgiJ/HQ==", "hasShrinkwrap": true, "peer": true, "dependencies": { @@ -13280,7 +13280,8 @@ "node_modules/@ngageoint/mage.web-app": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/@ngageoint/mage.web-app/-/mage.web-app-6.3.0.tgz", - "integrity": "sha512-4thhedM1gIJEKbubv2PxQNtnK0ZRQKF78iulOBJxJwg6XP9ocI8kj7pPjR2tuO9G8DLwyi0JIdlnas0nIw0M0w==", + "integrity": "sha512-mqNfTUI14ajLIm+qC7rzgj5CpYOBglsqvwaUVDpTwuCQiBbkfYSIWBp5voogRiQUWCLclzkHZIHirQ0r6LVNMQ==", + "license": "Apache-2.0", "peer": true, "peerDependencies": { "@ngageoint/mage.service": "^6.3.0" @@ -13289,7 +13290,8 @@ "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" } } -} \ No newline at end of file +} diff --git a/plugins/arcgis/web-app/projects/main/package.json b/plugins/arcgis/web-app/projects/main/package.json index 6c9502c74..96aa00826 100644 --- a/plugins/arcgis/web-app/projects/main/package.json +++ b/plugins/arcgis/web-app/projects/main/package.json @@ -1,8 +1,8 @@ { "name": "@ngageoint/mage.arcgis.web-app", - "version": "6.5.0-beta.1", + "version": "1.0.0-beta.2", "peerDependencies": { - "@ngageoint/mage.web-app": ">=6.3.0 || 6.5.0-beta.1" + "@ngageoint/mage.web-app": "6.3.0" }, "dependencies": { "tslib": "^2.0.0" diff --git a/plugins/arcgis/web-app/projects/main/src/lib/ArcGISConfig.ts b/plugins/arcgis/web-app/projects/main/src/lib/ArcGISConfig.ts index 9f3a61d8a..3c2ed0f9b 100644 --- a/plugins/arcgis/web-app/projects/main/src/lib/ArcGISConfig.ts +++ b/plugins/arcgis/web-app/projects/main/src/lib/ArcGISConfig.ts @@ -8,11 +8,6 @@ export interface FeatureServiceConfig { */ url: string - /** - * The ArcGIS portal API URL - */ - portalUrl?: string - /** * Flag indicating valid authentication */ @@ -42,7 +37,7 @@ export interface FeatureLayerConfig { /** * The event ids or names that sync to this arc feature layer. */ - events?: (number | string)[] + events?: (number|string)[] } /** diff --git a/plugins/arcgis/web-app/projects/main/src/lib/arc-layer/arc-layer-dialog.component.html b/plugins/arcgis/web-app/projects/main/src/lib/arc-layer/arc-layer-dialog.component.html index 84001a33e..23fd57692 100644 --- a/plugins/arcgis/web-app/projects/main/src/lib/arc-layer/arc-layer-dialog.component.html +++ b/plugins/arcgis/web-app/projects/main/src/lib/arc-layer/arc-layer-dialog.component.html @@ -9,8 +9,7 @@
- + Feature Service {{featureService?.url}} @@ -20,31 +19,23 @@
- +
- Feature Service URL - + URL + URL is required - - - Portal API URL - - Leave empty to use default portal URL derived from feature service URL - - - + + Authentication - + {{authenticationState.text}} - +
@@ -66,7 +57,7 @@ Username Id is required - + Password @@ -75,7 +66,7 @@
- +
- - + + Layers - -
+ +
diff --git a/plugins/arcgis/web-app/projects/main/src/lib/arc-layer/arc-layer-dialog.component.scss b/plugins/arcgis/web-app/projects/main/src/lib/arc-layer/arc-layer-dialog.component.scss index b3f9bbeb0..c6e13a0ea 100644 --- a/plugins/arcgis/web-app/projects/main/src/lib/arc-layer/arc-layer-dialog.component.scss +++ b/plugins/arcgis/web-app/projects/main/src/lib/arc-layer/arc-layer-dialog.component.scss @@ -49,8 +49,4 @@ mat-dialog-content { flex-direction: row; align-items: center; gap: 8px; -} - -.authentication-field { - margin-top: 16px; } \ No newline at end of file diff --git a/plugins/arcgis/web-app/projects/main/src/lib/arc-layer/arc-layer-dialog.component.ts b/plugins/arcgis/web-app/projects/main/src/lib/arc-layer/arc-layer-dialog.component.ts index f6dd5f8f9..8a71ba23e 100644 --- a/plugins/arcgis/web-app/projects/main/src/lib/arc-layer/arc-layer-dialog.component.ts +++ b/plugins/arcgis/web-app/projects/main/src/lib/arc-layer/arc-layer-dialog.component.ts @@ -37,10 +37,10 @@ export class ArcLayerDialogComponent { authenticationStates: AuthenticationState[] = [{ text: 'OAuth', value: AuthenticationType.OAuth - }, { + },{ text: 'Username/Password', value: AuthenticationType.UsernamePassword - }, { + },{ text: 'API Key', value: AuthenticationType.Token }] @@ -62,8 +62,7 @@ export class ArcLayerDialogComponent { this.state = this.featureService === undefined || !this.featureService.authenticated ? State.Validate : State.Layers this.layerForm = new FormGroup({ - url: new FormControl({ value: this.featureService?.url, disabled: this.featureService !== undefined }, [Validators.required]), - portalUrl: new FormControl(this.featureService?.portalUrl || ''), + url: new FormControl({value: this.featureService?.url, disabled: this.featureService !== undefined }, [Validators.required]), authenticationType: new FormControl('', [Validators.required]), token: new FormGroup({ token: new FormControl('', [Validators.required]) @@ -100,22 +99,22 @@ export class ArcLayerDialogComponent { onValidate(): void { this.loading = true - const { url, portalUrl, authenticationType } = this.layerForm.value + const { url, authenticationType } = this.layerForm.value switch (authenticationType) { case AuthenticationType.Token: { const { token } = this.layerForm.controls.token.value - this.arcService.validateFeatureService({ url, portalUrl, token }).subscribe((service) => this.validated(service)) + this.arcService.validateFeatureService({ url, token }).subscribe((service) => this.validated(service)) break; } case AuthenticationType.OAuth: { const { clientId } = this.layerForm.controls.oauth.value - this.arcService.oauth(url, clientId, portalUrl).subscribe((service) => this.validated(service)) + this.arcService.oauth(url, clientId).subscribe((service) => this.validated(service)) break; } case AuthenticationType.UsernamePassword: { const { username, password } = this.layerForm.controls.local.value - this.arcService.validateFeatureService({ url, portalUrl, username, password }).subscribe((service) => this.validated(service)) + this.arcService.validateFeatureService({url, username, password}).subscribe((service) => this.validated(service)) break; } } diff --git a/plugins/arcgis/web-app/projects/main/src/lib/arc.service.ts b/plugins/arcgis/web-app/projects/main/src/lib/arc.service.ts index cf814f1f4..cff0943a3 100644 --- a/plugins/arcgis/web-app/projects/main/src/lib/arc.service.ts +++ b/plugins/arcgis/web-app/projects/main/src/lib/arc.service.ts @@ -40,8 +40,7 @@ export interface FeatureLayer { export type ValidationRequest = { url: string - portalUrl?: string -} & ({ token: string } | { username: string, password: string }) +} & { token: string } | { username: string, password: string } @Injectable({ providedIn: 'root' @@ -50,7 +49,7 @@ export class ArcService implements ArcServiceInterface { constructor( private http: HttpClient - ) { } + ) {} fetchArcConfig(): Observable { return this.http.get(`${baseUrl}/config`) @@ -60,19 +59,10 @@ export class ArcService implements ArcServiceInterface { return this.http.get(`${baseUrl}/featureService/layers?featureServiceUrl=${encodeURIComponent(featureServiceUrl)}`) } - oauth(featureServiceUrl: string, clientId: string, portalUrl?: string): Observable { + oauth(featureServiceUrl: string, clientId: string): Observable { let subject = new Subject(); - const params = new URLSearchParams({ - featureServiceUrl: featureServiceUrl, - clientId: clientId - }); - - if (portalUrl) { - params.set('portalUrl', portalUrl); - } - - const url = `${baseUrl}/oauth/signin?${params.toString()}`; + const url = `${baseUrl}/oauth/signin?featureServiceUrl=${encodeURIComponent(featureServiceUrl)}&clientId=${encodeURIComponent(clientId)}`; const oauthWindow = window.open(url, "_blank"); const listener = (event: any) => { @@ -82,9 +72,9 @@ export class ArcService implements ArcServiceInterface { if (event.origin !== window.location.origin) { subject.error('target origin mismatch') } - + subject.next(event.data) - + oauthWindow?.close(); } } @@ -95,7 +85,7 @@ export class ArcService implements ArcServiceInterface { } validateFeatureService(request: ValidationRequest): Observable { - return this.http.post(`${baseUrl}/featureService/validate`, request) + return this.http.post(`${baseUrl}/featureService/validate`, request) } fetchEvents(): Observable { diff --git a/plugins/epic/README.md b/plugins/epic/README.md index 0cfff9fba..e8ca07c6d 100644 --- a/plugins/epic/README.md +++ b/plugins/epic/README.md @@ -1,6 +1,6 @@ -# Mage EPIC plugin +# MAGE EPIC plugin -The mage-epic plugin replicates Mage observations to an ESRI ArcGIS server using [ESRI's ReST API](http://resources.arcgis.com/en/help/rest/apiref/). +The mage-epic plugin replicates MAGE observations to an ESRI ArcGIS server using [ESRI's ReST API](http://resources.arcgis.com/en/help/rest/apiref/). Configuration: @@ -13,18 +13,18 @@ Configuration: * serviceName - ESRI service name partial url * serviceType - ESRI service type partial url * layerId - ESRI layerId partial url - * observations - Mage observation mapping. Add one for each event id (i.e. 7 maps Mage fields from eventId 7) + * observations - MAGE observation mapping. Add one for each event id (i.e. 7 maps MAGE fields from eventId 7) * enable - turn on/off sync'ing of this event * interval - frequency (seconds) at which the plugin will sync this event to the ESRI server. * fields - array that maps each observation field to an ESRI fields * type - primitive type - * mage - obseravtion field name in Mage + * mage - obseravtion field name in MAGE * esri - ESRI field name * attachments * enable - turn on/off attachment sync'ing * interval - frequency (seconds) at which the plugin will sync attachments to the ESRI server. * mongodb - * url - url scheme for the mongodb database. This should be the same mongodb schema as used in your main Mage configuration. + * url - url scheme for the mongodb database. This should be the same mongodb schema as used in your main MAGE configuration. * poolSize - mongodb connection pool size for this plugin ```json diff --git a/plugins/epic/package.json b/plugins/epic/package.json index 09a628d30..b7316ab69 100644 --- a/plugins/epic/package.json +++ b/plugins/epic/package.json @@ -1,7 +1,7 @@ { "name": "mage-epic", "version": "0.0.1", - "description": "Plugin to sync Mage observations to an ESRI feature server.", + "description": "Plugin to sync MAGE observations to an ESRI feature server.", "author": "NGA", "contributors": { "name": "Billy Newman", diff --git a/plugins/geoserver/package.json b/plugins/geoserver/package.json index a859400cc..414225ffd 100644 --- a/plugins/geoserver/package.json +++ b/plugins/geoserver/package.json @@ -1,10 +1,10 @@ { "name": "mage-geoserver", "version": "0.0.1", - "description": "Geoserver plugin for Mage", + "description": "Geoserver plugin for MAGE", "keywords": [ "NGA", - "Mage", + "MAGE", "GeoServer" ], "author": { diff --git a/plugins/image/README.md b/plugins/image/README.md index 63e41a3a7..a960381c3 100644 --- a/plugins/image/README.md +++ b/plugins/image/README.md @@ -1,14 +1,14 @@ -# Mage Image Plugin +# MAGE Image Plugin -The Mage Image plugin will ensure that all images clients attach to observations +The MAGE Image plugin will ensure that all images clients attach to observations are rotated properly according to the image EXIF data. The plugin will also -create thumbnails of configured sizes for each image attachment. Mage clients +create thumbnails of configured sizes for each image attachment. MAGE clients will attempt to pull the smaller thumbnail images for certain views based on the client's view size and resolution. Enabling this plugin is optional. ## Configuration -The image plugin utilizes the basic [plugin state repository](../../service/src/plugins.api/index.ts) that core Mage +The image plugin utilizes the basic [plugin state repository](../../service/src/plugins.api/index.ts) that core MAGE Service provides to store its configuration. The configuration document is fairly simple, and looks like ```json diff --git a/plugins/image/service/package.json b/plugins/image/service/package.json index bdff80375..6d424e14e 100644 --- a/plugins/image/service/package.json +++ b/plugins/image/service/package.json @@ -1,7 +1,7 @@ { "name": "@ngageoint/mage.image.service", "version": "1.1.0-beta.1", - "description": "Orient images attached to Mage observations according to EXIF meta-data and generate configurable size thumbnails.", + "description": "Orient images attached to MAGE observations according to EXIF meta-data and generate configurable size thumbnails.", "main": "lib/index.js", "files": [ "lib/", diff --git a/plugins/nga-msi/README.md b/plugins/nga-msi/README.md index 782a819f8..783659d2e 100644 --- a/plugins/nga-msi/README.md +++ b/plugins/nga-msi/README.md @@ -1,4 +1,4 @@ -# NGA Maritime Safety Information Service Mage Plugin +# NGA Maritime Safety Information Service MAGE Plugin ## Links The region/subregion scheme that man MSI data collections reference seem to be diff --git a/plugins/nga-msi/package-lock.json b/plugins/nga-msi/package-lock.json index 658a217e2..da8ff6adb 100644 --- a/plugins/nga-msi/package-lock.json +++ b/plugins/nga-msi/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ngageoint/mage.nga-msi", - "version": "1.0.6", + "version": "1.0.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ngageoint/mage.nga-msi", - "version": "1.0.6", + "version": "1.0.5", "license": "MIT", "dependencies": { "axios": "0.27.2" @@ -20,7 +20,7 @@ "typescript": "5.8.2" }, "peerDependencies": { - "@ngageoint/mage.service": ">=6.3.0 || 6.5.0-beta.1" + "@ngageoint/mage.service": "6.3.0-beta.7" } }, "node_modules/@ampproject/remapping": { @@ -896,9 +896,9 @@ } }, "node_modules/@ngageoint/mage.service": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@ngageoint/mage.service/-/mage.service-6.3.0.tgz", - "integrity": "sha512-70TfpGHIhQ5TlGZ8NrjMLGCw4p6Su2jtDLc9SfqC6c0GYFPW9Z3yTFtDyiTYFbQSu1qrWvMIrZ4t4TJGNZDdUQ==", + "version": "6.3.0-beta.7", + "resolved": "https://registry.npmjs.org/@ngageoint/mage.service/-/mage.service-6.3.0-beta.7.tgz", + "integrity": "sha512-hauwJfO7gg/+Gh+bfmoj1HbB0VFJB+/X+igAZVehidV9V39cwI/KlIJKUiie/6qZqK5bsMDhJ66N638qcfK2lA==", "hasShrinkwrap": true, "peer": true, "dependencies": { diff --git a/plugins/nga-msi/package.json b/plugins/nga-msi/package.json index a3a6e1e07..7560520a9 100644 --- a/plugins/nga-msi/package.json +++ b/plugins/nga-msi/package.json @@ -1,7 +1,7 @@ { "name": "@ngageoint/mage.nga-msi", - "version": "1.0.6", - "description": "The NGA-MSI package is a Mage server plugin that provides feeds from National Geospatial-Intelligence Agency's Maritime Safety Information API.", + "version": "1.0.5", + "description": "The NGA-MSI package is a MAGE server plugin that provides feeds from National Geospatial-Intelligence Agency's Maritime Safety Information API.", "main": "lib/index.js", "files": [ "lib", @@ -49,6 +49,6 @@ "typescript": "5.8.2" }, "peerDependencies": { - "@ngageoint/mage.service": ">=6.3.0 || 6.5.0-beta.1" + "@ngageoint/mage.service": "6.3.0-beta.7" } } \ No newline at end of file diff --git a/plugins/nga-msi/tsconfig.json b/plugins/nga-msi/tsconfig.json index a7a699c2b..60c36ca2a 100644 --- a/plugins/nga-msi/tsconfig.json +++ b/plugins/nga-msi/tsconfig.json @@ -1,21 +1,21 @@ { - "include": [], - "exclude": [], - "references": [], + "include": [ + ], + "exclude": [ + ], + "references": [ + ], "compilerOptions": { /* Basic Options */ - "target": "ES2016", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ - "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ - "lib": [ - "ES2016", - "DOM" - ], /* Specify library files to be included in the compilation. */ - "allowJs": true, /* Allow javascript files to be compiled. */ + "target": "ES2016", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ + "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ + "lib": [ "ES2016" ], /* Specify library files to be included in the compilation. */ + "allowJs": true, /* Allow javascript files to be compiled. */ // "checkJs": true, /* Report errors in .js files. */ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ - "declaration": true, /* Generates corresponding '.d.ts' file. */ - "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ - "sourceMap": true, /* Generates corresponding '.map' file. */ + "declaration": true, /* Generates corresponding '.d.ts' file. */ + "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + "sourceMap": true, /* Generates corresponding '.map' file. */ // "outFile": "./", /* Concatenate and emit output to single file. */ // "outDir": "./lib", /* Redirect output structure to the directory. */ // "rootDir": ".", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ @@ -26,7 +26,7 @@ // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ /* Strict Type-Checking Options */ - "strict": true, /* Enable all strict type-checking options. */ + "strict": true, /* Enable all strict type-checking options. */ // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ // "strictNullChecks": true, /* Enable strict null checks. */ // "strictFunctionTypes": true, /* Enable strict checking of function types. */ @@ -34,28 +34,32 @@ // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + /* Additional Checks */ // "noUnusedLocals": true, /* Report errors on unused locals. */ // "noUnusedParameters": true, /* Report errors on unused parameters. */ // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + /* Module Resolution Options */ - "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ // "typeRoots": [], /* List of folders to include type definitions from. */ // "types": [], /* Type declaration files to be included in compilation. */ // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ - "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + /* Source Map Options */ // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + /* Experimental Options */ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ } -} \ No newline at end of file +} diff --git a/plugins/rage/README.md b/plugins/rage/README.md index c9a643932..42b7afb0f 100644 --- a/plugins/rage/README.md +++ b/plugins/rage/README.md @@ -1,17 +1,17 @@ -# Mage RAGE plugin +# MAGE RAGE plugin -The mage-rage plugin replicates all Mage data to another Mage server. +The mage-rage plugin replicates all MAGE data to another MAGE server. Configuration: -* url - Mage server url to replicate data to. -* credentials - Mage replication server credentials used for authentication. - * username - username on Mage replication server +* url - MAGE server url to replicate data to. +* credentials - MAGE replication server credentials used for authentication. + * username - username on MAGE replication server * uid - device uid * password - password * interval - frequency (seconds) at which the plugin will sync data to the replication server. * mongodb - * url - url scheme for the mongodb database. This should be the same mongodb schema as used in your main Mage configuration. + * url - url scheme for the mongodb database. This should be the same mongodb schema as used in your main MAGE configuration. * poolSize - mongodb connection pool size for this plugin ```json diff --git a/plugins/rage/package.json b/plugins/rage/package.json index cd72b8436..4c591c18e 100644 --- a/plugins/rage/package.json +++ b/plugins/rage/package.json @@ -1,7 +1,7 @@ { "name": "mage-rage", "version": "0.0.1", - "description": "Plugin to sync all Mage data to another Mage server.", + "description": "Plugin to sync all MAGE data to another MAGE server.", "author": "NGA", "contributors": { "name": "Billy Newman", diff --git a/plugins/random/README.md b/plugins/random/README.md index dc1f0eab7..ee3e09cba 100644 --- a/plugins/random/README.md +++ b/plugins/random/README.md @@ -1,4 +1,4 @@ -# Mage Random Feed Plugin +# MAGE Random Feed Plugin This is a simple plugin for testing that provides a feed service type for generating point features that optionally move around randomly. \ No newline at end of file diff --git a/plugins/sftp/service/package-lock.json b/plugins/sftp/service/package-lock.json index 873a140ad..7e0afb3ad 100644 --- a/plugins/sftp/service/package-lock.json +++ b/plugins/sftp/service/package-lock.json @@ -35,7 +35,7 @@ "typescript": "~4.6.0" }, "peerDependencies": { - "@ngageoint/mage.service": "6.3.0 || 6.4.0-beta.1", + "@ngageoint/mage.service": "6.3.0", "express": "4.21.2", "express-session": "1.17.2", "mongoose": "^6.12.0" @@ -24223,4 +24223,4 @@ } } } -} \ No newline at end of file +} diff --git a/plugins/sftp/service/package.json b/plugins/sftp/service/package.json index 31506693a..210702595 100644 --- a/plugins/sftp/service/package.json +++ b/plugins/sftp/service/package.json @@ -1,7 +1,7 @@ { "name": "@ngageoint/mage.sftp.service", "version": "1.0.0-beta.2", - "description": "The SFTP service package is a Mage server plugin that sends observations to and SFTP location on create and update.", + "description": "The SFTP service package is a MAGE server plugin that sends observations to and SFTP location on create and update.", "main": "lib/index.js", "scripts": { "build": "tsc", @@ -45,7 +45,7 @@ "typescript": "~4.6.0" }, "peerDependencies": { - "@ngageoint/mage.service": ">=6.3.0 || 6.5.0-beta.1", + "@ngageoint/mage.service": "6.3.0", "express": "4.21.2", "express-session": "1.17.2", "mongoose": "^6.12.0" diff --git a/plugins/sftp/web/angular.json b/plugins/sftp/web/angular.json index 4acec70eb..9465fc3bf 100644 --- a/plugins/sftp/web/angular.json +++ b/plugins/sftp/web/angular.json @@ -163,9 +163,5 @@ } } } - } - }, - "cli": { - "analytics": false - } + }} } diff --git a/plugins/sftp/web/package-lock.json b/plugins/sftp/web/package-lock.json index 172447380..8be1e1f5e 100644 --- a/plugins/sftp/web/package-lock.json +++ b/plugins/sftp/web/package-lock.json @@ -18,7 +18,7 @@ "@angular/platform-browser": "^14.3.0", "@angular/platform-browser-dynamic": "^14.3.0", "@angular/router": "^14.3.0", - "@ngageoint/mage.web-core-lib": "6.3.0 || 6.4.0-beta.1", + "@ngageoint/mage.web-core-lib": "6.3.0", "rxjs": "~7.6.0", "tslib": "^2.0.0", "zone.js": "~0.11.4" @@ -50,10 +50,14 @@ }, "node_modules/@adobe/css-tools": { "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.3.tgz", + "integrity": "sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==", "license": "MIT" }, "node_modules/@ampproject/remapping": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.1.0", @@ -65,6 +69,8 @@ }, "node_modules/@angular-devkit/architect": { "version": "0.1400.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1400.0.tgz", + "integrity": "sha512-INPO+r5CHElPdFLOrwUYShZqtr37/kTJegAoWpSNC8Zy8WgTlecvA+y5eHy0bNeXMjWbZ3YCZJ1jXYpJJNL1Kg==", "license": "MIT", "peer": true, "dependencies": { @@ -79,6 +85,8 @@ }, "node_modules/@angular-devkit/architect/node_modules/@angular-devkit/core": { "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.0.0.tgz", + "integrity": "sha512-xQXpNbIeBjnbY68OFkrpFm6v7xlmTLFk6zGPIkI4T/hrqT2kNmg0y1/FcN6yMBgCEC9WVWR8SHGaPWrc5VVZMw==", "license": "MIT", "peer": true, "dependencies": { @@ -104,11 +112,15 @@ }, "node_modules/@angular-devkit/architect/node_modules/jsonc-parser": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", "license": "MIT", "peer": true }, "node_modules/@angular-devkit/architect/node_modules/rxjs": { "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -120,6 +132,8 @@ }, "node_modules/@angular-devkit/architect/node_modules/source-map": { "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "license": "BSD-3-Clause", "peer": true, "engines": { @@ -128,11 +142,15 @@ }, "node_modules/@angular-devkit/architect/node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD", "peer": true }, "node_modules/@angular-devkit/build-angular": { "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-14.2.13.tgz", + "integrity": "sha512-FJZKQ3xYFvEJ807sxVy4bCVyGU2NMl3UUPNfLIdIdzwwDEP9tx/cc+c4VtVPEZZfU8jVenu8XOvL6L0vpjt3yg==", "license": "MIT", "dependencies": { "@ampproject/remapping": "2.2.0", @@ -239,6 +257,8 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { "version": "0.1402.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.13.tgz", + "integrity": "sha512-n0ISBuvkZHoOpAzuAZql1TU9VLHUE9e/a9g4VNOPHewjMzpN02VqeGKvJfOCKtzkCs6gVssIlILm2/SXxkIFxQ==", "license": "MIT", "dependencies": { "@angular-devkit/core": "14.2.13", @@ -251,7 +271,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -260,6 +282,8 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^1.9.0" @@ -270,14 +294,20 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/rxjs/node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, "node_modules/@angular-devkit/build-angular/node_modules/sax": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "license": "ISC" }, "node_modules/@angular-devkit/build-angular/node_modules/stylus": { "version": "0.59.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.59.0.tgz", + "integrity": "sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg==", "license": "MIT", "dependencies": { "@adobe/css-tools": "^4.0.1", @@ -298,6 +328,9 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/stylus/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -316,6 +349,8 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/stylus/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -326,10 +361,14 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/tslib": { "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "license": "0BSD" }, "node_modules/@angular-devkit/build-webpack": { "version": "0.1402.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1402.13.tgz", + "integrity": "sha512-K27aJmuw86ZOdiu5PoGeGDJ2v7g2ZCK0bGwc8jzkjTLRfvd4FRKIIZumGv3hbQ3vQRLikiU6WMDRTFyCZky/EA==", "license": "MIT", "dependencies": { "@angular-devkit/architect": "0.1402.13", @@ -347,6 +386,8 @@ }, "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { "version": "0.1402.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.13.tgz", + "integrity": "sha512-n0ISBuvkZHoOpAzuAZql1TU9VLHUE9e/a9g4VNOPHewjMzpN02VqeGKvJfOCKtzkCs6gVssIlILm2/SXxkIFxQ==", "license": "MIT", "dependencies": { "@angular-devkit/core": "14.2.13", @@ -360,6 +401,8 @@ }, "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^1.9.0" @@ -370,10 +413,14 @@ }, "node_modules/@angular-devkit/build-webpack/node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, "node_modules/@angular-devkit/core": { "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.13.tgz", + "integrity": "sha512-aIefeZcbjghQg/V6U9CTLtyB5fXDJ63KwYqVYkWP+i0XriS5A9puFgq2u/OVsWxAfYvqpDqp5AdQ0g0bi3CAsA==", "license": "MIT", "dependencies": { "ajv": "8.11.0", @@ -398,6 +445,8 @@ }, "node_modules/@angular-devkit/core/node_modules/rxjs": { "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^1.9.0" @@ -408,10 +457,14 @@ }, "node_modules/@angular-devkit/core/node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, "node_modules/@angular-devkit/schematics": { "version": "14.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.0.tgz", + "integrity": "sha512-5H78HBAYshCKSYsjIr4K33TkS6CMB7IZpZunisSDiX23fHa1IvIkDrpbXlfMvZykHbcmKA/nt2wHMIsQl0YNuw==", "license": "MIT", "peer": true, "dependencies": { @@ -429,6 +482,8 @@ }, "node_modules/@angular-devkit/schematics/node_modules/@angular-devkit/core": { "version": "14.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.0.tgz", + "integrity": "sha512-IwiS6uDs3drR4i3nuqVinh5jtI1SHIyn/OaoWL6t3V7Y6b65BdJN1liyd+WBUEZmEwGCkY2/FjnLx1G8Dflc8A==", "license": "MIT", "peer": true, "dependencies": { @@ -454,6 +509,8 @@ }, "node_modules/@angular-devkit/schematics/node_modules/rxjs": { "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -465,11 +522,15 @@ }, "node_modules/@angular-devkit/schematics/node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD", "peer": true }, "node_modules/@angular/animations": { "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-14.3.0.tgz", + "integrity": "sha512-QoBcIKy1ZiU+4qJsAh5Ls20BupWiXiZzKb0s6L9/dntPt5Msr4Ao289XR2P6O1L+kTsCprH9Kt41zyGQ/bkRqg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -483,6 +544,8 @@ }, "node_modules/@angular/cdk": { "version": "14.2.7", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-14.2.7.tgz", + "integrity": "sha512-/tEsYaUbDSnfEmKVvAMramIptmhI67O+9STjOV0i+74XR2NospeK0fkbywIANu1n3w6AHGMotvRWJrjmbCElFg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -498,6 +561,8 @@ }, "node_modules/@angular/cli": { "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-14.2.13.tgz", + "integrity": "sha512-I5EepRem2CCyS3GDzQxZ2ZrqQwVqoGoLY+ZQhsK1QGWUnUyFOjbv3OlUGxRUYwcedu19V1EBAKjmQ96HzMIcVQ==", "dev": true, "license": "MIT", "dependencies": { @@ -533,6 +598,8 @@ }, "node_modules/@angular/cli/node_modules/@angular-devkit/architect": { "version": "0.1402.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.13.tgz", + "integrity": "sha512-n0ISBuvkZHoOpAzuAZql1TU9VLHUE9e/a9g4VNOPHewjMzpN02VqeGKvJfOCKtzkCs6gVssIlILm2/SXxkIFxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -547,6 +614,8 @@ }, "node_modules/@angular/cli/node_modules/@angular-devkit/schematics": { "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.13.tgz", + "integrity": "sha512-2zczyeNzeBcrT2HOysv52X9SH3tZoHfWJvVf6H0SIa74rfDKEl7hFpKNXnh3x8sIMLj5mZn05n5RCqGxCczcIg==", "dev": true, "license": "MIT", "dependencies": { @@ -564,6 +633,8 @@ }, "node_modules/@angular/cli/node_modules/@schematics/angular": { "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.2.13.tgz", + "integrity": "sha512-MLxTpTU3E8QACQ/5c0sENMR2gRiMXpGaKeD5IHY+3wyU2fUSJVB0QPU/l1WhoyZbX8N9ospBgf5UEG7taVF9rg==", "dev": true, "license": "MIT", "dependencies": { @@ -579,6 +650,8 @@ }, "node_modules/@angular/cli/node_modules/rxjs": { "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -590,11 +663,15 @@ }, "node_modules/@angular/cli/node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true, "license": "0BSD" }, "node_modules/@angular/common": { "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-14.3.0.tgz", + "integrity": "sha512-pV9oyG3JhGWeQ+TFB0Qub6a1VZWMNZ6/7zEopvYivdqa5yDLLDSBRWb6P80RuONXyGnM1pa7l5nYopX+r/23GQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -609,6 +686,8 @@ }, "node_modules/@angular/compiler": { "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-14.3.0.tgz", + "integrity": "sha512-E15Rh0t3vA+bctbKnBCaDmLvc3ix+ZBt6yFZmhZalReQ+KpOlvOJv+L9oiFEgg+rYVl2QdvN7US1fvT0PqswLw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -627,6 +706,8 @@ }, "node_modules/@angular/compiler-cli": { "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-14.3.0.tgz", + "integrity": "sha512-eoKpKdQ2X6axMgzcPUMZVYl3bIlTMzMeTo5V29No4BzgiUB+QoOTYGNJZkGRyqTNpwD9uSBJvmT2vG9+eC4ghQ==", "license": "MIT", "dependencies": { "@babel/core": "^7.17.2", @@ -655,6 +736,8 @@ }, "node_modules/@angular/core": { "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-14.3.0.tgz", + "integrity": "sha512-wYiwItc0Uyn4FWZ/OAx/Ubp2/WrD3EgUJ476y1XI7yATGPF8n9Ld5iCXT08HOvc4eBcYlDfh90kTXR6/MfhzdQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -669,6 +752,8 @@ }, "node_modules/@angular/forms": { "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-14.3.0.tgz", + "integrity": "sha512-fBZZC2UFMom2AZPjGQzROPXFWO6kvCsPDKctjJwClVC8PuMrkm+RRyiYRdBbt2qxWHEqOZM2OCQo73xUyZOYHw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -685,6 +770,8 @@ }, "node_modules/@angular/material": { "version": "14.2.7", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-14.2.7.tgz", + "integrity": "sha512-WXHh8pEStpgkXZJmYOg2cI8BSHkV82ET4XTJCNPdveumaCn1UYnaNzsXD13kw5z+zmy8CufhFEzdXTrv/yt7KQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -701,6 +788,8 @@ }, "node_modules/@angular/platform-browser": { "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.3.0.tgz", + "integrity": "sha512-w9Y3740UmTz44T0Egvc+4QV9sEbO61L+aRHbpkLTJdlEGzHByZvxJmJyBYmdqeyTPwc/Zpy7c02frlpfAlyB7A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -721,6 +810,8 @@ }, "node_modules/@angular/platform-browser-dynamic": { "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.3.0.tgz", + "integrity": "sha512-rneZiMrIiYRhrkQvdL40E2ErKRn4Zdo6EtjBM9pAmWeyoM8oMnOZb9gz5vhrkNWg06kVMVg0yKqluP5How7j3A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -737,6 +828,8 @@ }, "node_modules/@angular/router": { "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-14.3.0.tgz", + "integrity": "sha512-uip0V7w7k7xyxxpTPbr7EuMnYLj3FzJrwkLVJSEw3TMMGHt5VU5t4BBa9veGZOta2C205XFrTAHnp8mD+XYY1w==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -753,10 +846,14 @@ }, "node_modules/@assemblyscript/loader": { "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", "license": "Apache-2.0" }, "node_modules/@babel/code-frame": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", @@ -768,7 +865,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.0", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.3.tgz", + "integrity": "sha512-V42wFfx1ymFte+ecf6iXghnnP8kWTO+ZLXIyZq+1LAXHHvTZdVxicn4yiVYdYMGaCO3tmqub11AorKkv+iodqw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -776,6 +875,8 @@ }, "node_modules/@babel/core": { "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", + "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.1.0", @@ -804,6 +905,8 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -811,6 +914,8 @@ }, "node_modules/@babel/generator": { "version": "7.18.12", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", + "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", "license": "MIT", "dependencies": { "@babel/types": "^7.18.10", @@ -822,15 +927,23 @@ } }, "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "license": "MIT", "dependencies": { "@babel/types": "^7.18.6" @@ -841,6 +954,8 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "license": "MIT", "dependencies": { "@babel/compat-data": "^7.27.2", @@ -855,6 +970,8 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -862,6 +979,8 @@ }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", @@ -881,6 +1000,8 @@ }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "license": "MIT", "dependencies": { "@babel/types": "^7.27.3" @@ -891,6 +1012,8 @@ }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -898,6 +1021,8 @@ }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", @@ -913,6 +1038,8 @@ }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "license": "MIT", "dependencies": { "@babel/types": "^7.27.3" @@ -923,6 +1050,8 @@ }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -930,6 +1059,8 @@ }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.17.7", @@ -945,6 +1076,8 @@ }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -952,6 +1085,8 @@ }, "node_modules/@babel/helper-environment-visitor": { "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", "license": "MIT", "dependencies": { "@babel/types": "^7.24.7" @@ -960,15 +1095,10 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", @@ -980,6 +1110,8 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", @@ -991,6 +1123,8 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", @@ -1006,6 +1140,8 @@ }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "license": "MIT", "dependencies": { "@babel/types": "^7.27.1" @@ -1016,6 +1152,8 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1023,6 +1161,8 @@ }, "node_modules/@babel/helper-remap-async-to-generator": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", @@ -1038,6 +1178,8 @@ }, "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "license": "MIT", "dependencies": { "@babel/types": "^7.27.3" @@ -1048,6 +1190,8 @@ }, "node_modules/@babel/helper-replace-supers": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", "license": "MIT", "dependencies": { "@babel/helper-member-expression-to-functions": "^7.27.1", @@ -1063,6 +1207,8 @@ }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", @@ -1074,6 +1220,8 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1081,6 +1229,8 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1088,6 +1238,8 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1095,6 +1247,8 @@ }, "node_modules/@babel/helper-wrap-function": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", + "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", "license": "MIT", "dependencies": { "@babel/template": "^7.27.1", @@ -1107,6 +1261,8 @@ }, "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -1118,11 +1274,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.2", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.3.tgz", + "integrity": "sha512-h/eKy9agOya1IGuLaZ9tEUgz+uIRXcbtOhRtUyyMf8JFmn1iT13vnl/IGVWSkdOCG/pC57U4S1jnAabAavTMwg==", "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -1130,6 +1288,8 @@ }, "node_modules/@babel/helpers/node_modules/@babel/template": { "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -1141,10 +1301,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.0", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.3.tgz", + "integrity": "sha512-xyYxRj6+tLNDTWi0KCBcZ9V7yg3/lwL9DWh9Uwh/RIVlIfFidggcgxKX3GCXwCiswwcGRawBKbEg2LG/Y8eJhw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.0" + "@babel/types": "^7.27.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -1155,6 +1317,8 @@ }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1168,6 +1332,8 @@ }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -1183,6 +1349,9 @@ }, "node_modules/@babel/plugin-proposal-async-generator-functions": { "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", + "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", @@ -1199,6 +1368,9 @@ }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", @@ -1213,6 +1385,9 @@ }, "node_modules/@babel/plugin-proposal-class-static-block": { "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", + "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-static-block instead.", "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.21.0", @@ -1228,6 +1403,9 @@ }, "node_modules/@babel/plugin-proposal-dynamic-import": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-dynamic-import instead.", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -1242,6 +1420,9 @@ }, "node_modules/@babel/plugin-proposal-export-namespace-from": { "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-export-namespace-from instead.", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9", @@ -1256,6 +1437,9 @@ }, "node_modules/@babel/plugin-proposal-json-strings": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-json-strings instead.", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -1270,6 +1454,9 @@ }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead.", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", @@ -1284,6 +1471,9 @@ }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -1298,6 +1488,9 @@ }, "node_modules/@babel/plugin-proposal-numeric-separator": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -1312,6 +1505,9 @@ }, "node_modules/@babel/plugin-proposal-object-rest-spread": { "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", "license": "MIT", "dependencies": { "@babel/compat-data": "^7.20.5", @@ -1329,6 +1525,9 @@ }, "node_modules/@babel/plugin-proposal-optional-catch-binding": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -1343,6 +1542,9 @@ }, "node_modules/@babel/plugin-proposal-optional-chaining": { "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", @@ -1358,6 +1560,9 @@ }, "node_modules/@babel/plugin-proposal-private-methods": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", @@ -1372,6 +1577,9 @@ }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", @@ -1388,6 +1596,9 @@ }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.", "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", @@ -1402,6 +1613,8 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -1412,6 +1625,8 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" @@ -1422,6 +1637,8 @@ }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -1435,6 +1652,8 @@ }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -1445,6 +1664,8 @@ }, "node_modules/@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" @@ -1455,6 +1676,8 @@ }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1468,6 +1691,8 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -1478,6 +1703,8 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -1488,6 +1715,8 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -1498,6 +1727,8 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -1508,6 +1739,8 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -1518,6 +1751,8 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -1528,6 +1763,8 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -1538,6 +1775,8 @@ }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -1551,6 +1790,8 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -1564,6 +1805,8 @@ }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1577,6 +1820,8 @@ }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.18.6", @@ -1592,6 +1837,8 @@ }, "node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1604,7 +1851,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.0", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.3.tgz", + "integrity": "sha512-+F8CnfhuLhwUACIJMLWnjz6zvzYM2r0yeIHKlbgfw7ml8rOMJsXNXV/hyRcb3nb493gRs4WvYpQAndWj/qQmkQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1617,15 +1866,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.0", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", + "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-globals": "^7.28.0", + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.27.1", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" @@ -1636,6 +1887,8 @@ }, "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "license": "MIT", "dependencies": { "@babel/types": "^7.27.3" @@ -1646,6 +1899,8 @@ }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -1660,6 +1915,8 @@ }, "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/template": { "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -1671,11 +1928,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.0", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz", + "integrity": "sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1686,6 +1944,8 @@ }, "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", @@ -1700,6 +1960,8 @@ }, "node_modules/@babel/plugin-transform-duplicate-keys": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1713,6 +1975,8 @@ }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1726,6 +1990,8 @@ }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -1740,6 +2006,8 @@ }, "node_modules/@babel/plugin-transform-function-name": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.27.1", @@ -1755,6 +2023,8 @@ }, "node_modules/@babel/plugin-transform-literals": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1768,6 +2038,8 @@ }, "node_modules/@babel/plugin-transform-member-expression-literals": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1781,6 +2053,8 @@ }, "node_modules/@babel/plugin-transform-modules-amd": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.27.1", @@ -1795,6 +2069,8 @@ }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.27.1", @@ -1809,6 +2085,8 @@ }, "node_modules/@babel/plugin-transform-modules-systemjs": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.27.1", @@ -1825,6 +2103,8 @@ }, "node_modules/@babel/plugin-transform-modules-umd": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.27.1", @@ -1839,6 +2119,8 @@ }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", @@ -1853,6 +2135,8 @@ }, "node_modules/@babel/plugin-transform-new-target": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1866,6 +2150,8 @@ }, "node_modules/@babel/plugin-transform-object-super": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -1880,6 +2166,8 @@ }, "node_modules/@babel/plugin-transform-optional-chaining": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -1893,7 +2181,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.7", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", + "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1907,6 +2197,8 @@ }, "node_modules/@babel/plugin-transform-property-literals": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1919,7 +2211,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.1", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.1.tgz", + "integrity": "sha512-B19lbbL7PMrKr52BNPjCqg1IyNUIjTcxKj8uX9zHO+PmWN93s19NDr/f69mIkEp2x9nmDJ08a7lgHaTTzvW7mw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1933,6 +2227,8 @@ }, "node_modules/@babel/plugin-transform-reserved-words": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1946,6 +2242,8 @@ }, "node_modules/@babel/plugin-transform-runtime": { "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", + "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.18.6", @@ -1964,6 +2262,8 @@ }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -1971,6 +2271,8 @@ }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1984,6 +2286,8 @@ }, "node_modules/@babel/plugin-transform-spread": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -1998,6 +2302,8 @@ }, "node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -2011,6 +2317,8 @@ }, "node_modules/@babel/plugin-transform-template-literals": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -2024,6 +2332,8 @@ }, "node_modules/@babel/plugin-transform-typeof-symbol": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -2037,6 +2347,8 @@ }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -2050,6 +2362,8 @@ }, "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", @@ -2064,6 +2378,8 @@ }, "node_modules/@babel/preset-env": { "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", + "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", "license": "MIT", "dependencies": { "@babel/compat-data": "^7.18.8", @@ -2151,6 +2467,8 @@ }, "node_modules/@babel/preset-env/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -2158,6 +2476,8 @@ }, "node_modules/@babel/preset-modules": { "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", + "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", @@ -2172,6 +2492,8 @@ }, "node_modules/@babel/runtime": { "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", + "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.13.4" @@ -2182,6 +2504,8 @@ }, "node_modules/@babel/template": { "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.18.6", @@ -2193,29 +2517,33 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.0", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.3.tgz", + "integrity": "sha512-lId/IfN/Ye1CIu8xG7oKBHXd2iNb2aW1ilPszzGcJug6M8RCKfVNcYhpI5+bMvFYjK7lXIM0R+a+6r8xhHp2FQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.0", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.3", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.0", - "debug": "^4.3.1" + "@babel/types": "^7.27.3", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.28.0", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.3.tgz", + "integrity": "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.0", - "@babel/types": "^7.28.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", + "@babel/parser": "^7.27.3", + "@babel/types": "^7.27.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" }, "engines": { @@ -2224,6 +2552,8 @@ }, "node_modules/@babel/traverse/node_modules/@babel/template": { "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -2235,15 +2565,23 @@ } }, "node_modules/@babel/traverse/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/@babel/traverse/node_modules/jsesc": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -2253,7 +2591,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.2", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.3.tgz", + "integrity": "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -2265,6 +2605,8 @@ }, "node_modules/@colors/colors": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "devOptional": true, "license": "MIT", "engines": { @@ -2273,6 +2615,8 @@ }, "node_modules/@csstools/postcss-cascade-layers": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", + "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.2", @@ -2291,6 +2635,8 @@ }, "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", "license": "CC0-1.0", "engines": { "node": "^14 || ^16 || >=18" @@ -2305,6 +2651,8 @@ }, "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -2316,6 +2664,8 @@ }, "node_modules/@csstools/postcss-color-function": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", @@ -2334,6 +2684,8 @@ }, "node_modules/@csstools/postcss-font-format-keywords": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -2351,6 +2703,8 @@ }, "node_modules/@csstools/postcss-hwb-function": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -2368,6 +2722,8 @@ }, "node_modules/@csstools/postcss-ic-unit": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", @@ -2386,6 +2742,8 @@ }, "node_modules/@csstools/postcss-is-pseudo-class": { "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.0", @@ -2404,6 +2762,8 @@ }, "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", "license": "CC0-1.0", "engines": { "node": "^14 || ^16 || >=18" @@ -2418,6 +2778,8 @@ }, "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -2429,6 +2791,8 @@ }, "node_modules/@csstools/postcss-nested-calc": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", + "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -2446,6 +2810,8 @@ }, "node_modules/@csstools/postcss-normalize-display-values": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -2463,6 +2829,8 @@ }, "node_modules/@csstools/postcss-oklab-function": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", @@ -2481,6 +2849,8 @@ }, "node_modules/@csstools/postcss-progressive-custom-properties": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -2494,6 +2864,8 @@ }, "node_modules/@csstools/postcss-stepped-value-functions": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -2511,6 +2883,8 @@ }, "node_modules/@csstools/postcss-text-decoration-shorthand": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", + "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -2528,6 +2902,8 @@ }, "node_modules/@csstools/postcss-trigonometric-functions": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", + "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -2545,6 +2921,8 @@ }, "node_modules/@csstools/postcss-unset-value": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", "license": "CC0-1.0", "engines": { "node": "^12 || ^14 || >=16" @@ -2559,17 +2937,39 @@ }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "license": "MIT", "engines": { "node": ">=10.0.0" } }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz", + "integrity": "sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@gar/promisify": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "license": "MIT" }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "license": "ISC", "dependencies": { "camelcase": "^5.3.1", @@ -2584,6 +2984,8 @@ }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "license": "MIT", "engines": { "node": ">=8" @@ -2591,6 +2993,8 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.0.0", @@ -2602,6 +3006,8 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "license": "MIT", "engines": { "node": ">=6.0.0" @@ -2609,13 +3015,17 @@ }, "node_modules/@jridgewell/set-array": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.10", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -2623,19 +3033,29 @@ } }, "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -2644,10 +3064,14 @@ }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", "license": "MIT" }, "node_modules/@ng-select/ng-select": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-9.1.0.tgz", + "integrity": "sha512-vxSRD2d84H39eqtTJaethlpQ+xkJUU8epQNUr3yPiah23z8MBCqSDE1t0chxi+rXJz7+xoC9qFa1aYnUVFan4w==", "license": "MIT", "peer": true, "dependencies": { @@ -2665,6 +3089,8 @@ }, "node_modules/@ngageoint/mage.web-core-lib": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@ngageoint/mage.web-core-lib/-/mage.web-core-lib-6.3.0.tgz", + "integrity": "sha512-YbPNq4HfOjmWvO4Z9DPA2wiaBCAvYaocTrhSY7rAjtGMSjpr6ol9AO5Rah1rdgYtOq98REgrfq8R3NWdG69cmw==", "dependencies": { "@rollup/plugin-commonjs": "25.0.8", "@rollup/plugin-node-resolve": "15.3.1", @@ -2691,6 +3117,8 @@ }, "node_modules/@ngageoint/mage.web-core-lib/node_modules/rxjs": { "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" @@ -2698,6 +3126,8 @@ }, "node_modules/@ngtools/webpack": { "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-14.2.13.tgz", + "integrity": "sha512-RQx/rGX7K/+R55x1R6Ax1JzyeHi8cW11dEXpzHWipyuSpusQLUN53F02eMB4VTakXsL3mFNWWy4bX3/LSq8/9w==", "license": "MIT", "engines": { "node": "^14.15.0 || >=16.10.0", @@ -2712,6 +3142,8 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -2723,6 +3155,8 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "license": "MIT", "engines": { "node": ">= 8" @@ -2730,6 +3164,8 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -2741,6 +3177,8 @@ }, "node_modules/@npmcli/fs": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", "license": "ISC", "dependencies": { "@gar/promisify": "^1.1.3", @@ -2752,6 +3190,8 @@ }, "node_modules/@npmcli/git": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.2.tgz", + "integrity": "sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w==", "dev": true, "license": "ISC", "dependencies": { @@ -2771,6 +3211,8 @@ }, "node_modules/@npmcli/git/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "license": "ISC", "engines": { @@ -2779,6 +3221,8 @@ }, "node_modules/@npmcli/git/node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { @@ -2793,6 +3237,8 @@ }, "node_modules/@npmcli/installed-package-contents": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", + "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", "dev": true, "license": "ISC", "dependencies": { @@ -2808,6 +3254,9 @@ }, "node_modules/@npmcli/move-file": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", "license": "MIT", "dependencies": { "mkdirp": "^1.0.4", @@ -2819,6 +3268,8 @@ }, "node_modules/@npmcli/node-gyp": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", + "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", "dev": true, "license": "ISC", "engines": { @@ -2827,6 +3278,8 @@ }, "node_modules/@npmcli/promise-spawn": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", + "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", "dev": true, "license": "ISC", "dependencies": { @@ -2838,6 +3291,8 @@ }, "node_modules/@npmcli/run-script": { "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.1.tgz", + "integrity": "sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg==", "dev": true, "license": "ISC", "dependencies": { @@ -2853,6 +3308,8 @@ }, "node_modules/@npmcli/run-script/node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { @@ -2867,6 +3324,8 @@ }, "node_modules/@rollup/plugin-commonjs": { "version": "25.0.8", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.8.tgz", + "integrity": "sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==", "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", @@ -2890,6 +3349,8 @@ }, "node_modules/@rollup/plugin-commonjs/node_modules/magic-string": { "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" @@ -2897,6 +3358,8 @@ }, "node_modules/@rollup/plugin-json": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz", + "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==", "license": "MIT", "dependencies": { "@rollup/pluginutils": "^3.0.8" @@ -2907,6 +3370,8 @@ }, "node_modules/@rollup/plugin-json/node_modules/@rollup/pluginutils": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "license": "MIT", "dependencies": { "@types/estree": "0.0.39", @@ -2922,14 +3387,20 @@ }, "node_modules/@rollup/plugin-json/node_modules/@types/estree": { "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "license": "MIT" }, "node_modules/@rollup/plugin-json/node_modules/estree-walker": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "license": "MIT" }, "node_modules/@rollup/plugin-json/node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -2940,6 +3411,8 @@ }, "node_modules/@rollup/plugin-node-resolve": { "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", + "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", @@ -2961,7 +3434,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.2.0", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -2982,6 +3457,8 @@ }, "node_modules/@schematics/angular": { "version": "14.2.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.2.0.tgz", + "integrity": "sha512-9y5nnL4XpxhRIrkV2C8H12LbLEVhQP8VK7/V7sbXJ/V4ioUi5BT6P6t3qLcFNOrk9/+mJIVbsXdZkXnyxy2dRA==", "license": "MIT", "peer": true, "dependencies": { @@ -2997,6 +3474,8 @@ }, "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { "version": "14.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.0.tgz", + "integrity": "sha512-IwiS6uDs3drR4i3nuqVinh5jtI1SHIyn/OaoWL6t3V7Y6b65BdJN1liyd+WBUEZmEwGCkY2/FjnLx1G8Dflc8A==", "license": "MIT", "peer": true, "dependencies": { @@ -3022,6 +3501,8 @@ }, "node_modules/@schematics/angular/node_modules/rxjs": { "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -3033,16 +3514,22 @@ }, "node_modules/@schematics/angular/node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD", "peer": true }, "node_modules/@socket.io/component-emitter": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", "devOptional": true, "license": "MIT" }, "node_modules/@tootallnate/once": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, "license": "MIT", "engines": { @@ -3050,7 +3537,9 @@ } }, "node_modules/@types/body-parser": { - "version": "1.19.6", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "license": "MIT", "dependencies": { "@types/connect": "*", @@ -3059,6 +3548,8 @@ }, "node_modules/@types/bonjour": { "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -3066,6 +3557,8 @@ }, "node_modules/@types/connect": { "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -3073,6 +3566,8 @@ }, "node_modules/@types/connect-history-api-fallback": { "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "license": "MIT", "dependencies": { "@types/express-serve-static-core": "*", @@ -3080,7 +3575,9 @@ } }, "node_modules/@types/cors": { - "version": "2.8.19", + "version": "2.8.18", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.18.tgz", + "integrity": "sha512-nX3d0sxJW41CqQvfOzVG1NCTXfFDrDWIghCZncpHeWlVFd81zxB/DLhg7avFg6eHLCRX7ckBmoIIcqa++upvJA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -3089,6 +3586,8 @@ }, "node_modules/@types/eslint": { "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "license": "MIT", "dependencies": { "@types/estree": "*", @@ -3097,6 +3596,8 @@ }, "node_modules/@types/eslint-scope": { "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "license": "MIT", "dependencies": { "@types/eslint": "*", @@ -3104,11 +3605,15 @@ } }, "node_modules/@types/estree": { - "version": "1.0.8", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", "license": "MIT" }, "node_modules/@types/express": { - "version": "4.17.23", + "version": "4.17.22", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.22.tgz", + "integrity": "sha512-eZUmSnhRX9YRSkplpz0N+k6NljUUn5l3EWZIKZvYzhvMphEuNiyyy1viH/ejgt66JWgALwC/gtSUAeQKtSwW/w==", "license": "MIT", "dependencies": { "@types/body-parser": "*", @@ -3118,7 +3623,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "5.0.7", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -3129,6 +3636,8 @@ }, "node_modules/@types/express/node_modules/@types/express-serve-static-core": { "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -3139,15 +3648,21 @@ }, "node_modules/@types/geojson": { "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", "dev": true, "license": "MIT" }, "node_modules/@types/http-errors": { - "version": "2.0.5", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "license": "MIT" }, "node_modules/@types/http-proxy": { "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -3155,11 +3670,15 @@ }, "node_modules/@types/jasmine": { "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.14.tgz", + "integrity": "sha512-Fkgk536sHPqcOtd+Ow+WiUNuk0TSo/BntKkF8wSvcd6M2FvPjeXcUE6Oz/bwDZiUZEaXLslAgw00Q94Pnx6T4w==", "dev": true, "license": "MIT" }, "node_modules/@types/jasminewd2": { "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.13.tgz", + "integrity": "sha512-aJ3wj8tXMpBrzQ5ghIaqMisD8C3FIrcO6sDKHqFbuqAsI7yOxj0fA7MrRCPLZHIVUjERIwsMmGn/vB0UQ9u0Hg==", "dev": true, "license": "MIT", "dependencies": { @@ -3168,18 +3687,26 @@ }, "node_modules/@types/json-schema": { "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "license": "MIT" }, "node_modules/@types/mime": { "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "license": "MIT" }, "node_modules/@types/node": { "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", "license": "MIT" }, "node_modules/@types/node-forge": { - "version": "1.3.13", + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -3187,36 +3714,52 @@ }, "node_modules/@types/parse-json": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "license": "MIT" }, "node_modules/@types/q": { "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha512-qYi3YV9inU/REEfxwVcGZzbS3KG/Xs90lv0Pr+lDtuVjBPGd1A+eciXzVSaRvLify132BfcvhvEjeVahrUl0Ug==", "devOptional": true, "license": "MIT" }, "node_modules/@types/qs": { "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "license": "MIT" }, "node_modules/@types/resolve": { "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", "license": "MIT" }, "node_modules/@types/retry": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "license": "MIT" }, "node_modules/@types/selenium-webdriver": { "version": "3.0.26", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.26.tgz", + "integrity": "sha512-dyIGFKXfUFiwkMfNGn1+F6b80ZjR3uSYv1j6xVJSDlft5waZ2cwkHW4e7zNzvq7hiEackcgvBpmnXZrI1GltPg==", "devOptional": true, "license": "MIT" }, "node_modules/@types/send": { - "version": "0.17.5", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "license": "MIT", "dependencies": { "@types/mime": "^1", @@ -3225,13 +3768,17 @@ }, "node_modules/@types/serve-index": { "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "license": "MIT", "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.8", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "license": "MIT", "dependencies": { "@types/http-errors": "*", @@ -3241,6 +3788,8 @@ }, "node_modules/@types/sockjs": { "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -3248,6 +3797,8 @@ }, "node_modules/@types/ws": { "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -3255,6 +3806,8 @@ }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.11.1", @@ -3263,18 +3816,26 @@ }, "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.1", @@ -3284,10 +3845,14 @@ }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.1", @@ -3298,6 +3863,8 @@ }, "node_modules/@webassemblyjs/ieee754": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" @@ -3305,6 +3872,8 @@ }, "node_modules/@webassemblyjs/leb128": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" @@ -3312,10 +3881,14 @@ }, "node_modules/@webassemblyjs/utf8": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.1", @@ -3330,6 +3903,8 @@ }, "node_modules/@webassemblyjs/wasm-gen": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.1", @@ -3341,6 +3916,8 @@ }, "node_modules/@webassemblyjs/wasm-opt": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.1", @@ -3351,6 +3928,8 @@ }, "node_modules/@webassemblyjs/wasm-parser": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.1", @@ -3363,6 +3942,8 @@ }, "node_modules/@webassemblyjs/wast-printer": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.1", @@ -3371,28 +3952,41 @@ }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "license": "Apache-2.0" }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true, "license": "BSD-2-Clause" }, "node_modules/abab": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", "license": "BSD-3-Clause" }, "node_modules/abbrev": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "license": "ISC" }, "node_modules/accepts": { "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "license": "MIT", "dependencies": { "mime-types": "~2.1.34", @@ -3404,13 +3998,17 @@ }, "node_modules/accepts/node_modules/negotiator": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/acorn": { - "version": "8.15.0", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -3421,6 +4019,9 @@ }, "node_modules/acorn-import-assertions": { "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "deprecated": "package has been renamed to acorn-import-attributes", "license": "MIT", "peerDependencies": { "acorn": "^8" @@ -3428,6 +4029,8 @@ }, "node_modules/adjust-sourcemap-loader": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", @@ -3439,6 +4042,8 @@ }, "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "license": "MIT", "dependencies": { "big.js": "^5.2.2", @@ -3451,6 +4056,8 @@ }, "node_modules/adm-zip": { "version": "0.5.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", + "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", "devOptional": true, "license": "MIT", "engines": { @@ -3459,6 +4066,8 @@ }, "node_modules/agent-base": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "license": "MIT", "dependencies": { "debug": "4" @@ -3469,6 +4078,8 @@ }, "node_modules/agentkeepalive": { "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3480,6 +4091,8 @@ }, "node_modules/aggregate-error": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", @@ -3491,6 +4104,8 @@ }, "node_modules/ajv": { "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -3505,6 +4120,8 @@ }, "node_modules/ajv-formats": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -3520,6 +4137,8 @@ }, "node_modules/ajv-keywords": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" @@ -3530,6 +4149,8 @@ }, "node_modules/ansi-colors": { "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "license": "MIT", "engines": { "node": ">=6" @@ -3537,6 +4158,8 @@ }, "node_modules/ansi-escapes": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "license": "MIT", "dependencies": { "type-fest": "^0.21.3" @@ -3550,6 +4173,8 @@ }, "node_modules/ansi-html-community": { "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "engines": [ "node >= 0.8.0" ], @@ -3560,6 +4185,8 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", "engines": { "node": ">=8" @@ -3567,6 +4194,8 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -3580,6 +4209,8 @@ }, "node_modules/anymatch": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -3591,6 +4222,8 @@ }, "node_modules/anymatch/node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -3600,12 +4233,17 @@ } }, "node_modules/aproba": { - "version": "2.1.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true, "license": "ISC" }, "node_modules/are-we-there-yet": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", "dev": true, "license": "ISC", "dependencies": { @@ -3618,11 +4256,15 @@ }, "node_modules/arg": { "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true, "license": "MIT" }, "node_modules/argparse": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" @@ -3630,6 +4272,8 @@ }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "license": "MIT", "dependencies": { @@ -3645,10 +4289,14 @@ }, "node_modules/array-flatten": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "license": "MIT" }, "node_modules/array-union": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", "devOptional": true, "license": "MIT", "dependencies": { @@ -3660,6 +4308,8 @@ }, "node_modules/array-uniq": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "devOptional": true, "license": "MIT", "engines": { @@ -3668,6 +4318,8 @@ }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3688,6 +4340,8 @@ }, "node_modules/arrify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "devOptional": true, "license": "MIT", "engines": { @@ -3696,6 +4350,8 @@ }, "node_modules/asn1": { "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -3704,6 +4360,8 @@ }, "node_modules/assert-plus": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "devOptional": true, "license": "MIT", "engines": { @@ -3712,6 +4370,8 @@ }, "node_modules/async-function": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "dev": true, "license": "MIT", "engines": { @@ -3720,11 +4380,15 @@ }, "node_modules/asynckit": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "devOptional": true, "license": "MIT" }, "node_modules/atob": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "license": "(MIT OR Apache-2.0)", "bin": { "atob": "bin/atob.js" @@ -3735,6 +4399,8 @@ }, "node_modules/autoprefixer": { "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", "funding": [ { "type": "opencollective", @@ -3770,6 +4436,8 @@ }, "node_modules/available-typed-arrays": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3784,6 +4452,8 @@ }, "node_modules/aws-sign2": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "devOptional": true, "license": "Apache-2.0", "engines": { @@ -3792,11 +4462,15 @@ }, "node_modules/aws4": { "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", "devOptional": true, "license": "MIT" }, "node_modules/babel-loader": { "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", + "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", "license": "MIT", "dependencies": { "find-cache-dir": "^3.3.1", @@ -3814,6 +4488,8 @@ }, "node_modules/babel-loader/node_modules/loader-utils": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "license": "MIT", "dependencies": { "big.js": "^5.2.2", @@ -3826,6 +4502,8 @@ }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "license": "BSD-3-Clause", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", @@ -3840,6 +4518,8 @@ }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", "license": "MIT", "dependencies": { "@babel/compat-data": "^7.17.7", @@ -3852,6 +4532,8 @@ }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -3859,6 +4541,8 @@ }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", + "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.3.2", @@ -3870,6 +4554,8 @@ }, "node_modules/babel-plugin-polyfill-regenerator": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.3.3" @@ -3880,10 +4566,14 @@ }, "node_modules/balanced-match": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -3902,6 +4592,8 @@ }, "node_modules/base64id": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "devOptional": true, "license": "MIT", "engines": { @@ -3910,10 +4602,14 @@ }, "node_modules/batch": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "license": "MIT" }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "devOptional": true, "license": "BSD-3-Clause", "dependencies": { @@ -3922,6 +4618,8 @@ }, "node_modules/big.js": { "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "license": "MIT", "engines": { "node": "*" @@ -3929,6 +4627,8 @@ }, "node_modules/binary-extensions": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "license": "MIT", "engines": { "node": ">=8" @@ -3939,6 +4639,8 @@ }, "node_modules/bl": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", "dependencies": { "buffer": "^5.5.0", @@ -3948,6 +4650,8 @@ }, "node_modules/blocking-proxy": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -3962,6 +4666,8 @@ }, "node_modules/body-parser": { "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "license": "MIT", "dependencies": { "bytes": "3.1.2", @@ -3984,6 +4690,8 @@ }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -3991,10 +4699,14 @@ }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/bonjour-service": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -4003,10 +4715,14 @@ }, "node_modules/boolbase": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "license": "ISC" }, "node_modules/brace-expansion": { - "version": "2.0.2", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -4014,6 +4730,8 @@ }, "node_modules/braces": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -4023,7 +4741,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.1", + "version": "4.24.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", + "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", "funding": [ { "type": "opencollective", @@ -4040,8 +4760,8 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", + "caniuse-lite": "^1.0.30001716", + "electron-to-chromium": "^1.5.149", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, @@ -4054,6 +4774,8 @@ }, "node_modules/browserstack": { "version": "1.6.1", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.1.tgz", + "integrity": "sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4062,6 +4784,8 @@ }, "node_modules/browserstack/node_modules/agent-base": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4073,6 +4797,8 @@ }, "node_modules/browserstack/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4081,6 +4807,8 @@ }, "node_modules/browserstack/node_modules/https-proxy-agent": { "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4093,6 +4821,8 @@ }, "node_modules/buffer": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -4115,10 +4845,14 @@ }, "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==", "license": "MIT" }, "node_modules/builtin-modules": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", "dev": true, "license": "MIT", "engines": { @@ -4127,6 +4861,8 @@ }, "node_modules/builtins": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", + "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", "dev": true, "license": "MIT", "dependencies": { @@ -4135,6 +4871,8 @@ }, "node_modules/bytes": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -4142,6 +4880,8 @@ }, "node_modules/cacache": { "version": "16.1.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.2.tgz", + "integrity": "sha512-Xx+xPlfCZIUHagysjjOAje9nRo8pRDczQCcXb4J2O0BLtH+xeVue6ba4y1kfJfQMAnM2mkcoMIAyOctlaRGWYA==", "license": "ISC", "dependencies": { "@npmcli/fs": "^2.1.0", @@ -4169,6 +4909,8 @@ }, "node_modules/cacache/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "license": "ISC", "engines": { "node": ">=12" @@ -4176,6 +4918,8 @@ }, "node_modules/call-bind": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, "license": "MIT", "dependencies": { @@ -4193,6 +4937,8 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -4204,6 +4950,8 @@ }, "node_modules/call-bound": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -4218,6 +4966,8 @@ }, "node_modules/callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "license": "MIT", "engines": { "node": ">=6" @@ -4225,13 +4975,17 @@ }, "node_modules/camelcase": { "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001731", + "version": "1.0.30001718", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", + "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", "funding": [ { "type": "opencollective", @@ -4250,11 +5004,15 @@ }, "node_modules/caseless": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -4269,10 +5027,14 @@ }, "node_modules/chardet": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "license": "MIT" }, "node_modules/chokidar": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "license": "MIT", "dependencies": { "anymatch": "~3.1.2", @@ -4295,6 +5057,8 @@ }, "node_modules/chownr": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "license": "ISC", "engines": { "node": ">=10" @@ -4302,6 +5066,8 @@ }, "node_modules/chrome-trace-event": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "license": "MIT", "engines": { "node": ">=6.0" @@ -4309,6 +5075,8 @@ }, "node_modules/clean-stack": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "license": "MIT", "engines": { "node": ">=6" @@ -4316,6 +5084,8 @@ }, "node_modules/cli-cursor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" @@ -4326,6 +5096,8 @@ }, "node_modules/cli-spinners": { "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "license": "MIT", "engines": { "node": ">=6" @@ -4336,6 +5108,8 @@ }, "node_modules/cli-width": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "license": "ISC", "engines": { "node": ">= 10" @@ -4343,6 +5117,8 @@ }, "node_modules/cliui": { "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "license": "ISC", "dependencies": { "string-width": "^4.2.0", @@ -4352,6 +5128,8 @@ }, "node_modules/clone": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "license": "MIT", "engines": { "node": ">=0.8" @@ -4359,6 +5137,8 @@ }, "node_modules/clone-deep": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", @@ -4371,6 +5151,8 @@ }, "node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -4381,10 +5163,14 @@ }, "node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/color-support": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true, "license": "ISC", "bin": { @@ -4393,10 +5179,14 @@ }, "node_modules/colorette": { "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "license": "MIT" }, "node_modules/colors": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true, "license": "MIT", "engines": { @@ -4405,6 +5195,8 @@ }, "node_modules/combined-stream": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4416,6 +5208,8 @@ }, "node_modules/commander": { "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "license": "MIT", "engines": { "node": "^12.20.0 || >=14" @@ -4423,10 +5217,14 @@ }, "node_modules/commondir": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "license": "MIT" }, "node_modules/compressible": { "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" @@ -4436,14 +5234,16 @@ } }, "node_modules/compression": { - "version": "1.8.1", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz", + "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", "license": "MIT", "dependencies": { "bytes": "3.1.2", "compressible": "~2.0.18", "debug": "2.6.9", "negotiator": "~0.6.4", - "on-headers": "~1.1.0", + "on-headers": "~1.0.2", "safe-buffer": "5.2.1", "vary": "~1.1.2" }, @@ -4453,6 +5253,8 @@ }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -4460,14 +5262,20 @@ }, "node_modules/compression/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, "node_modules/connect": { "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4482,6 +5290,8 @@ }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "license": "MIT", "engines": { "node": ">=0.8" @@ -4489,6 +5299,8 @@ }, "node_modules/connect/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4497,16 +5309,22 @@ }, "node_modules/connect/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "devOptional": true, "license": "MIT" }, "node_modules/console-control-strings": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true, "license": "ISC" }, "node_modules/content-disposition": { "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" @@ -4517,6 +5335,8 @@ }, "node_modules/content-type": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -4524,10 +5344,14 @@ }, "node_modules/convert-source-map": { "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "license": "MIT" }, "node_modules/cookie": { "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "devOptional": true, "license": "MIT", "engines": { @@ -4536,10 +5360,14 @@ }, "node_modules/cookie-signature": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "license": "MIT" }, "node_modules/copy-anything": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", "license": "MIT", "dependencies": { "is-what": "^3.14.1" @@ -4550,6 +5378,8 @@ }, "node_modules/copy-webpack-plugin": { "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "license": "MIT", "dependencies": { "fast-glob": "^3.2.11", @@ -4572,6 +5402,8 @@ }, "node_modules/copy-webpack-plugin/node_modules/glob-parent": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "license": "ISC", "dependencies": { "is-glob": "^4.0.3" @@ -4582,6 +5414,8 @@ }, "node_modules/copy-webpack-plugin/node_modules/schema-utils": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -4598,10 +5432,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.45.0", + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.42.0.tgz", + "integrity": "sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==", "license": "MIT", "dependencies": { - "browserslist": "^4.25.1" + "browserslist": "^4.24.4" }, "funding": { "type": "opencollective", @@ -4610,10 +5446,14 @@ }, "node_modules/core-util-is": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", "license": "MIT" }, "node_modules/cors": { "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4626,6 +5466,8 @@ }, "node_modules/cosmiconfig": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", @@ -4640,6 +5482,8 @@ }, "node_modules/critters": { "version": "0.0.16", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", + "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", "license": "Apache-2.0", "dependencies": { "chalk": "^4.1.0", @@ -4652,10 +5496,14 @@ }, "node_modules/critters/node_modules/parse5": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "license": "MIT" }, "node_modules/cross-spawn": { "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, "license": "MIT", "dependencies": { @@ -4671,6 +5519,8 @@ }, "node_modules/cross-spawn/node_modules/semver": { "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "license": "ISC", "bin": { @@ -4679,6 +5529,8 @@ }, "node_modules/css": { "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -4689,6 +5541,8 @@ }, "node_modules/css-blank-pseudo": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" @@ -4705,6 +5559,8 @@ }, "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -4716,6 +5572,8 @@ }, "node_modules/css-has-pseudo": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" @@ -4732,6 +5590,8 @@ }, "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -4743,6 +5603,8 @@ }, "node_modules/css-loader": { "version": "6.7.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", + "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", @@ -4767,6 +5629,8 @@ }, "node_modules/css-parse": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha512-UNIFik2RgSbiTwIW1IsFwXWn6vs+bYdq83LKTSOsx7NJR7WII9dxewkHLltfTLVppoUApHV0118a4RZRI9FLwA==", "license": "MIT", "dependencies": { "css": "^2.0.0" @@ -4774,6 +5638,8 @@ }, "node_modules/css-prefers-color-scheme": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", "license": "CC0-1.0", "bin": { "css-prefers-color-scheme": "dist/cli.cjs" @@ -4787,6 +5653,8 @@ }, "node_modules/css-select": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -4800,7 +5668,9 @@ } }, "node_modules/css-what": { - "version": "6.2.2", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "license": "BSD-2-Clause", "engines": { "node": ">= 6" @@ -4811,6 +5681,8 @@ }, "node_modules/css/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -4818,6 +5690,9 @@ }, "node_modules/css/node_modules/source-map-resolve": { "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", "license": "MIT", "dependencies": { "atob": "^2.1.2", @@ -4829,6 +5704,8 @@ }, "node_modules/cssdb": { "version": "7.11.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", + "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==", "funding": [ { "type": "opencollective", @@ -4843,6 +5720,8 @@ }, "node_modules/cssesc": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "license": "MIT", "bin": { "cssesc": "bin/cssesc" @@ -4853,15 +5732,21 @@ }, "node_modules/cuint": { "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==", "license": "MIT" }, "node_modules/custom-event": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", "devOptional": true, "license": "MIT" }, "node_modules/dashdash": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4873,6 +5758,8 @@ }, "node_modules/data-view-buffer": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4889,6 +5776,8 @@ }, "node_modules/data-view-byte-length": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4905,6 +5794,8 @@ }, "node_modules/data-view-byte-offset": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4921,6 +5812,8 @@ }, "node_modules/date-format": { "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", "devOptional": true, "license": "MIT", "engines": { @@ -4929,6 +5822,8 @@ }, "node_modules/debug": { "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "license": "MIT", "dependencies": { "ms": "2.1.2" @@ -4944,6 +5839,8 @@ }, "node_modules/decamelize": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "devOptional": true, "license": "MIT", "engines": { @@ -4952,6 +5849,8 @@ }, "node_modules/decode-uri-component": { "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "license": "MIT", "engines": { "node": ">=0.10" @@ -4959,6 +5858,8 @@ }, "node_modules/deepmerge": { "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -4966,6 +5867,8 @@ }, "node_modules/default-gateway": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "license": "BSD-2-Clause", "dependencies": { "execa": "^5.0.0" @@ -4976,6 +5879,8 @@ }, "node_modules/defaults": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "license": "MIT", "dependencies": { "clone": "^1.0.2" @@ -4986,6 +5891,8 @@ }, "node_modules/define-data-property": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "license": "MIT", "dependencies": { @@ -5002,6 +5909,8 @@ }, "node_modules/define-lazy-prop": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "license": "MIT", "engines": { "node": ">=8" @@ -5009,6 +5918,8 @@ }, "node_modules/define-properties": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "license": "MIT", "dependencies": { @@ -5025,6 +5936,8 @@ }, "node_modules/del": { "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5041,7 +5954,9 @@ } }, "node_modules/del/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5051,6 +5966,9 @@ }, "node_modules/del/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "devOptional": true, "license": "ISC", "dependencies": { @@ -5070,6 +5988,8 @@ }, "node_modules/del/node_modules/globby": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5086,6 +6006,8 @@ }, "node_modules/del/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "devOptional": true, "license": "ISC", "dependencies": { @@ -5097,6 +6019,9 @@ }, "node_modules/del/node_modules/rimraf": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "devOptional": true, "license": "ISC", "dependencies": { @@ -5108,6 +6033,8 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "devOptional": true, "license": "MIT", "engines": { @@ -5116,11 +6043,15 @@ }, "node_modules/delegates": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true, "license": "MIT" }, "node_modules/depd": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -5128,6 +6059,8 @@ }, "node_modules/dependency-graph": { "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", "license": "MIT", "engines": { "node": ">= 0.6.0" @@ -5135,6 +6068,8 @@ }, "node_modules/destroy": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "license": "MIT", "engines": { "node": ">= 0.8", @@ -5143,15 +6078,21 @@ }, "node_modules/detect-node": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "license": "MIT" }, "node_modules/di": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", "devOptional": true, "license": "MIT" }, "node_modules/diff": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -5160,6 +6101,8 @@ }, "node_modules/dir-glob": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "license": "MIT", "dependencies": { "path-type": "^4.0.0" @@ -5170,6 +6113,8 @@ }, "node_modules/dns-packet": { "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "license": "MIT", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" @@ -5180,6 +6125,8 @@ }, "node_modules/dom-serialize": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5191,6 +6138,8 @@ }, "node_modules/dom-serializer": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", @@ -5203,6 +6152,8 @@ }, "node_modules/domelementtype": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", @@ -5213,6 +6164,8 @@ }, "node_modules/domhandler": { "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.2.0" @@ -5226,6 +6179,8 @@ }, "node_modules/domutils": { "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^1.0.1", @@ -5238,6 +6193,8 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -5250,6 +6207,8 @@ }, "node_modules/ecc-jsbn": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5259,23 +6218,33 @@ }, "node_modules/ecc-jsbn/node_modules/jsbn": { "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "devOptional": true, "license": "MIT" }, "node_modules/ee-first": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.195", + "version": "1.5.159", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.159.tgz", + "integrity": "sha512-CEvHptWAMV5p6GJ0Lq8aheyvVbfzVrv5mmidu1D3pidoVNkB3tTBsTMVtPJ+rzRK5oV229mCLz9Zj/hNvU8GBA==", "license": "ISC" }, "node_modules/emoji-regex": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, "node_modules/emojis-list": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "license": "MIT", "engines": { "node": ">= 4" @@ -5283,6 +6252,8 @@ }, "node_modules/encodeurl": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -5290,6 +6261,8 @@ }, "node_modules/encoding": { "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, "license": "MIT", "optional": true, @@ -5299,6 +6272,8 @@ }, "node_modules/encoding/node_modules/iconv-lite": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "license": "MIT", "optional": true, @@ -5311,6 +6286,8 @@ }, "node_modules/engine.io": { "version": "6.6.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", + "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5330,6 +6307,8 @@ }, "node_modules/engine.io-parser": { "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "devOptional": true, "license": "MIT", "engines": { @@ -5337,7 +6316,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.2", + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -5349,6 +6330,8 @@ }, "node_modules/ent": { "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.2.tgz", + "integrity": "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5363,6 +6346,8 @@ }, "node_modules/entities": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" @@ -5370,6 +6355,8 @@ }, "node_modules/env-paths": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, "license": "MIT", "engines": { @@ -5378,11 +6365,15 @@ }, "node_modules/err-code": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true, "license": "MIT" }, "node_modules/errno": { "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "license": "MIT", "optional": true, "dependencies": { @@ -5394,13 +6385,17 @@ }, "node_modules/error-ex": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { - "version": "1.24.0", + "version": "1.23.10", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.10.tgz", + "integrity": "sha512-MtUbM072wlJNyeYAe0mhzrD+M6DIJa96CZAOBBrhDbgKnB4MApIKefcyAB1eOdYn8cUNZgvwBvEzdoAYsxgEIw==", "dev": true, "license": "MIT", "dependencies": { @@ -5431,9 +6426,7 @@ "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", - "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", @@ -5448,7 +6441,6 @@ "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", @@ -5468,6 +6460,8 @@ }, "node_modules/es-define-property": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -5475,6 +6469,8 @@ }, "node_modules/es-errors": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -5482,10 +6478,14 @@ }, "node_modules/es-module-lexer": { "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -5496,6 +6496,8 @@ }, "node_modules/es-set-tostringtag": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, "license": "MIT", "dependencies": { @@ -5510,6 +6512,8 @@ }, "node_modules/es-to-primitive": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, "license": "MIT", "dependencies": { @@ -5526,11 +6530,15 @@ }, "node_modules/es6-promise": { "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", "devOptional": true, "license": "MIT" }, "node_modules/es6-promisify": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5539,6 +6547,8 @@ }, "node_modules/esbuild": { "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.5.tgz", + "integrity": "sha512-VSf6S1QVqvxfIsSKb3UKr3VhUCis7wgDbtF4Vd9z84UJr05/Sp2fRKmzC+CSPG/dNAPPJZ0BTBLTT1Fhd6N9Gg==", "hasInstallScript": true, "license": "MIT", "optional": true, @@ -5572,8 +6582,58 @@ "esbuild-windows-arm64": "0.15.5" } }, + "node_modules/esbuild-android-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz", + "integrity": "sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz", + "integrity": "sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz", + "integrity": "sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/esbuild-darwin-arm64": { "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz", + "integrity": "sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg==", "cpu": [ "arm64" ], @@ -5586,8 +6646,218 @@ "node": ">=12" } }, + "node_modules/esbuild-freebsd-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz", + "integrity": "sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz", + "integrity": "sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz", + "integrity": "sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz", + "integrity": "sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz", + "integrity": "sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz", + "integrity": "sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz", + "integrity": "sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz", + "integrity": "sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz", + "integrity": "sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz", + "integrity": "sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz", + "integrity": "sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz", + "integrity": "sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz", + "integrity": "sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/esbuild-wasm": { "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.15.5.tgz", + "integrity": "sha512-lTJOEKekN/4JI/eOEq0wLcx53co2N6vaT/XjBz46D1tvIVoUEyM0o2K6txW6gEotf31szFD/J1PbxmnbkGlK9A==", "license": "MIT", "bin": { "esbuild": "bin/esbuild" @@ -5596,8 +6866,58 @@ "node": ">=12" } }, + "node_modules/esbuild-windows-32": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz", + "integrity": "sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz", + "integrity": "sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz", + "integrity": "sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/escalade": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", "engines": { "node": ">=6" @@ -5605,10 +6925,14 @@ }, "node_modules/escape-html": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "license": "MIT", "engines": { "node": ">=0.8.0" @@ -5616,6 +6940,8 @@ }, "node_modules/eslint-scope": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -5627,6 +6953,8 @@ }, "node_modules/esprima": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -5638,6 +6966,8 @@ }, "node_modules/esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -5648,6 +6978,8 @@ }, "node_modules/esrecurse/node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -5655,6 +6987,8 @@ }, "node_modules/estraverse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -5662,10 +6996,14 @@ }, "node_modules/estree-walker": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" @@ -5673,6 +7011,8 @@ }, "node_modules/etag": { "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -5680,14 +7020,20 @@ }, "node_modules/eventemitter-asyncresource": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", "license": "MIT" }, "node_modules/eventemitter3": { "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "license": "MIT" }, "node_modules/events": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "license": "MIT", "engines": { "node": ">=0.8.x" @@ -5695,6 +7041,8 @@ }, "node_modules/execa": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", @@ -5716,6 +7064,8 @@ }, "node_modules/execa/node_modules/cross-spawn": { "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -5728,6 +7078,8 @@ }, "node_modules/execa/node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", "engines": { "node": ">=8" @@ -5735,6 +7087,8 @@ }, "node_modules/execa/node_modules/shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -5745,6 +7099,8 @@ }, "node_modules/execa/node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", "engines": { "node": ">=8" @@ -5752,6 +7108,8 @@ }, "node_modules/execa/node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -5765,6 +7123,8 @@ }, "node_modules/exit": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "devOptional": true, "engines": { "node": ">= 0.8.0" @@ -5772,11 +7132,15 @@ }, "node_modules/exponential-backoff": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", "dev": true, "license": "Apache-2.0" }, "node_modules/express": { "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", @@ -5821,6 +7185,8 @@ }, "node_modules/express/node_modules/cookie": { "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -5828,6 +7194,8 @@ }, "node_modules/express/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -5835,6 +7203,8 @@ }, "node_modules/express/node_modules/encodeurl": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -5842,6 +7212,8 @@ }, "node_modules/express/node_modules/finalhandler": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "license": "MIT", "dependencies": { "debug": "2.6.9", @@ -5858,10 +7230,14 @@ }, "node_modules/express/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/express/node_modules/statuses": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -5869,11 +7245,15 @@ }, "node_modules/extend": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "devOptional": true, "license": "MIT" }, "node_modules/external-editor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "license": "MIT", "dependencies": { "chardet": "^0.7.0", @@ -5886,6 +7266,8 @@ }, "node_modules/extsprintf": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "devOptional": true, "engines": [ "node >=0.6.0" @@ -5894,10 +7276,14 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -5912,10 +7298,14 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "license": "MIT" }, "node_modules/fastq": { "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -5923,6 +7313,8 @@ }, "node_modules/faye-websocket": { "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" @@ -5933,6 +7325,8 @@ }, "node_modules/figures": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" @@ -5946,6 +7340,8 @@ }, "node_modules/fill-range": { "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -5956,6 +7352,8 @@ }, "node_modules/finalhandler": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5973,6 +7371,8 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5981,11 +7381,15 @@ }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "devOptional": true, "license": "MIT" }, "node_modules/finalhandler/node_modules/on-finished": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5997,6 +7401,8 @@ }, "node_modules/find-cache-dir": { "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "license": "MIT", "dependencies": { "commondir": "^1.0.1", @@ -6012,6 +7418,8 @@ }, "node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "license": "MIT", "dependencies": { "locate-path": "^5.0.0", @@ -6023,11 +7431,15 @@ }, "node_modules/flatted": { "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "devOptional": true, "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.11", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", @@ -6046,6 +7458,8 @@ }, "node_modules/for-each": { "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "license": "MIT", "dependencies": { @@ -6060,6 +7474,8 @@ }, "node_modules/forever-agent": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "devOptional": true, "license": "Apache-2.0", "engines": { @@ -6068,6 +7484,8 @@ }, "node_modules/form-data": { "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -6081,6 +7499,8 @@ }, "node_modules/forwarded": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -6088,6 +7508,8 @@ }, "node_modules/fraction.js": { "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "license": "MIT", "engines": { "node": "*" @@ -6099,6 +7521,8 @@ }, "node_modules/fresh": { "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -6106,6 +7530,8 @@ }, "node_modules/fs-extra": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "devOptional": true, "license": "MIT", "dependencies": { @@ -6119,6 +7545,8 @@ }, "node_modules/fs-minipass": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -6128,15 +7556,22 @@ } }, "node_modules/fs-monkey": { - "version": "1.1.0", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", "license": "Unlicense" }, "node_modules/fs.realpath": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ @@ -6148,6 +7583,8 @@ }, "node_modules/function-bind": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6155,6 +7592,8 @@ }, "node_modules/function.prototype.name": { "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, "license": "MIT", "dependencies": { @@ -6174,6 +7613,8 @@ }, "node_modules/functions-have-names": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "license": "MIT", "funding": { @@ -6182,6 +7623,9 @@ }, "node_modules/gauge": { "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", "dev": true, "license": "ISC", "dependencies": { @@ -6200,6 +7644,8 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -6207,6 +7653,8 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" @@ -6214,6 +7662,8 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -6236,6 +7686,8 @@ }, "node_modules/get-package-type": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "license": "MIT", "engines": { "node": ">=8.0.0" @@ -6243,6 +7695,8 @@ }, "node_modules/get-proto": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -6254,6 +7708,8 @@ }, "node_modules/get-stream": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "license": "MIT", "engines": { "node": ">=10" @@ -6264,6 +7720,8 @@ }, "node_modules/get-symbol-description": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "license": "MIT", "dependencies": { @@ -6280,6 +7738,8 @@ }, "node_modules/getpass": { "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "devOptional": true, "license": "MIT", "dependencies": { @@ -6288,6 +7748,9 @@ }, "node_modules/glob": { "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -6305,6 +7768,8 @@ }, "node_modules/glob-parent": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -6315,10 +7780,23 @@ }, "node_modules/glob-to-regexp": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "license": "BSD-2-Clause" }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/globalthis": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6334,6 +7812,8 @@ }, "node_modules/globby": { "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "license": "MIT", "dependencies": { "dir-glob": "^3.0.1", @@ -6351,6 +7831,8 @@ }, "node_modules/gopd": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -6361,14 +7843,20 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, "node_modules/handle-thing": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "license": "MIT" }, "node_modules/har-schema": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "devOptional": true, "license": "ISC", "engines": { @@ -6377,6 +7865,9 @@ }, "node_modules/har-validator": { "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", "devOptional": true, "license": "MIT", "dependencies": { @@ -6389,6 +7880,8 @@ }, "node_modules/har-validator/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "devOptional": true, "license": "MIT", "dependencies": { @@ -6404,11 +7897,15 @@ }, "node_modules/har-validator/node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "devOptional": true, "license": "MIT" }, "node_modules/has-ansi": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -6420,6 +7917,8 @@ }, "node_modules/has-ansi/node_modules/ansi-regex": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "devOptional": true, "license": "MIT", "engines": { @@ -6428,6 +7927,8 @@ }, "node_modules/has-bigints": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, "license": "MIT", "engines": { @@ -6439,6 +7940,8 @@ }, "node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -6446,6 +7949,8 @@ }, "node_modules/has-property-descriptors": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "license": "MIT", "dependencies": { @@ -6457,6 +7962,8 @@ }, "node_modules/has-proto": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6471,6 +7978,8 @@ }, "node_modules/has-symbols": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -6481,6 +7990,8 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -6495,11 +8006,15 @@ }, "node_modules/has-unicode": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true, "license": "ISC" }, "node_modules/hasown": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -6510,6 +8025,8 @@ }, "node_modules/hdr-histogram-js": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", "license": "BSD", "dependencies": { "@assemblyscript/loader": "^0.10.1", @@ -6519,10 +8036,14 @@ }, "node_modules/hdr-histogram-percentiles-obj": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", "license": "MIT" }, "node_modules/hosted-git-info": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, "license": "ISC", "dependencies": { @@ -6534,6 +8055,8 @@ }, "node_modules/hosted-git-info/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "license": "ISC", "engines": { @@ -6542,6 +8065,8 @@ }, "node_modules/hpack.js": { "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "license": "MIT", "dependencies": { "inherits": "^2.0.1", @@ -6552,10 +8077,14 @@ }, "node_modules/hpack.js/node_modules/isarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT" }, "node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", @@ -6569,10 +8098,14 @@ }, "node_modules/hpack.js/node_modules/safe-buffer": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" @@ -6580,6 +8113,8 @@ }, "node_modules/html-entities": { "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", "funding": [ { "type": "github", @@ -6594,20 +8129,28 @@ }, "node_modules/html-escaper": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, "node_modules/http-cache-semantics": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "dev": true, "license": "BSD-2-Clause" }, "node_modules/http-deceiver": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "license": "MIT" }, "node_modules/http-errors": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "license": "MIT", "dependencies": { "depd": "2.0.0", @@ -6622,6 +8165,8 @@ }, "node_modules/http-errors/node_modules/statuses": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -6629,10 +8174,14 @@ }, "node_modules/http-parser-js": { "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", "license": "MIT" }, "node_modules/http-proxy": { "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", @@ -6645,6 +8194,8 @@ }, "node_modules/http-proxy-agent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, "license": "MIT", "dependencies": { @@ -6658,6 +8209,8 @@ }, "node_modules/http-proxy-middleware": { "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", @@ -6680,6 +8233,8 @@ }, "node_modules/http-signature": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -6694,6 +8249,8 @@ }, "node_modules/https-proxy-agent": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "license": "MIT", "dependencies": { "agent-base": "6", @@ -6705,6 +8262,8 @@ }, "node_modules/human-signals": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "license": "Apache-2.0", "engines": { "node": ">=10.17.0" @@ -6712,6 +8271,8 @@ }, "node_modules/humanize-ms": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6720,6 +8281,8 @@ }, "node_modules/iconv-lite": { "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" @@ -6730,6 +8293,8 @@ }, "node_modules/icss-utils": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" @@ -6740,6 +8305,8 @@ }, "node_modules/ieee754": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -6758,6 +8325,8 @@ }, "node_modules/ignore": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "license": "MIT", "engines": { "node": ">= 4" @@ -6765,6 +8334,8 @@ }, "node_modules/ignore-walk": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", + "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", "dev": true, "license": "ISC", "dependencies": { @@ -6776,6 +8347,8 @@ }, "node_modules/image-size": { "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "license": "MIT", "optional": true, "bin": { @@ -6787,15 +8360,21 @@ }, "node_modules/immediate": { "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", "devOptional": true, "license": "MIT" }, "node_modules/immutable": { "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -6810,6 +8389,8 @@ }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "license": "MIT", "engines": { "node": ">=4" @@ -6817,6 +8398,8 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "license": "MIT", "engines": { "node": ">=0.8.19" @@ -6824,6 +8407,8 @@ }, "node_modules/indent-string": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "license": "MIT", "engines": { "node": ">=8" @@ -6831,10 +8416,15 @@ }, "node_modules/infer-owner": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", "license": "ISC" }, "node_modules/inflight": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -6843,10 +8433,14 @@ }, "node_modules/inherits": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/ini": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.0.tgz", + "integrity": "sha512-TxYQaeNW/N8ymDvwAxPyRbhMBtnEwuvaTYpOQkFx1nSeusgezHniEc/l35Vo4iCq/mMiTJbpD7oYxN98hFlfmw==", "dev": true, "license": "ISC", "engines": { @@ -6855,6 +8449,8 @@ }, "node_modules/injection-js": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.5.0.tgz", + "integrity": "sha512-UpY2ONt4xbht4GhSqQ2zMJ1rBIQq4uOY+DlR6aOeYyqK7xadXt7UQbJIyxmgk288bPMkIZKjViieHm0O0i72Jw==", "license": "MIT", "dependencies": { "tslib": "^2.0.0" @@ -6862,6 +8458,8 @@ }, "node_modules/inquirer": { "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", "license": "MIT", "dependencies": { "ansi-escapes": "^4.2.1", @@ -6886,6 +8484,8 @@ }, "node_modules/internal-slot": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, "license": "MIT", "dependencies": { @@ -6899,6 +8499,8 @@ }, "node_modules/ip-address": { "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", "dev": true, "license": "MIT", "dependencies": { @@ -6911,11 +8513,15 @@ }, "node_modules/ip-address/node_modules/sprintf-js": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/ipaddr.js": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "license": "MIT", "engines": { "node": ">= 10" @@ -6923,6 +8529,8 @@ }, "node_modules/is-array-buffer": { "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, "license": "MIT", "dependencies": { @@ -6939,10 +8547,14 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "license": "MIT" }, "node_modules/is-async-function": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6961,6 +8573,8 @@ }, "node_modules/is-bigint": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6975,6 +8589,8 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" @@ -6985,6 +8601,8 @@ }, "node_modules/is-boolean-object": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, "license": "MIT", "dependencies": { @@ -7000,6 +8618,8 @@ }, "node_modules/is-builtin-module": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "license": "MIT", "dependencies": { "builtin-modules": "^3.3.0" @@ -7013,6 +8633,8 @@ }, "node_modules/is-builtin-module/node_modules/builtin-modules": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "license": "MIT", "engines": { "node": ">=6" @@ -7023,6 +8645,8 @@ }, "node_modules/is-callable": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "license": "MIT", "engines": { @@ -7034,6 +8658,8 @@ }, "node_modules/is-core-module": { "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -7047,6 +8673,8 @@ }, "node_modules/is-data-view": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "license": "MIT", "dependencies": { @@ -7063,6 +8691,8 @@ }, "node_modules/is-date-object": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "license": "MIT", "dependencies": { @@ -7078,6 +8708,8 @@ }, "node_modules/is-docker": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "license": "MIT", "bin": { "is-docker": "cli.js" @@ -7091,6 +8723,8 @@ }, "node_modules/is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -7098,6 +8732,8 @@ }, "node_modules/is-finalizationregistry": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, "license": "MIT", "dependencies": { @@ -7112,6 +8748,8 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", "engines": { "node": ">=8" @@ -7119,6 +8757,8 @@ }, "node_modules/is-generator-function": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7136,6 +8776,8 @@ }, "node_modules/is-glob": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -7146,6 +8788,8 @@ }, "node_modules/is-interactive": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "license": "MIT", "engines": { "node": ">=8" @@ -7153,11 +8797,15 @@ }, "node_modules/is-lambda": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true, "license": "MIT" }, "node_modules/is-map": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, "license": "MIT", "engines": { @@ -7169,21 +8817,14 @@ }, "node_modules/is-module": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "license": "MIT" }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-number": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "license": "MIT", "engines": { "node": ">=0.12.0" @@ -7191,6 +8832,8 @@ }, "node_modules/is-number-object": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, "license": "MIT", "dependencies": { @@ -7206,6 +8849,8 @@ }, "node_modules/is-path-cwd": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw==", "devOptional": true, "license": "MIT", "engines": { @@ -7214,6 +8859,8 @@ }, "node_modules/is-path-in-cwd": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -7225,6 +8872,8 @@ }, "node_modules/is-path-inside": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", "devOptional": true, "license": "MIT", "dependencies": { @@ -7236,6 +8885,8 @@ }, "node_modules/is-plain-obj": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "license": "MIT", "engines": { "node": ">=10" @@ -7246,6 +8897,8 @@ }, "node_modules/is-plain-object": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "license": "MIT", "dependencies": { "isobject": "^3.0.1" @@ -7256,6 +8909,8 @@ }, "node_modules/is-reference": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", "license": "MIT", "dependencies": { "@types/estree": "*" @@ -7263,6 +8918,8 @@ }, "node_modules/is-regex": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "devOptional": true, "license": "MIT", "dependencies": { @@ -7280,6 +8937,8 @@ }, "node_modules/is-set": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, "license": "MIT", "engines": { @@ -7291,6 +8950,8 @@ }, "node_modules/is-shared-array-buffer": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, "license": "MIT", "dependencies": { @@ -7305,6 +8966,8 @@ }, "node_modules/is-stream": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "license": "MIT", "engines": { "node": ">=8" @@ -7315,6 +8978,8 @@ }, "node_modules/is-string": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "license": "MIT", "dependencies": { @@ -7330,6 +8995,8 @@ }, "node_modules/is-symbol": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "license": "MIT", "dependencies": { @@ -7346,6 +9013,8 @@ }, "node_modules/is-typed-array": { "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7360,11 +9029,15 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "devOptional": true, "license": "MIT" }, "node_modules/is-unicode-supported": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "license": "MIT", "engines": { "node": ">=10" @@ -7375,6 +9048,8 @@ }, "node_modules/is-weakmap": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "license": "MIT", "engines": { @@ -7386,6 +9061,8 @@ }, "node_modules/is-weakref": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, "license": "MIT", "dependencies": { @@ -7400,6 +9077,8 @@ }, "node_modules/is-weakset": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7415,10 +9094,14 @@ }, "node_modules/is-what": { "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", "license": "MIT" }, "node_modules/is-wsl": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "license": "MIT", "dependencies": { "is-docker": "^2.0.0" @@ -7429,11 +9112,15 @@ }, "node_modules/isarray": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, "license": "MIT" }, "node_modules/isbinaryfile": { "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", "devOptional": true, "license": "MIT", "engines": { @@ -7445,10 +9132,14 @@ }, "node_modules/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -7456,11 +9147,15 @@ }, "node_modules/isstream": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "devOptional": true, "license": "MIT" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "license": "BSD-3-Clause", "engines": { "node": ">=8" @@ -7468,6 +9163,8 @@ }, "node_modules/istanbul-lib-instrument": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", @@ -7482,6 +9179,8 @@ }, "node_modules/istanbul-lib-instrument/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -7489,6 +9188,8 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -7502,6 +9203,8 @@ }, "node_modules/istanbul-lib-report/node_modules/make-dir": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { @@ -7516,6 +9219,8 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -7529,6 +9234,8 @@ }, "node_modules/istanbul-lib-source-maps/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -7537,6 +9244,8 @@ }, "node_modules/istanbul-reports": { "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -7549,6 +9258,8 @@ }, "node_modules/jasmine": { "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha512-KbdGQTf5jbZgltoHs31XGiChAPumMSY64OZMWLNYnEnMfG5uwGBhffePwuskexjT+/Jea/gU3qAU8344hNohSw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -7562,11 +9273,15 @@ }, "node_modules/jasmine-core": { "version": "4.6.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.1.tgz", + "integrity": "sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==", "dev": true, "license": "MIT" }, "node_modules/jasmine-spec-reporter": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-7.0.0.tgz", + "integrity": "sha512-OtC7JRasiTcjsaCBPtMO0Tl8glCejM4J4/dNuOJdA8lBjz4PmWjYQ6pzb0uzpBNAWJMDudYuj9OdXJWqM2QTJg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -7574,7 +9289,9 @@ } }, "node_modules/jasmine/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -7584,6 +9301,9 @@ }, "node_modules/jasmine/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "devOptional": true, "license": "ISC", "dependencies": { @@ -7603,11 +9323,15 @@ }, "node_modules/jasmine/node_modules/jasmine-core": { "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha512-SNkOkS+/jMZvLhuSx1fjhcNWUC/KG6oVyFUGkSBEr9n1axSNduWU8GlI7suaHXr4yxjet6KjrUZxUTE5WzzWwQ==", "devOptional": true, "license": "MIT" }, "node_modules/jasmine/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "devOptional": true, "license": "ISC", "dependencies": { @@ -7619,6 +9343,8 @@ }, "node_modules/jasminewd2": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha512-Rn0nZe4rfDhzA63Al3ZGh0E+JTmM6ESZYXJGKuqKGZObsAB9fwXPD03GjtIEvJBDOhN94T5MzbwZSqzFHSQPzg==", "devOptional": true, "license": "MIT", "engines": { @@ -7627,6 +9353,8 @@ }, "node_modules/jest-worker": { "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -7639,6 +9367,8 @@ }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -7652,10 +9382,14 @@ }, "node_modules/js-tokens": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "license": "MIT" }, "node_modules/js-yaml": { "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "license": "MIT", "dependencies": { "argparse": "^1.0.7", @@ -7667,11 +9401,15 @@ }, "node_modules/jsbn": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", "dev": true, "license": "MIT" }, "node_modules/jsesc": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -7682,29 +9420,41 @@ }, "node_modules/json-parse-better-errors": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true, "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "license": "MIT" }, "node_modules/json-schema": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "devOptional": true, "license": "(AFL-2.1 OR BSD-3-Clause)" }, "node_modules/json-schema-traverse": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, "node_modules/json-stringify-safe": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "devOptional": true, "license": "ISC" }, "node_modules/json5": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "license": "MIT", "bin": { "json5": "lib/cli.js" @@ -7715,10 +9465,14 @@ }, "node_modules/jsonc-parser": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", + "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", "license": "MIT" }, "node_modules/jsonfile": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "devOptional": true, "license": "MIT", "optionalDependencies": { @@ -7727,6 +9481,8 @@ }, "node_modules/jsonparse": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true, "engines": [ "node >= 0.2.0" @@ -7735,6 +9491,8 @@ }, "node_modules/jsprim": { "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -7749,6 +9507,8 @@ }, "node_modules/jszip": { "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", "devOptional": true, "license": "(MIT OR GPL-3.0-or-later)", "dependencies": { @@ -7760,11 +9520,15 @@ }, "node_modules/jszip/node_modules/isarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "devOptional": true, "license": "MIT" }, "node_modules/jszip/node_modules/readable-stream": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -7779,11 +9543,15 @@ }, "node_modules/jszip/node_modules/safe-buffer": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "devOptional": true, "license": "MIT" }, "node_modules/jszip/node_modules/string_decoder": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -7792,6 +9560,8 @@ }, "node_modules/karma": { "version": "6.4.4", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", + "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", "devOptional": true, "license": "MIT", "dependencies": { @@ -7829,6 +9599,8 @@ }, "node_modules/karma-chrome-launcher": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz", + "integrity": "sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7837,6 +9609,8 @@ }, "node_modules/karma-coverage": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", + "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", "dev": true, "license": "MIT", "dependencies": { @@ -7853,6 +9627,8 @@ }, "node_modules/karma-coverage-istanbul-reporter": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz", + "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==", "dev": true, "license": "MIT", "dependencies": { @@ -7867,7 +9643,9 @@ } }, "node_modules/karma-coverage-istanbul-reporter/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", "dependencies": { @@ -7877,6 +9655,9 @@ }, "node_modules/karma-coverage-istanbul-reporter/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -7896,6 +9677,8 @@ }, "node_modules/karma-coverage-istanbul-reporter/node_modules/istanbul-lib-source-maps": { "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -7911,6 +9694,8 @@ }, "node_modules/karma-coverage-istanbul-reporter/node_modules/istanbul-lib-source-maps/node_modules/istanbul-lib-coverage": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -7919,6 +9704,8 @@ }, "node_modules/karma-coverage-istanbul-reporter/node_modules/make-dir": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "license": "MIT", "dependencies": { @@ -7931,6 +9718,8 @@ }, "node_modules/karma-coverage-istanbul-reporter/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -7942,6 +9731,8 @@ }, "node_modules/karma-coverage-istanbul-reporter/node_modules/pify": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, "license": "MIT", "engines": { @@ -7950,6 +9741,9 @@ }, "node_modules/karma-coverage-istanbul-reporter/node_modules/rimraf": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -7961,6 +9755,8 @@ }, "node_modules/karma-coverage-istanbul-reporter/node_modules/semver": { "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "license": "ISC", "bin": { @@ -7969,6 +9765,8 @@ }, "node_modules/karma-coverage-istanbul-reporter/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -7976,7 +9774,9 @@ } }, "node_modules/karma-coverage/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", "dependencies": { @@ -7986,6 +9786,8 @@ }, "node_modules/karma-coverage/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -7997,6 +9799,8 @@ }, "node_modules/karma-jasmine": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", + "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8011,6 +9815,8 @@ }, "node_modules/karma-jasmine-html-reporter": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", + "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -8021,13 +9827,17 @@ }, "node_modules/karma-source-map-support": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", "license": "MIT", "dependencies": { "source-map-support": "^0.5.5" } }, "node_modules/karma/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -8037,6 +9847,9 @@ }, "node_modules/karma/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "devOptional": true, "license": "ISC", "dependencies": { @@ -8056,6 +9869,8 @@ }, "node_modules/karma/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "devOptional": true, "license": "ISC", "dependencies": { @@ -8067,6 +9882,8 @@ }, "node_modules/karma/node_modules/mkdirp": { "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -8078,6 +9895,8 @@ }, "node_modules/karma/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "devOptional": true, "license": "BSD-3-Clause", "engines": { @@ -8086,6 +9905,8 @@ }, "node_modules/karma/node_modules/tmp": { "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "devOptional": true, "license": "MIT", "engines": { @@ -8094,6 +9915,8 @@ }, "node_modules/karma/node_modules/yargs": { "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -8111,6 +9934,8 @@ }, "node_modules/karma/node_modules/yargs-parser": { "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "devOptional": true, "license": "ISC", "engines": { @@ -8119,6 +9944,8 @@ }, "node_modules/kind-of": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -8126,6 +9953,8 @@ }, "node_modules/klona": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "license": "MIT", "engines": { "node": ">= 8" @@ -8133,6 +9962,8 @@ }, "node_modules/less": { "version": "4.1.3", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", "license": "Apache-2.0", "dependencies": { "copy-anything": "^2.0.1", @@ -8157,6 +9988,8 @@ }, "node_modules/less-loader": { "version": "11.0.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.0.0.tgz", + "integrity": "sha512-9+LOWWjuoectIEx3zrfN83NAGxSUB5pWEabbbidVQVgZhN+wN68pOvuyirVlH1IK4VT1f3TmlyvAnCXh8O5KEw==", "license": "MIT", "dependencies": { "klona": "^2.0.4" @@ -8175,6 +10008,8 @@ }, "node_modules/less/node_modules/make-dir": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "license": "MIT", "optional": true, "dependencies": { @@ -8187,6 +10022,8 @@ }, "node_modules/less/node_modules/mime": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "license": "MIT", "optional": true, "bin": { @@ -8198,6 +10035,8 @@ }, "node_modules/less/node_modules/pify": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "license": "MIT", "optional": true, "engines": { @@ -8206,6 +10045,8 @@ }, "node_modules/less/node_modules/semver": { "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "license": "ISC", "optional": true, "bin": { @@ -8214,6 +10055,8 @@ }, "node_modules/less/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", "optional": true, "engines": { @@ -8222,6 +10065,8 @@ }, "node_modules/license-webpack-plugin": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", "license": "ISC", "dependencies": { "webpack-sources": "^3.0.0" @@ -8237,6 +10082,8 @@ }, "node_modules/lie": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -8245,10 +10092,14 @@ }, "node_modules/lines-and-columns": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "license": "MIT" }, "node_modules/load-json-file": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", "dev": true, "license": "MIT", "dependencies": { @@ -8263,6 +10114,8 @@ }, "node_modules/load-json-file/node_modules/parse-json": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "license": "MIT", "dependencies": { @@ -8275,6 +10128,8 @@ }, "node_modules/load-json-file/node_modules/pify": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, "license": "MIT", "engines": { @@ -8283,6 +10138,8 @@ }, "node_modules/loader-runner": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "license": "MIT", "engines": { "node": ">=6.11.5" @@ -8290,6 +10147,8 @@ }, "node_modules/loader-utils": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", "license": "MIT", "engines": { "node": ">= 12.13.0" @@ -8297,6 +10156,8 @@ }, "node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "license": "MIT", "dependencies": { "p-locate": "^4.1.0" @@ -8307,14 +10168,20 @@ }, "node_modules/lodash": { "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "license": "MIT", "dependencies": { "chalk": "^4.1.0", @@ -8329,6 +10196,8 @@ }, "node_modules/log4js": { "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -8344,6 +10213,8 @@ }, "node_modules/lru-cache": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "license": "ISC", "dependencies": { "yallist": "^3.0.2" @@ -8351,6 +10222,8 @@ }, "node_modules/magic-string": { "version": "0.26.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", + "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", "license": "MIT", "dependencies": { "sourcemap-codec": "^1.4.8" @@ -8361,6 +10234,8 @@ }, "node_modules/make-dir": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "license": "MIT", "dependencies": { "semver": "^6.0.0" @@ -8374,6 +10249,8 @@ }, "node_modules/make-dir/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -8381,11 +10258,15 @@ }, "node_modules/make-error": { "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true, "license": "ISC" }, "node_modules/make-fetch-happen": { "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", "dev": true, "license": "ISC", "dependencies": { @@ -8412,6 +10293,8 @@ }, "node_modules/make-fetch-happen/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "license": "ISC", "engines": { @@ -8420,6 +10303,8 @@ }, "node_modules/math-intrinsics": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -8427,6 +10312,8 @@ }, "node_modules/media-typer": { "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -8434,6 +10321,8 @@ }, "node_modules/memfs": { "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "license": "Unlicense", "dependencies": { "fs-monkey": "^1.0.4" @@ -8444,6 +10333,8 @@ }, "node_modules/memorystream": { "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", "dev": true, "engines": { "node": ">= 0.10.0" @@ -8451,6 +10342,8 @@ }, "node_modules/merge-descriptors": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8458,10 +10351,14 @@ }, "node_modules/merge-stream": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "license": "MIT", "engines": { "node": ">= 8" @@ -8469,6 +10366,8 @@ }, "node_modules/methods": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -8476,6 +10375,8 @@ }, "node_modules/micromatch": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -8487,6 +10388,8 @@ }, "node_modules/micromatch/node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -8497,6 +10400,8 @@ }, "node_modules/mime": { "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "devOptional": true, "license": "MIT", "bin": { @@ -8508,6 +10413,8 @@ }, "node_modules/mime-db": { "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -8515,6 +10422,8 @@ }, "node_modules/mime-types": { "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -8525,6 +10434,8 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "license": "MIT", "engines": { "node": ">=6" @@ -8532,6 +10443,8 @@ }, "node_modules/mini-css-extract-plugin": { "version": "2.6.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", + "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", "license": "MIT", "dependencies": { "schema-utils": "^4.0.0" @@ -8549,6 +10462,8 @@ }, "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -8566,10 +10481,14 @@ }, "node_modules/minimalistic-assert": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "license": "ISC" }, "node_modules/minimatch": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -8580,6 +10499,8 @@ }, "node_modules/minimist": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "devOptional": true, "license": "MIT", "funding": { @@ -8588,6 +10509,8 @@ }, "node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -8598,6 +10521,8 @@ }, "node_modules/minipass-collect": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -8608,6 +10533,8 @@ }, "node_modules/minipass-fetch": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "dev": true, "license": "MIT", "dependencies": { @@ -8624,6 +10551,8 @@ }, "node_modules/minipass-flush": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -8634,6 +10563,8 @@ }, "node_modules/minipass-json-stream": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.2.tgz", + "integrity": "sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg==", "dev": true, "license": "MIT", "dependencies": { @@ -8643,6 +10574,8 @@ }, "node_modules/minipass-pipeline": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -8653,6 +10586,8 @@ }, "node_modules/minipass-sized": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, "license": "ISC", "dependencies": { @@ -8664,10 +10599,14 @@ }, "node_modules/minipass/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/minizlib": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "license": "MIT", "dependencies": { "minipass": "^3.0.0", @@ -8679,10 +10618,14 @@ }, "node_modules/minizlib/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/mkdirp": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" @@ -8693,10 +10636,14 @@ }, "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==", "license": "MIT" }, "node_modules/multicast-dns": { "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "license": "MIT", "dependencies": { "dns-packet": "^5.2.2", @@ -8708,10 +10655,14 @@ }, "node_modules/mute-stream": { "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "license": "ISC" }, "node_modules/nanoid": { "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", @@ -8728,6 +10679,8 @@ }, "node_modules/needle": { "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", "license": "MIT", "optional": true, "dependencies": { @@ -8743,6 +10696,8 @@ }, "node_modules/needle/node_modules/iconv-lite": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "optional": true, "dependencies": { @@ -8754,6 +10709,8 @@ }, "node_modules/negotiator": { "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -8761,10 +10718,14 @@ }, "node_modules/neo-async": { "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "license": "MIT" }, "node_modules/ng-packagr": { "version": "14.2.0", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-14.2.0.tgz", + "integrity": "sha512-Nb+2/L37CFcWmCz91USwNd87mdTfTXDb4MBl87Dkj2H53KfrAltX2psa+gTRbjE5USCX8bQeu4nRzf/Bp6Vivg==", "license": "MIT", "dependencies": { "@rollup/plugin-json": "^4.1.0", @@ -8809,6 +10770,8 @@ }, "node_modules/ng-packagr/node_modules/@rollup/plugin-node-resolve": { "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", + "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", "license": "MIT", "dependencies": { "@rollup/pluginutils": "^3.1.0", @@ -8827,6 +10790,8 @@ }, "node_modules/ng-packagr/node_modules/@rollup/pluginutils": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "license": "MIT", "dependencies": { "@types/estree": "0.0.39", @@ -8842,17 +10807,23 @@ }, "node_modules/ng-packagr/node_modules/@types/estree": { "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "license": "MIT" }, "node_modules/ng-packagr/node_modules/@types/resolve": { "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/ng-packagr/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -8861,10 +10832,14 @@ }, "node_modules/ng-packagr/node_modules/estree-walker": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "license": "MIT" }, "node_modules/ng-packagr/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -8875,6 +10850,8 @@ }, "node_modules/ng-packagr/node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -8885,10 +10862,14 @@ }, "node_modules/ng-packagr/node_modules/sax": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "license": "ISC" }, "node_modules/ng-packagr/node_modules/stylus": { "version": "0.59.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.59.0.tgz", + "integrity": "sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg==", "license": "MIT", "dependencies": { "@adobe/css-tools": "^4.0.1", @@ -8909,6 +10890,9 @@ }, "node_modules/ng-packagr/node_modules/stylus/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -8925,13 +10909,39 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "!win32" + ], + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, "node_modules/nice-try": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true, "license": "MIT" }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "license": "MIT", + "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==", "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" @@ -8939,6 +10949,8 @@ }, "node_modules/node-gyp": { "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8961,8 +10973,22 @@ "node": "^12.13 || ^14.13 || >=16" } }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", "dependencies": { @@ -8972,6 +10998,9 @@ }, "node_modules/node-gyp/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -8991,6 +11020,8 @@ }, "node_modules/node-gyp/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -9002,6 +11033,8 @@ }, "node_modules/node-gyp/node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { @@ -9016,10 +11049,14 @@ }, "node_modules/node-releases": { "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "license": "MIT" }, "node_modules/nopt": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "dev": true, "license": "ISC", "dependencies": { @@ -9034,6 +11071,8 @@ }, "node_modules/normalize-package-data": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", + "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -9048,6 +11087,8 @@ }, "node_modules/normalize-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -9055,6 +11096,8 @@ }, "node_modules/normalize-range": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -9062,6 +11105,8 @@ }, "node_modules/npm-bundled": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", "dev": true, "license": "ISC", "dependencies": { @@ -9070,6 +11115,8 @@ }, "node_modules/npm-install-checks": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz", + "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -9081,11 +11128,15 @@ }, "node_modules/npm-normalize-package-bin": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "dev": true, "license": "ISC" }, "node_modules/npm-package-arg": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", + "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", "dev": true, "license": "ISC", "dependencies": { @@ -9100,6 +11151,8 @@ }, "node_modules/npm-packlist": { "version": "5.1.3", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", + "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", "dev": true, "license": "ISC", "dependencies": { @@ -9117,6 +11170,8 @@ }, "node_modules/npm-packlist/node_modules/npm-bundled": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", + "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", "dev": true, "license": "ISC", "dependencies": { @@ -9128,6 +11183,8 @@ }, "node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "dev": true, "license": "ISC", "engines": { @@ -9136,6 +11193,8 @@ }, "node_modules/npm-pick-manifest": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz", + "integrity": "sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg==", "dev": true, "license": "ISC", "dependencies": { @@ -9150,6 +11209,8 @@ }, "node_modules/npm-registry-fetch": { "version": "13.3.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz", + "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", "dev": true, "license": "ISC", "dependencies": { @@ -9167,6 +11228,8 @@ }, "node_modules/npm-run-all": { "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9191,6 +11254,8 @@ }, "node_modules/npm-run-all/node_modules/ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", "dependencies": { @@ -9201,7 +11266,9 @@ } }, "node_modules/npm-run-all/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", "dependencies": { @@ -9211,6 +11278,8 @@ }, "node_modules/npm-run-all/node_modules/chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9224,6 +11293,8 @@ }, "node_modules/npm-run-all/node_modules/color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", "dependencies": { @@ -9232,11 +11303,15 @@ }, "node_modules/npm-run-all/node_modules/color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, "license": "MIT" }, "node_modules/npm-run-all/node_modules/has-flag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", "engines": { @@ -9245,6 +11320,8 @@ }, "node_modules/npm-run-all/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -9256,6 +11333,8 @@ }, "node_modules/npm-run-all/node_modules/supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", "dependencies": { @@ -9267,6 +11346,8 @@ }, "node_modules/npm-run-path": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "license": "MIT", "dependencies": { "path-key": "^3.0.0" @@ -9277,6 +11358,8 @@ }, "node_modules/npm-run-path/node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", "engines": { "node": ">=8" @@ -9284,6 +11367,9 @@ }, "node_modules/npmlog": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", "dev": true, "license": "ISC", "dependencies": { @@ -9298,6 +11384,8 @@ }, "node_modules/nth-check": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" @@ -9308,6 +11396,8 @@ }, "node_modules/oauth-sign": { "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "devOptional": true, "license": "Apache-2.0", "engines": { @@ -9316,6 +11406,8 @@ }, "node_modules/object-assign": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "devOptional": true, "license": "MIT", "engines": { @@ -9324,6 +11416,8 @@ }, "node_modules/object-inspect": { "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -9334,6 +11428,8 @@ }, "node_modules/object-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, "license": "MIT", "engines": { @@ -9342,6 +11438,8 @@ }, "node_modules/object.assign": { "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, "license": "MIT", "dependencies": { @@ -9361,10 +11459,14 @@ }, "node_modules/obuf": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "license": "MIT" }, "node_modules/on-finished": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", "dependencies": { "ee-first": "1.1.1" @@ -9374,7 +11476,9 @@ } }, "node_modules/on-headers": { - "version": "1.1.0", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -9382,6 +11486,8 @@ }, "node_modules/once": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", "dependencies": { "wrappy": "1" @@ -9389,6 +11495,8 @@ }, "node_modules/onetime": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" @@ -9402,6 +11510,8 @@ }, "node_modules/open": { "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", @@ -9417,6 +11527,8 @@ }, "node_modules/ora": { "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "license": "MIT", "dependencies": { "bl": "^4.1.0", @@ -9438,6 +11550,8 @@ }, "node_modules/os-tmpdir": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -9445,6 +11559,8 @@ }, "node_modules/own-keys": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", "dev": true, "license": "MIT", "dependencies": { @@ -9461,6 +11577,8 @@ }, "node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "license": "MIT", "dependencies": { "p-try": "^2.0.0" @@ -9474,6 +11592,8 @@ }, "node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "license": "MIT", "dependencies": { "p-limit": "^2.2.0" @@ -9484,6 +11604,8 @@ }, "node_modules/p-map": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" @@ -9497,6 +11619,8 @@ }, "node_modules/p-retry": { "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "license": "MIT", "dependencies": { "@types/retry": "0.12.0", @@ -9508,6 +11632,8 @@ }, "node_modules/p-retry/node_modules/retry": { "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "license": "MIT", "engines": { "node": ">= 4" @@ -9515,6 +11641,8 @@ }, "node_modules/p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "license": "MIT", "engines": { "node": ">=6" @@ -9522,6 +11650,8 @@ }, "node_modules/pacote": { "version": "13.6.2", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.6.2.tgz", + "integrity": "sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg==", "dev": true, "license": "ISC", "dependencies": { @@ -9556,10 +11686,14 @@ }, "node_modules/pako": { "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "license": "(MIT AND Zlib)" }, "node_modules/parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -9570,6 +11704,8 @@ }, "node_modules/parse-json": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", @@ -9586,6 +11722,8 @@ }, "node_modules/parse-node-version": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -9593,11 +11731,15 @@ }, "node_modules/parse5": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", "license": "MIT", "optional": true }, "node_modules/parse5-html-rewriting-stream": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", + "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", "license": "MIT", "dependencies": { "parse5": "^6.0.1", @@ -9606,10 +11748,14 @@ }, "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "license": "MIT" }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", "license": "MIT", "dependencies": { "parse5": "^6.0.1" @@ -9617,10 +11763,14 @@ }, "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "license": "MIT" }, "node_modules/parse5-sax-parser": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", + "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", "license": "MIT", "dependencies": { "parse5": "^6.0.1" @@ -9628,10 +11778,14 @@ }, "node_modules/parse5-sax-parser/node_modules/parse5": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "license": "MIT" }, "node_modules/parseurl": { "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -9639,6 +11793,8 @@ }, "node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "license": "MIT", "engines": { "node": ">=8" @@ -9646,6 +11802,8 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -9653,11 +11811,15 @@ }, "node_modules/path-is-inside": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", "devOptional": true, "license": "(WTFPL OR MIT)" }, "node_modules/path-key": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, "license": "MIT", "engines": { @@ -9666,14 +11828,20 @@ }, "node_modules/path-parse": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "license": "MIT" }, "node_modules/path-to-regexp": { "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "license": "MIT", "engines": { "node": ">=8" @@ -9681,15 +11849,21 @@ }, "node_modules/performance-now": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "devOptional": true, "license": "MIT" }, "node_modules/picocolors": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.3", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "license": "MIT", "engines": { "node": ">=12" @@ -9700,6 +11874,8 @@ }, "node_modules/pidtree": { "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", "dev": true, "license": "MIT", "bin": { @@ -9711,6 +11887,8 @@ }, "node_modules/pify": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -9718,6 +11896,8 @@ }, "node_modules/pinkie": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "devOptional": true, "license": "MIT", "engines": { @@ -9726,6 +11906,8 @@ }, "node_modules/pinkie-promise": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -9737,6 +11919,8 @@ }, "node_modules/piscina": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", + "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", "license": "MIT", "dependencies": { "eventemitter-asyncresource": "^1.0.0", @@ -9749,6 +11933,8 @@ }, "node_modules/pkg-dir": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "license": "MIT", "dependencies": { "find-up": "^4.0.0" @@ -9759,6 +11945,8 @@ }, "node_modules/possible-typed-array-names": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "dev": true, "license": "MIT", "engines": { @@ -9767,6 +11955,8 @@ }, "node_modules/postcss": { "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -9793,6 +11983,8 @@ }, "node_modules/postcss-attribute-case-insensitive": { "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.10" @@ -9810,6 +12002,8 @@ }, "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -9821,6 +12015,8 @@ }, "node_modules/postcss-clamp": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -9834,6 +12030,8 @@ }, "node_modules/postcss-color-functional-notation": { "version": "4.2.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -9851,6 +12049,8 @@ }, "node_modules/postcss-color-hex-alpha": { "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -9868,6 +12068,8 @@ }, "node_modules/postcss-color-rebeccapurple": { "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -9885,6 +12087,8 @@ }, "node_modules/postcss-custom-media": { "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -9902,6 +12106,8 @@ }, "node_modules/postcss-custom-properties": { "version": "12.1.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -9919,6 +12125,8 @@ }, "node_modules/postcss-custom-selectors": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.4" @@ -9936,6 +12144,8 @@ }, "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -9947,6 +12157,8 @@ }, "node_modules/postcss-dir-pseudo-class": { "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.10" @@ -9964,6 +12176,8 @@ }, "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -9975,6 +12189,8 @@ }, "node_modules/postcss-double-position-gradients": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", @@ -9993,6 +12209,8 @@ }, "node_modules/postcss-env-function": { "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -10006,6 +12224,8 @@ }, "node_modules/postcss-focus-visible": { "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" @@ -10019,6 +12239,8 @@ }, "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -10030,6 +12252,8 @@ }, "node_modules/postcss-focus-within": { "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" @@ -10043,6 +12267,8 @@ }, "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -10054,6 +12280,8 @@ }, "node_modules/postcss-font-variant": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", "license": "MIT", "peerDependencies": { "postcss": "^8.1.0" @@ -10061,6 +12289,8 @@ }, "node_modules/postcss-gap-properties": { "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", "license": "CC0-1.0", "engines": { "node": "^12 || ^14 || >=16" @@ -10075,6 +12305,8 @@ }, "node_modules/postcss-image-set-function": { "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -10092,6 +12324,8 @@ }, "node_modules/postcss-import": { "version": "15.0.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.0.0.tgz", + "integrity": "sha512-Y20shPQ07RitgBGv2zvkEAu9bqvrD77C9axhj/aA1BQj4czape2MdClCExvB27EwYEJdGgKZBpKanb0t1rK2Kg==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.0.0", @@ -10107,6 +12341,8 @@ }, "node_modules/postcss-initial": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", "license": "MIT", "peerDependencies": { "postcss": "^8.0.0" @@ -10114,6 +12350,8 @@ }, "node_modules/postcss-lab-function": { "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", @@ -10132,6 +12370,8 @@ }, "node_modules/postcss-loader": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz", + "integrity": "sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==", "license": "MIT", "dependencies": { "cosmiconfig": "^7.0.0", @@ -10152,6 +12392,8 @@ }, "node_modules/postcss-logical": { "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", "license": "CC0-1.0", "engines": { "node": "^12 || ^14 || >=16" @@ -10162,6 +12404,8 @@ }, "node_modules/postcss-media-minmax": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -10172,6 +12416,8 @@ }, "node_modules/postcss-modules-extract-imports": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" @@ -10182,6 +12428,8 @@ }, "node_modules/postcss-modules-local-by-default": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", @@ -10197,6 +12445,8 @@ }, "node_modules/postcss-modules-scope": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", "license": "ISC", "dependencies": { "postcss-selector-parser": "^7.0.0" @@ -10210,6 +12460,8 @@ }, "node_modules/postcss-modules-values": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "license": "ISC", "dependencies": { "icss-utils": "^5.0.0" @@ -10223,6 +12475,8 @@ }, "node_modules/postcss-nesting": { "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.0", @@ -10241,6 +12495,8 @@ }, "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", "license": "CC0-1.0", "engines": { "node": "^14 || ^16 || >=18" @@ -10255,6 +12511,8 @@ }, "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -10266,6 +12524,8 @@ }, "node_modules/postcss-opacity-percentage": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", "funding": [ { "type": "kofi", @@ -10286,6 +12546,8 @@ }, "node_modules/postcss-overflow-shorthand": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -10303,6 +12565,8 @@ }, "node_modules/postcss-page-break": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", "license": "MIT", "peerDependencies": { "postcss": "^8" @@ -10310,6 +12574,8 @@ }, "node_modules/postcss-place": { "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -10327,6 +12593,8 @@ }, "node_modules/postcss-preset-env": { "version": "7.8.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.0.tgz", + "integrity": "sha512-leqiqLOellpLKfbHkD06E04P6d9ZQ24mat6hu4NSqun7WG0UhspHR5Myiv/510qouCjoo4+YJtNOqg5xHaFnCA==", "license": "CC0-1.0", "dependencies": { "@csstools/postcss-cascade-layers": "^1.0.5", @@ -10392,6 +12660,8 @@ }, "node_modules/postcss-pseudo-class-any-link": { "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.10" @@ -10409,6 +12679,8 @@ }, "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -10420,6 +12692,8 @@ }, "node_modules/postcss-replace-overflow-wrap": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", "license": "MIT", "peerDependencies": { "postcss": "^8.0.3" @@ -10427,6 +12701,8 @@ }, "node_modules/postcss-selector-not": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", + "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.10" @@ -10444,6 +12720,8 @@ }, "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -10455,6 +12733,8 @@ }, "node_modules/postcss-selector-parser": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -10466,6 +12746,8 @@ }, "node_modules/postcss-url": { "version": "10.1.3", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-10.1.3.tgz", + "integrity": "sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==", "license": "MIT", "dependencies": { "make-dir": "~3.1.0", @@ -10481,7 +12763,9 @@ } }, "node_modules/postcss-url/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -10490,6 +12774,8 @@ }, "node_modules/postcss-url/node_modules/mime": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", "license": "MIT", "bin": { "mime": "cli.js" @@ -10500,6 +12786,8 @@ }, "node_modules/postcss-url/node_modules/minimatch": { "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -10510,10 +12798,14 @@ }, "node_modules/postcss-value-parser": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "license": "MIT" }, "node_modules/pretty-bytes": { "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "license": "MIT", "engines": { "node": ">=6" @@ -10524,6 +12816,8 @@ }, "node_modules/proc-log": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", "dev": true, "license": "ISC", "engines": { @@ -10532,14 +12826,20 @@ }, "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==", "license": "MIT" }, "node_modules/promise-inflight": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "license": "ISC" }, "node_modules/promise-retry": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, "license": "MIT", "dependencies": { @@ -10552,6 +12852,9 @@ }, "node_modules/protractor": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", + "integrity": "sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw==", + "deprecated": "We have news to share - Protractor is deprecated and will reach end-of-life by Summer 2023. To learn more and find out about other options please refer to this post on the Angular blog. Thank you for using and contributing to Protractor. https://goo.gle/state-of-e2e-in-angular", "devOptional": true, "license": "MIT", "dependencies": { @@ -10581,6 +12884,8 @@ }, "node_modules/protractor/node_modules/ansi-regex": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "devOptional": true, "license": "MIT", "engines": { @@ -10589,6 +12894,8 @@ }, "node_modules/protractor/node_modules/ansi-styles": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "devOptional": true, "license": "MIT", "engines": { @@ -10596,7 +12903,9 @@ } }, "node_modules/protractor/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -10606,6 +12915,8 @@ }, "node_modules/protractor/node_modules/chalk": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "devOptional": true, "license": "MIT", "dependencies": { @@ -10621,6 +12932,8 @@ }, "node_modules/protractor/node_modules/cliui": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "devOptional": true, "license": "ISC", "dependencies": { @@ -10631,6 +12944,8 @@ }, "node_modules/protractor/node_modules/cliui/node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "devOptional": true, "license": "MIT", "engines": { @@ -10639,6 +12954,8 @@ }, "node_modules/protractor/node_modules/cliui/node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "devOptional": true, "license": "MIT", "dependencies": { @@ -10650,6 +12967,9 @@ }, "node_modules/protractor/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "devOptional": true, "license": "ISC", "dependencies": { @@ -10669,6 +12989,8 @@ }, "node_modules/protractor/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "devOptional": true, "license": "ISC", "dependencies": { @@ -10680,6 +13002,8 @@ }, "node_modules/protractor/node_modules/source-map": { "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "devOptional": true, "license": "BSD-3-Clause", "engines": { @@ -10688,6 +13012,8 @@ }, "node_modules/protractor/node_modules/source-map-support": { "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -10696,6 +13022,8 @@ }, "node_modules/protractor/node_modules/strip-ansi": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -10707,6 +13035,8 @@ }, "node_modules/protractor/node_modules/supports-color": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "devOptional": true, "license": "MIT", "engines": { @@ -10715,6 +13045,8 @@ }, "node_modules/protractor/node_modules/wrap-ansi": { "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -10728,6 +13060,8 @@ }, "node_modules/protractor/node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "devOptional": true, "license": "MIT", "engines": { @@ -10736,6 +13070,8 @@ }, "node_modules/protractor/node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -10750,6 +13086,8 @@ }, "node_modules/protractor/node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "devOptional": true, "license": "MIT", "dependencies": { @@ -10761,11 +13099,15 @@ }, "node_modules/protractor/node_modules/y18n": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "devOptional": true, "license": "ISC" }, "node_modules/protractor/node_modules/yargs": { "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "devOptional": true, "license": "MIT", "dependencies": { @@ -10787,6 +13129,8 @@ }, "node_modules/protractor/node_modules/yargs-parser": { "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "devOptional": true, "license": "ISC", "dependencies": { @@ -10799,6 +13143,8 @@ }, "node_modules/proxy-addr": { "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", "dependencies": { "forwarded": "0.2.0", @@ -10810,6 +13156,8 @@ }, "node_modules/proxy-addr/node_modules/ipaddr.js": { "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -10817,11 +13165,15 @@ }, "node_modules/prr": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "license": "MIT", "optional": true }, "node_modules/psl": { "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", "devOptional": true, "license": "MIT", "dependencies": { @@ -10833,6 +13185,8 @@ }, "node_modules/psl/node_modules/punycode": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "devOptional": true, "license": "MIT", "engines": { @@ -10841,11 +13195,16 @@ }, "node_modules/punycode": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "devOptional": true, "license": "MIT" }, "node_modules/q": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha512-/CdEdaw49VZVmyIDGUQKDDT53c7qBkO6g5CefWz91Ae+l4+cRtcDYwMTXh6me4O8TMldeGHG3N2Bl84V78Ywbg==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", "devOptional": true, "license": "MIT", "engines": { @@ -10855,6 +13214,8 @@ }, "node_modules/qjobs": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", "devOptional": true, "license": "MIT", "engines": { @@ -10863,6 +13224,8 @@ }, "node_modules/qs": { "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.6" @@ -10876,6 +13239,8 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { "type": "github", @@ -10894,6 +13259,8 @@ }, "node_modules/randombytes": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" @@ -10901,6 +13268,8 @@ }, "node_modules/range-parser": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -10908,6 +13277,8 @@ }, "node_modules/raw-body": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "license": "MIT", "dependencies": { "bytes": "3.1.2", @@ -10921,6 +13292,8 @@ }, "node_modules/read-cache": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "license": "MIT", "dependencies": { "pify": "^2.3.0" @@ -10928,6 +13301,9 @@ }, "node_modules/read-package-json": { "version": "5.0.2", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.2.tgz", + "integrity": "sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q==", + "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.", "dev": true, "license": "ISC", "dependencies": { @@ -10942,6 +13318,8 @@ }, "node_modules/read-package-json-fast": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", + "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", "dev": true, "license": "ISC", "dependencies": { @@ -10954,6 +13332,8 @@ }, "node_modules/read-package-json/node_modules/npm-normalize-package-bin": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "dev": true, "license": "ISC", "engines": { @@ -10962,6 +13342,8 @@ }, "node_modules/read-pkg": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "dev": true, "license": "MIT", "dependencies": { @@ -10975,11 +13357,15 @@ }, "node_modules/read-pkg/node_modules/hosted-git-info": { "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true, "license": "ISC" }, "node_modules/read-pkg/node_modules/normalize-package-data": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -10991,6 +13377,8 @@ }, "node_modules/read-pkg/node_modules/path-type": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "license": "MIT", "dependencies": { @@ -11002,6 +13390,8 @@ }, "node_modules/read-pkg/node_modules/pify": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, "license": "MIT", "engines": { @@ -11010,6 +13400,8 @@ }, "node_modules/read-pkg/node_modules/semver": { "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "license": "ISC", "bin": { @@ -11018,6 +13410,8 @@ }, "node_modules/readable-stream": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -11030,6 +13424,8 @@ }, "node_modules/readdirp": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "license": "MIT", "dependencies": { "picomatch": "^2.2.1" @@ -11040,6 +13436,8 @@ }, "node_modules/readdirp/node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -11050,10 +13448,14 @@ }, "node_modules/reflect-metadata": { "version": "0.1.14", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", + "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==", "license": "Apache-2.0" }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, "license": "MIT", "dependencies": { @@ -11075,10 +13477,14 @@ }, "node_modules/regenerate": { "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "license": "MIT" }, "node_modules/regenerate-unicode-properties": { "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "license": "MIT", "dependencies": { "regenerate": "^1.4.2" @@ -11089,14 +13495,20 @@ }, "node_modules/regenerator-runtime": { "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", "license": "MIT" }, "node_modules/regex-parser": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", + "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==", "license": "MIT" }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, "license": "MIT", "dependencies": { @@ -11116,6 +13528,8 @@ }, "node_modules/regexpu-core": { "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", "license": "MIT", "dependencies": { "regenerate": "^1.4.2", @@ -11131,10 +13545,14 @@ }, "node_modules/regjsgen": { "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", "license": "MIT" }, "node_modules/regjsparser": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "license": "BSD-2-Clause", "dependencies": { "jsesc": "~3.0.2" @@ -11145,6 +13563,8 @@ }, "node_modules/regjsparser/node_modules/jsesc": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -11155,6 +13575,9 @@ }, "node_modules/request": { "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -11185,6 +13608,8 @@ }, "node_modules/request/node_modules/qs": { "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "devOptional": true, "license": "BSD-3-Clause", "engines": { @@ -11193,6 +13618,9 @@ }, "node_modules/request/node_modules/uuid": { "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "devOptional": true, "license": "MIT", "bin": { @@ -11201,6 +13629,8 @@ }, "node_modules/require-directory": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -11208,6 +13638,8 @@ }, "node_modules/require-from-string": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -11215,15 +13647,21 @@ }, "node_modules/require-main-filename": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "devOptional": true, "license": "ISC" }, "node_modules/requires-port": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "license": "MIT" }, "node_modules/resolve": { "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "license": "MIT", "dependencies": { "is-core-module": "^2.9.0", @@ -11239,6 +13677,8 @@ }, "node_modules/resolve-from": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "license": "MIT", "engines": { "node": ">=8" @@ -11246,10 +13686,15 @@ }, "node_modules/resolve-url": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", "license": "MIT" }, "node_modules/resolve-url-loader": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", "license": "MIT", "dependencies": { "adjust-sourcemap-loader": "^4.0.0", @@ -11264,6 +13709,8 @@ }, "node_modules/resolve-url-loader/node_modules/loader-utils": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "license": "MIT", "dependencies": { "big.js": "^5.2.2", @@ -11276,6 +13723,8 @@ }, "node_modules/resolve-url-loader/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -11283,6 +13732,8 @@ }, "node_modules/restore-cursor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "license": "MIT", "dependencies": { "onetime": "^5.1.0", @@ -11294,6 +13745,8 @@ }, "node_modules/retry": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, "license": "MIT", "engines": { @@ -11302,6 +13755,8 @@ }, "node_modules/reusify": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -11310,11 +13765,16 @@ }, "node_modules/rfdc": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "devOptional": true, "license": "MIT" }, "node_modules/rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "license": "ISC", "dependencies": { "glob": "^7.1.3" @@ -11327,7 +13787,9 @@ } }, "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -11336,6 +13798,9 @@ }, "node_modules/rimraf/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -11354,6 +13819,8 @@ }, "node_modules/rimraf/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -11364,6 +13831,8 @@ }, "node_modules/rollup": { "version": "2.78.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.0.tgz", + "integrity": "sha512-4+YfbQC9QEVvKTanHhIAFVUFSRsezvQF8vFOJwtGfb9Bb+r014S+qryr9PSmw8x6sMnPkmFBGAvIFVQxvJxjtg==", "license": "MIT", "bin": { "rollup": "dist/bin/rollup" @@ -11377,6 +13846,8 @@ }, "node_modules/rollup-plugin-sourcemaps": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.6.3.tgz", + "integrity": "sha512-paFu+nT1xvuO1tPFYXGe+XnQvg4Hjqv/eIhG8i5EspfYYPBKL57X7iVbfv55aNVASg3dzWvES9dmWsL2KhfByw==", "license": "MIT", "dependencies": { "@rollup/pluginutils": "^3.0.9", @@ -11397,6 +13868,8 @@ }, "node_modules/rollup-plugin-sourcemaps/node_modules/@rollup/pluginutils": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "license": "MIT", "dependencies": { "@types/estree": "0.0.39", @@ -11412,14 +13885,20 @@ }, "node_modules/rollup-plugin-sourcemaps/node_modules/@types/estree": { "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "license": "MIT" }, "node_modules/rollup-plugin-sourcemaps/node_modules/estree-walker": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "license": "MIT" }, "node_modules/rollup-plugin-sourcemaps/node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -11430,6 +13909,8 @@ }, "node_modules/run-async": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "license": "MIT", "engines": { "node": ">=0.12.0" @@ -11437,6 +13918,8 @@ }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "funding": [ { "type": "github", @@ -11458,6 +13941,8 @@ }, "node_modules/rxjs": { "version": "7.6.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.6.0.tgz", + "integrity": "sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" @@ -11465,6 +13950,8 @@ }, "node_modules/safe-array-concat": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, "license": "MIT", "dependencies": { @@ -11483,6 +13970,8 @@ }, "node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -11501,6 +13990,8 @@ }, "node_modules/safe-push-apply": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "dev": true, "license": "MIT", "dependencies": { @@ -11516,6 +14007,8 @@ }, "node_modules/safe-regex-test": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -11532,10 +14025,14 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, "node_modules/sass": { "version": "1.54.4", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.4.tgz", + "integrity": "sha512-3tmF16yvnBwtlPrNBHw/H907j8MlOX8aTBnlNX1yrKx24RKcJGPyLhFUwkoKBKesR3unP93/2z14Ll8NicwQUA==", "license": "MIT", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -11551,6 +14048,8 @@ }, "node_modules/sass-loader": { "version": "13.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz", + "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==", "license": "MIT", "dependencies": { "klona": "^2.0.4", @@ -11587,6 +14086,8 @@ }, "node_modules/saucelabs": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", "devOptional": true, "dependencies": { "https-proxy-agent": "^2.2.1" @@ -11597,6 +14098,8 @@ }, "node_modules/saucelabs/node_modules/agent-base": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -11608,6 +14111,8 @@ }, "node_modules/saucelabs/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -11616,6 +14121,8 @@ }, "node_modules/saucelabs/node_modules/https-proxy-agent": { "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -11628,11 +14135,15 @@ }, "node_modules/sax": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", "devOptional": true, "license": "ISC" }, "node_modules/schema-utils": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.5", @@ -11649,6 +14160,8 @@ }, "node_modules/schema-utils/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -11663,6 +14176,8 @@ }, "node_modules/schema-utils/node_modules/ajv-keywords": { "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" @@ -11670,14 +14185,20 @@ }, "node_modules/schema-utils/node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "license": "MIT" }, "node_modules/select-hose": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "license": "MIT" }, "node_modules/selenium-webdriver": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -11691,7 +14212,9 @@ } }, "node_modules/selenium-webdriver/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -11701,6 +14224,9 @@ }, "node_modules/selenium-webdriver/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "devOptional": true, "license": "ISC", "dependencies": { @@ -11720,6 +14246,8 @@ }, "node_modules/selenium-webdriver/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "devOptional": true, "license": "ISC", "dependencies": { @@ -11731,6 +14259,9 @@ }, "node_modules/selenium-webdriver/node_modules/rimraf": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "devOptional": true, "license": "ISC", "dependencies": { @@ -11742,6 +14273,8 @@ }, "node_modules/selenium-webdriver/node_modules/tmp": { "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha512-HXdTB7lvMwcb55XFfrTM8CPr/IYREk4hVBFaQ4b/6nInrluSL86hfHm7vu0luYKCfyBZp2trCjpc8caC3vVM3w==", "devOptional": true, "license": "MIT", "dependencies": { @@ -11753,6 +14286,8 @@ }, "node_modules/selfsigned": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "license": "MIT", "dependencies": { "@types/node-forge": "^1.3.0", @@ -11764,6 +14299,8 @@ }, "node_modules/semver": { "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" @@ -11777,6 +14314,8 @@ }, "node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -11787,10 +14326,14 @@ }, "node_modules/semver/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/send": { "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "license": "MIT", "dependencies": { "debug": "2.6.9", @@ -11813,6 +14356,8 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -11820,10 +14365,14 @@ }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/send/node_modules/mime": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "license": "MIT", "bin": { "mime": "cli.js" @@ -11834,10 +14383,14 @@ }, "node_modules/send/node_modules/ms": { "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/send/node_modules/statuses": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -11845,6 +14398,8 @@ }, "node_modules/serialize-javascript": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" @@ -11852,6 +14407,8 @@ }, "node_modules/serve-index": { "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "license": "MIT", "dependencies": { "accepts": "~1.3.4", @@ -11868,6 +14425,8 @@ }, "node_modules/serve-index/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -11875,6 +14434,8 @@ }, "node_modules/serve-index/node_modules/depd": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -11882,6 +14443,8 @@ }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "license": "MIT", "dependencies": { "depd": "~1.1.2", @@ -11895,18 +14458,26 @@ }, "node_modules/serve-index/node_modules/inherits": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", "license": "ISC" }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "license": "ISC" }, "node_modules/serve-static": { "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", @@ -11920,6 +14491,8 @@ }, "node_modules/serve-static/node_modules/encodeurl": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -11927,11 +14500,15 @@ }, "node_modules/set-blocking": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "devOptional": true, "license": "ISC" }, "node_modules/set-function-length": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "license": "MIT", "dependencies": { @@ -11948,6 +14525,8 @@ }, "node_modules/set-function-name": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11962,6 +14541,8 @@ }, "node_modules/set-proto": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", "dev": true, "license": "MIT", "dependencies": { @@ -11975,15 +14556,21 @@ }, "node_modules/setimmediate": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "devOptional": true, "license": "MIT" }, "node_modules/setprototypeof": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, "node_modules/shallow-clone": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "license": "MIT", "dependencies": { "kind-of": "^6.0.2" @@ -11994,6 +14581,8 @@ }, "node_modules/shebang-command": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "license": "MIT", "dependencies": { @@ -12005,6 +14594,8 @@ }, "node_modules/shebang-regex": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, "license": "MIT", "engines": { @@ -12012,7 +14603,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.3", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", "dev": true, "license": "MIT", "engines": { @@ -12024,6 +14617,8 @@ }, "node_modules/side-channel": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -12041,6 +14636,8 @@ }, "node_modules/side-channel-list": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -12055,6 +14652,8 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -12071,6 +14670,8 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -12088,10 +14689,14 @@ }, "node_modules/signal-exit": { "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, "node_modules/slash": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "license": "MIT", "engines": { "node": ">=12" @@ -12102,6 +14707,8 @@ }, "node_modules/smart-buffer": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, "license": "MIT", "engines": { @@ -12111,6 +14718,8 @@ }, "node_modules/socket.io": { "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -12128,6 +14737,8 @@ }, "node_modules/socket.io-adapter": { "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -12137,6 +14748,8 @@ }, "node_modules/socket.io-parser": { "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "devOptional": true, "license": "MIT", "dependencies": { @@ -12149,6 +14762,8 @@ }, "node_modules/sockjs": { "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "license": "MIT", "dependencies": { "faye-websocket": "^0.11.3", @@ -12157,7 +14772,9 @@ } }, "node_modules/socks": { - "version": "2.8.6", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12171,6 +14788,8 @@ }, "node_modules/socks-proxy-agent": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dev": true, "license": "MIT", "dependencies": { @@ -12184,6 +14803,8 @@ }, "node_modules/source-map": { "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "license": "BSD-3-Clause", "engines": { "node": ">= 8" @@ -12191,6 +14812,8 @@ }, "node_modules/source-map-js": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -12198,6 +14821,8 @@ }, "node_modules/source-map-loader": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.0.tgz", + "integrity": "sha512-i3KVgM3+QPAHNbGavK+VBq03YoJl24m9JWNbLgsjTj8aJzXG9M61bantBTNBt7CNwY2FYf+RJRYJ3pzalKjIrw==", "license": "MIT", "dependencies": { "abab": "^2.0.6", @@ -12217,6 +14842,8 @@ }, "node_modules/source-map-loader/node_modules/iconv-lite": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -12227,6 +14854,9 @@ }, "node_modules/source-map-resolve": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", "license": "MIT", "dependencies": { "atob": "^2.1.2", @@ -12235,6 +14865,8 @@ }, "node_modules/source-map-support": { "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", @@ -12243,6 +14875,8 @@ }, "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -12250,14 +14884,22 @@ }, "node_modules/source-map-url": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", "license": "MIT" }, "node_modules/sourcemap-codec": { "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", "license": "MIT" }, "node_modules/spdx-correct": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -12267,11 +14909,15 @@ }, "node_modules/spdx-exceptions": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true, "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -12281,11 +14927,15 @@ }, "node_modules/spdx-license-ids": { "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", "dev": true, "license": "CC0-1.0" }, "node_modules/spdy": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "license": "MIT", "dependencies": { "debug": "^4.1.0", @@ -12300,6 +14950,8 @@ }, "node_modules/spdy-transport": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "license": "MIT", "dependencies": { "debug": "^4.1.0", @@ -12312,10 +14964,14 @@ }, "node_modules/sprintf-js": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause" }, "node_modules/sshpk": { "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -12340,11 +14996,15 @@ }, "node_modules/sshpk/node_modules/jsbn": { "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "devOptional": true, "license": "MIT" }, "node_modules/ssri": { "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "license": "ISC", "dependencies": { "minipass": "^3.1.1" @@ -12355,25 +15015,17 @@ }, "node_modules/statuses": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/streamroller": { "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -12387,6 +15039,8 @@ }, "node_modules/string_decoder": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" @@ -12394,6 +15048,8 @@ }, "node_modules/string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -12406,6 +15062,8 @@ }, "node_modules/string.prototype.padend": { "version": "3.1.6", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", + "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", "dev": true, "license": "MIT", "dependencies": { @@ -12423,6 +15081,8 @@ }, "node_modules/string.prototype.trim": { "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, "license": "MIT", "dependencies": { @@ -12443,6 +15103,8 @@ }, "node_modules/string.prototype.trimend": { "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12460,6 +15122,8 @@ }, "node_modules/string.prototype.trimstart": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "license": "MIT", "dependencies": { @@ -12476,6 +15140,8 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -12486,6 +15152,8 @@ }, "node_modules/strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "engines": { @@ -12494,6 +15162,8 @@ }, "node_modules/strip-final-newline": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "license": "MIT", "engines": { "node": ">=6" @@ -12501,6 +15171,8 @@ }, "node_modules/stylus": { "version": "0.54.8", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", + "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", "license": "MIT", "dependencies": { "css-parse": "~2.0.0", @@ -12521,6 +15193,8 @@ }, "node_modules/stylus-loader": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.0.0.tgz", + "integrity": "sha512-WTbtLrNfOfLgzTaR9Lj/BPhQroKk/LC1hfTXSUbrxmxgfUo3Y3LpmKRVA2R1XbjvTAvOfaian9vOyfv1z99E+A==", "license": "MIT", "dependencies": { "fast-glob": "^3.2.11", @@ -12540,7 +15214,9 @@ } }, "node_modules/stylus/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -12549,6 +15225,8 @@ }, "node_modules/stylus/node_modules/debug": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -12556,6 +15234,9 @@ }, "node_modules/stylus/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -12574,6 +15255,8 @@ }, "node_modules/stylus/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -12584,14 +15267,20 @@ }, "node_modules/stylus/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/stylus/node_modules/sax": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "license": "ISC" }, "node_modules/stylus/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -12599,6 +15288,8 @@ }, "node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -12609,6 +15300,8 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -12619,6 +15312,8 @@ }, "node_modules/symbol-observable": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", "dev": true, "license": "MIT", "engines": { @@ -12627,6 +15322,8 @@ }, "node_modules/tapable": { "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", "license": "MIT", "engines": { "node": ">=6" @@ -12634,6 +15331,8 @@ }, "node_modules/tar": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "license": "ISC", "dependencies": { "chownr": "^2.0.0", @@ -12649,6 +15348,8 @@ }, "node_modules/tar/node_modules/minipass": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "license": "ISC", "engines": { "node": ">=8" @@ -12656,10 +15357,14 @@ }, "node_modules/tar/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/terser": { "version": "5.14.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", + "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.2", @@ -12676,6 +15381,8 @@ }, "node_modules/terser-webpack-plugin": { "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", @@ -12708,10 +15415,14 @@ }, "node_modules/terser-webpack-plugin/node_modules/commander": { "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -12728,7 +15439,9 @@ } }, "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.43.1", + "version": "5.40.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.40.0.tgz", + "integrity": "sha512-cfeKl/jjwSR5ar7d0FGmave9hFGJT8obyo0z+CrQOylLDbk7X81nPU6vq9VORa5jU30SkDnT2FXjLbR8HLP+xA==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -12745,10 +15458,14 @@ }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, "node_modules/test-exclude": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", @@ -12760,7 +15477,9 @@ } }, "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -12769,6 +15488,9 @@ }, "node_modules/test-exclude/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -12787,6 +15509,8 @@ }, "node_modules/test-exclude/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -12797,18 +15521,26 @@ }, "node_modules/text-table": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "license": "MIT" }, "node_modules/through": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "license": "MIT" }, "node_modules/thunky": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "license": "MIT" }, "node_modules/tmp": { "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "license": "MIT", "dependencies": { "os-tmpdir": "~1.0.2" @@ -12819,6 +15551,8 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -12829,6 +15563,8 @@ }, "node_modules/toidentifier": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", "engines": { "node": ">=0.6" @@ -12836,6 +15572,8 @@ }, "node_modules/tough-cookie": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "devOptional": true, "license": "BSD-3-Clause", "dependencies": { @@ -12848,6 +15586,8 @@ }, "node_modules/tough-cookie/node_modules/punycode": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "devOptional": true, "license": "MIT", "engines": { @@ -12856,6 +15596,8 @@ }, "node_modules/tree-kill": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "license": "MIT", "bin": { "tree-kill": "cli.js" @@ -12863,6 +15605,8 @@ }, "node_modules/ts-node": { "version": "8.3.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.3.0.tgz", + "integrity": "sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12884,10 +15628,15 @@ }, "node_modules/tslib": { "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/tslint": { "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", + "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -12917,6 +15666,8 @@ }, "node_modules/tslint/node_modules/ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", "dependencies": { @@ -12927,7 +15678,9 @@ } }, "node_modules/tslint/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", "dependencies": { @@ -12937,6 +15690,8 @@ }, "node_modules/tslint/node_modules/chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12950,6 +15705,8 @@ }, "node_modules/tslint/node_modules/color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", "dependencies": { @@ -12958,16 +15715,23 @@ }, "node_modules/tslint/node_modules/color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, "license": "MIT" }, "node_modules/tslint/node_modules/commander": { "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, "license": "MIT" }, "node_modules/tslint/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -12987,6 +15751,8 @@ }, "node_modules/tslint/node_modules/has-flag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", "engines": { @@ -12995,6 +15761,8 @@ }, "node_modules/tslint/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -13006,6 +15774,8 @@ }, "node_modules/tslint/node_modules/mkdirp": { "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "license": "MIT", "dependencies": { @@ -13017,6 +15787,8 @@ }, "node_modules/tslint/node_modules/semver": { "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "license": "ISC", "bin": { @@ -13025,6 +15797,8 @@ }, "node_modules/tslint/node_modules/supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", "dependencies": { @@ -13036,11 +15810,15 @@ }, "node_modules/tslint/node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true, "license": "0BSD" }, "node_modules/tsutils": { "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "dev": true, "license": "MIT", "dependencies": { @@ -13052,11 +15830,15 @@ }, "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true, "license": "0BSD" }, "node_modules/tunnel-agent": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -13068,11 +15850,15 @@ }, "node_modules/tweetnacl": { "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "devOptional": true, "license": "Unlicense" }, "node_modules/type-fest": { "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -13083,6 +15869,8 @@ }, "node_modules/type-is": { "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "license": "MIT", "dependencies": { "media-typer": "0.3.0", @@ -13094,6 +15882,8 @@ }, "node_modules/typed-array-buffer": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, "license": "MIT", "dependencies": { @@ -13107,6 +15897,8 @@ }, "node_modules/typed-array-byte-length": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, "license": "MIT", "dependencies": { @@ -13125,6 +15917,8 @@ }, "node_modules/typed-array-byte-offset": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13145,6 +15939,8 @@ }, "node_modules/typed-array-length": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, "license": "MIT", "dependencies": { @@ -13164,10 +15960,14 @@ }, "node_modules/typed-assert": { "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", "license": "MIT" }, "node_modules/typescript": { "version": "4.6.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", + "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -13179,6 +15979,8 @@ }, "node_modules/ua-parser-js": { "version": "0.7.40", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.40.tgz", + "integrity": "sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ==", "devOptional": true, "funding": [ { @@ -13204,6 +16006,8 @@ }, "node_modules/unbox-primitive": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, "license": "MIT", "dependencies": { @@ -13221,6 +16025,8 @@ }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "license": "MIT", "engines": { "node": ">=4" @@ -13228,6 +16034,8 @@ }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", @@ -13239,6 +16047,8 @@ }, "node_modules/unicode-match-property-value-ecmascript": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "license": "MIT", "engines": { "node": ">=4" @@ -13246,6 +16056,8 @@ }, "node_modules/unicode-property-aliases-ecmascript": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "license": "MIT", "engines": { "node": ">=4" @@ -13253,6 +16065,8 @@ }, "node_modules/unique-filename": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "license": "ISC", "dependencies": { "unique-slug": "^2.0.0" @@ -13260,6 +16074,8 @@ }, "node_modules/unique-slug": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" @@ -13267,6 +16083,8 @@ }, "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==", "devOptional": true, "license": "MIT", "engines": { @@ -13275,6 +16093,8 @@ }, "node_modules/unpipe": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -13282,6 +16102,8 @@ }, "node_modules/update-browserslist-db": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "funding": [ { "type": "opencollective", @@ -13310,6 +16132,8 @@ }, "node_modules/uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -13317,6 +16141,8 @@ }, "node_modules/uri-js/node_modules/punycode": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "license": "MIT", "engines": { "node": ">=6" @@ -13324,14 +16150,21 @@ }, "node_modules/urix": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", "license": "MIT" }, "node_modules/util-deprecate": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, "node_modules/utils-merge": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "license": "MIT", "engines": { "node": ">= 0.4.0" @@ -13339,6 +16172,8 @@ }, "node_modules/uuid": { "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "license": "MIT", "bin": { "uuid": "dist/bin/uuid" @@ -13346,6 +16181,8 @@ }, "node_modules/validate-npm-package-license": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -13355,6 +16192,8 @@ }, "node_modules/validate-npm-package-name": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", "dev": true, "license": "ISC", "dependencies": { @@ -13366,6 +16205,8 @@ }, "node_modules/vary": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -13373,6 +16214,8 @@ }, "node_modules/verror": { "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "devOptional": true, "engines": [ "node >=0.6.0" @@ -13386,6 +16229,8 @@ }, "node_modules/void-elements": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", "devOptional": true, "license": "MIT", "engines": { @@ -13394,6 +16239,8 @@ }, "node_modules/watchpack": { "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", @@ -13405,6 +16252,8 @@ }, "node_modules/wbuf": { "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" @@ -13412,6 +16261,8 @@ }, "node_modules/wcwidth": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "license": "MIT", "dependencies": { "defaults": "^1.0.3" @@ -13419,6 +16270,8 @@ }, "node_modules/webdriver-js-extender": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -13431,6 +16284,8 @@ }, "node_modules/webdriver-manager": { "version": "12.1.9", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.9.tgz", + "integrity": "sha512-Yl113uKm8z4m/KMUVWHq1Sjtla2uxEBtx2Ue3AmIlnlPAKloDn/Lvmy6pqWCUersVISpdMeVpAaGbNnvMuT2LQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -13455,6 +16310,8 @@ }, "node_modules/webdriver-manager/node_modules/ansi-regex": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "devOptional": true, "license": "MIT", "engines": { @@ -13463,6 +16320,8 @@ }, "node_modules/webdriver-manager/node_modules/ansi-styles": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "devOptional": true, "license": "MIT", "engines": { @@ -13470,7 +16329,9 @@ } }, "node_modules/webdriver-manager/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -13480,6 +16341,8 @@ }, "node_modules/webdriver-manager/node_modules/chalk": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "devOptional": true, "license": "MIT", "dependencies": { @@ -13495,6 +16358,9 @@ }, "node_modules/webdriver-manager/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "devOptional": true, "license": "ISC", "dependencies": { @@ -13514,11 +16380,15 @@ }, "node_modules/webdriver-manager/node_modules/ini": { "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "devOptional": true, "license": "ISC" }, "node_modules/webdriver-manager/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "devOptional": true, "license": "ISC", "dependencies": { @@ -13530,6 +16400,9 @@ }, "node_modules/webdriver-manager/node_modules/rimraf": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "devOptional": true, "license": "ISC", "dependencies": { @@ -13541,6 +16414,8 @@ }, "node_modules/webdriver-manager/node_modules/semver": { "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "devOptional": true, "license": "ISC", "bin": { @@ -13549,6 +16424,8 @@ }, "node_modules/webdriver-manager/node_modules/strip-ansi": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -13560,6 +16437,8 @@ }, "node_modules/webdriver-manager/node_modules/supports-color": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "devOptional": true, "license": "MIT", "engines": { @@ -13568,6 +16447,8 @@ }, "node_modules/webpack": { "version": "5.76.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz", + "integrity": "sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ==", "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -13613,6 +16494,8 @@ }, "node_modules/webpack-dev-middleware": { "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", "license": "MIT", "dependencies": { "colorette": "^2.0.10", @@ -13634,6 +16517,8 @@ }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -13651,6 +16536,8 @@ }, "node_modules/webpack-dev-server": { "version": "4.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.0.tgz", + "integrity": "sha512-L5S4Q2zT57SK7tazgzjMiSMBdsw+rGYIX27MgPgx7LDhWO0lViPrHKoLS7jo5In06PWYAhlYu3PbyoC6yAThbw==", "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.9", @@ -13704,6 +16591,8 @@ }, "node_modules/webpack-dev-server/node_modules/schema-utils": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -13721,6 +16610,8 @@ }, "node_modules/webpack-merge": { "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", @@ -13731,7 +16622,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.3.3", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.0.tgz", + "integrity": "sha512-77R0RDmJfj9dyv5p3bM5pOHa+X8/ZkO9c7kpDstigkC4nIDobadsfSGCwB4bKhMVxqAok8tajaoR8rirM7+VFQ==", "license": "MIT", "engines": { "node": ">=10.13.0" @@ -13739,6 +16632,8 @@ }, "node_modules/webpack-subresource-integrity": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", "license": "MIT", "dependencies": { "typed-assert": "^1.0.8" @@ -13758,10 +16653,14 @@ }, "node_modules/webpack/node_modules/@types/estree": { "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", "license": "MIT" }, "node_modules/webpack/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -13776,6 +16675,8 @@ }, "node_modules/webpack/node_modules/ajv-keywords": { "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" @@ -13783,10 +16684,14 @@ }, "node_modules/webpack/node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "license": "MIT" }, "node_modules/webpack/node_modules/schema-utils": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", @@ -13803,6 +16708,8 @@ }, "node_modules/websocket-driver": { "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", @@ -13815,6 +16722,8 @@ }, "node_modules/websocket-extensions": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "license": "Apache-2.0", "engines": { "node": ">=0.8.0" @@ -13822,6 +16731,8 @@ }, "node_modules/which": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "license": "ISC", "dependencies": { @@ -13833,6 +16744,8 @@ }, "node_modules/which-boxed-primitive": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, "license": "MIT", "dependencies": { @@ -13851,6 +16764,8 @@ }, "node_modules/which-builtin-type": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, "license": "MIT", "dependencies": { @@ -13877,6 +16792,8 @@ }, "node_modules/which-collection": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "license": "MIT", "dependencies": { @@ -13894,11 +16811,15 @@ }, "node_modules/which-module": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "devOptional": true, "license": "ISC" }, "node_modules/which-typed-array": { "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "dev": true, "license": "MIT", "dependencies": { @@ -13919,6 +16840,8 @@ }, "node_modules/wide-align": { "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, "license": "ISC", "dependencies": { @@ -13927,10 +16850,14 @@ }, "node_modules/wildcard": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "license": "MIT" }, "node_modules/wrap-ansi": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -13946,10 +16873,14 @@ }, "node_modules/wrappy": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, "node_modules/ws": { "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -13969,6 +16900,8 @@ }, "node_modules/xml2js": { "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", "devOptional": true, "license": "MIT", "dependencies": { @@ -13981,6 +16914,8 @@ }, "node_modules/xmlbuilder": { "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "devOptional": true, "license": "MIT", "engines": { @@ -13989,6 +16924,8 @@ }, "node_modules/xxhashjs": { "version": "0.2.2", + "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", + "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", "license": "MIT", "dependencies": { "cuint": "^0.2.2" @@ -13996,6 +16933,8 @@ }, "node_modules/y18n": { "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "license": "ISC", "engines": { "node": ">=10" @@ -14003,10 +16942,14 @@ }, "node_modules/yallist": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "license": "ISC" }, "node_modules/yaml": { "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "license": "ISC", "engines": { "node": ">= 6" @@ -14014,6 +16957,8 @@ }, "node_modules/yargs": { "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", "license": "MIT", "dependencies": { "cliui": "^7.0.2", @@ -14030,6 +16975,8 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "license": "ISC", "engines": { "node": ">=12" @@ -14037,6 +16984,8 @@ }, "node_modules/yn": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, "license": "MIT", "engines": { @@ -14045,10 +16994,12 @@ }, "node_modules/zone.js": { "version": "0.11.8", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz", + "integrity": "sha512-82bctBg2hKcEJ21humWIkXRlLBBmrc3nN7DFh5LGGhcyycO2S7FN8NmdvlcKaGFDNVL4/9kFLmwmInTavdJERA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" } } } -} +} \ No newline at end of file diff --git a/plugins/sftp/web/package.json b/plugins/sftp/web/package.json index cc0633ec5..c44e1e80e 100644 --- a/plugins/sftp/web/package.json +++ b/plugins/sftp/web/package.json @@ -24,7 +24,7 @@ "@angular/platform-browser": "^14.3.0", "@angular/platform-browser-dynamic": "^14.3.0", "@angular/router": "^14.3.0", - "@ngageoint/mage.web-core-lib": "6.3.0 || 6.4.0-beta.1", + "@ngageoint/mage.web-core-lib": "6.3.0", "rxjs": "~7.6.0", "tslib": "^2.0.0", "zone.js": "~0.11.4" diff --git a/plugins/sftp/web/projects/main/package-lock.json b/plugins/sftp/web/projects/main/package-lock.json index 515efa188..309201cd0 100644 --- a/plugins/sftp/web/projects/main/package-lock.json +++ b/plugins/sftp/web/projects/main/package-lock.json @@ -11,7 +11,7 @@ "tslib": "^1.10.0" }, "peerDependencies": { - "@ngageoint/mage.web-app": "6.3.0 || 6.4.0-beta.1" + "@ngageoint/mage.web-app": "6.3.0" } }, "node_modules/@ngageoint/mage.service": { @@ -13281,6 +13281,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/@ngageoint/mage.web-app/-/mage.web-app-6.3.0.tgz", "integrity": "sha512-4thhedM1gIJEKbubv2PxQNtnK0ZRQKF78iulOBJxJwg6XP9ocI8kj7pPjR2tuO9G8DLwyi0JIdlnas0nIw0M0w==", + "license": "Apache-2.0", "peer": true, "peerDependencies": { "@ngageoint/mage.service": "^6.3.0" @@ -13289,7 +13290,8 @@ "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" } } -} \ No newline at end of file +} diff --git a/plugins/sftp/web/projects/main/package.json b/plugins/sftp/web/projects/main/package.json index 6c5f521c5..e5ac8ffe6 100644 --- a/plugins/sftp/web/projects/main/package.json +++ b/plugins/sftp/web/projects/main/package.json @@ -2,7 +2,7 @@ "name": "@ngageoint/mage.sftp.web", "version": "1.0.0-beta.2", "peerDependencies": { - "@ngageoint/mage.web-app": "6.3.0 || 6.4.0-beta.1" + "@ngageoint/mage.web-app": "6.3.0" }, "dependencies": { "tslib": "^1.10.0" diff --git a/plugins/sftp/web/projects/main/src/public-api.ts b/plugins/sftp/web/projects/main/src/public-api.ts index abbd2438a..e30b2cbf5 100644 --- a/plugins/sftp/web/projects/main/src/public-api.ts +++ b/plugins/sftp/web/projects/main/src/public-api.ts @@ -13,7 +13,7 @@ export const MAGE_WEB_HOOKS: PluginHooks = { adminTab: { title: 'SFTP', icon: { - className: 'fa fa-folder-open' + path: 'assets/drive_file_move_black_24dp.svg' }, tabContentComponent: ConfigurationComponent } diff --git a/scripts/init.d/mage b/scripts/init.d/mage index 398688332..91c6e6176 100644 --- a/scripts/init.d/mage +++ b/scripts/init.d/mage @@ -15,7 +15,7 @@ scriptId=$sourceDir/$applicationFile start() { echo "Starting $scriptId" - # Start our Mage app through forever + # Start our MAGE app through forever # Notice that we change the PATH because on reboot # the PATH does not include the path to node. # Launching forever or coffee with a full path diff --git a/scripts/upstart/mage.conf b/scripts/upstart/mage.conf index b64c28259..fbf196429 100644 --- a/scripts/upstart/mage.conf +++ b/scripts/upstart/mage.conf @@ -1,6 +1,6 @@ #!upstart -description "Mage upstart script for Node.js process" +description "MAGE upstart script for Node.js process" start on runlevel [2345] stop on runlevel [06] diff --git a/service/npm-shrinkwrap.json b/service/npm-shrinkwrap.json index 50b49650e..45bdd0c7e 100644 --- a/service/npm-shrinkwrap.json +++ b/service/npm-shrinkwrap.json @@ -1,18 +1,18 @@ { "name": "@ngageoint/mage.service", - "version": "6.5.5", + "version": "6.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ngageoint/mage.service", - "version": "6.5.5", + "version": "6.3.0", "dependencies": { "@ngageoint/geopackage": "4.2.6", "@ngageoint/mongodb-migrations": "1.0.0", "@node-saml/passport-saml": "4.0.4", - "@turf/centroid": "7.2.0", - "@turf/kinks": "7.2.0", + "@turf/centroid": "6.5.0", + "@turf/kinks": "6.5.0", "@types/geojson": "7946.0.16", "@types/json-schema": "7.0.15", "@types/mime-types": "2.1.4", @@ -31,7 +31,7 @@ "fs-extra": "4.0.3", "geojson": "0.5.0", "geojson-validation": "1.0.2", - "json2csv": "5.0.7", + "json2csv": "4.5.4", "jsonwebtoken": "9.0.2", "lodash": "4.17.21", "mgrs": "1.0.0", @@ -65,7 +65,6 @@ }, "devDependencies": { "@fluffy-spoon/substitute": "1.208.0", - "@types/adm-zip": "0.5.7", "@types/archiver": "5.3.4", "@types/async": "3.2.24", "@types/bson": "1.0.11", @@ -76,7 +75,7 @@ "@types/express": "4.17.21", "@types/express-serve-static-core": "4.19.6", "@types/fs-extra": "8.1.5", - "@types/json2csv": "5.0.7", + "@types/json2csv": "4.5.1", "@types/lodash": "4.17.16", "@types/mocha": "7.0.2", "@types/multer": "1.4.12", @@ -2299,41 +2298,12 @@ } }, "node_modules/@turf/centroid": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-7.2.0.tgz", - "integrity": "sha512-yJqDSw25T7P48au5KjvYqbDVZ7qVnipziVfZ9aSo7P2/jTE7d4BP21w0/XLi3T/9bry/t9PR1GDDDQljN4KfDw==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "^7.2.0", - "@turf/meta": "^7.2.0", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/centroid/node_modules/@turf/helpers": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.2.0.tgz", - "integrity": "sha512-cXo7bKNZoa7aC7ydLmUR02oB3IgDe7MxiPuRz3cCtYQHn+BJ6h1tihmamYDWWUlPHgSNF0i3ATc4WmDECZafKw==", - "license": "MIT", - "dependencies": { - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/centroid/node_modules/@turf/meta": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-7.2.0.tgz", - "integrity": "sha512-igzTdHsQc8TV1RhPuOLVo74Px/hyPrVgVOTgjWQZzt3J9BVseCdpfY/0cJBdlSRI4S/yTmmHl7gAqjhpYH5Yaw==", - "license": "MIT", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-6.5.0.tgz", + "integrity": "sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A==", "dependencies": { - "@turf/helpers": "^7.2.0", - "@types/geojson": "^7946.0.10" + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" @@ -2395,27 +2365,11 @@ } }, "node_modules/@turf/kinks": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@turf/kinks/-/kinks-7.2.0.tgz", - "integrity": "sha512-BtxDxGewJR0Q5WR9HKBSxZhirFX+GEH1rD7/EvgDsHS8e1Y5/vNQQUmXdURjdPa4StzaUBsWRU5T3A356gLbPA==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "^7.2.0", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/kinks/node_modules/@turf/helpers": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.2.0.tgz", - "integrity": "sha512-cXo7bKNZoa7aC7ydLmUR02oB3IgDe7MxiPuRz3cCtYQHn+BJ6h1tihmamYDWWUlPHgSNF0i3ATc4WmDECZafKw==", - "license": "MIT", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/kinks/-/kinks-6.5.0.tgz", + "integrity": "sha512-ViCngdPt1eEL7hYUHR2eHR662GvCgTc35ZJFaNR6kRtr6D8plLaDju0FILeFFWSc+o8e3fwxZEJKmFj9IzPiIQ==", "dependencies": { - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" + "@turf/helpers": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" @@ -2527,16 +2481,6 @@ "url": "https://opencollective.com/turf" } }, - "node_modules/@types/adm-zip": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.5.7.tgz", - "integrity": "sha512-DNEs/QvmyRLurdQPChqq0Md4zGvPwHerAJYWk9l2jCbD1VPpnzRJorOdiq4zsw09NFbYnhfsoEhWtxIzXpn2yw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/archiver": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-5.3.4.tgz", @@ -2679,9 +2623,9 @@ "license": "MIT" }, "node_modules/@types/json2csv": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@types/json2csv/-/json2csv-5.0.7.tgz", - "integrity": "sha512-Ma25zw9G9GEBnX8b12R4EYvnFT6dBh8L3jwsN5EUFXa+fl2dqmbLDbNWN0XuQU3rSXdsbBeCYjI9uHU2PUBxhA==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@types/json2csv/-/json2csv-4.5.1.tgz", + "integrity": "sha512-sZbRdrTddxYzhydkC5eMEbRXU8pjcV8Zyxf2If7YO3GVxWY18fs0P5YJyjRfkMKTAsA8ynTRQWhvWbHhBzBFVA==", "dev": true, "license": "MIT", "dependencies": { @@ -7393,32 +7337,24 @@ "dev": true }, "node_modules/json2csv": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/json2csv/-/json2csv-5.0.7.tgz", - "integrity": "sha512-YRZbUnyaJZLZUJSRi2G/MqahCyRv9n/ds+4oIetjDF3jWQA7AG7iSeKTiZiCNqtMZM7HDyt0e/W6lEnoGEmMGA==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/json2csv/-/json2csv-4.5.4.tgz", + "integrity": "sha512-YxBhY4Lmn8IvVZ36nqg5omxneLy9JlorkqW1j/EDCeqvmi+CQ4uM+wsvXlcIqvGDewIPXMC/O/oF8DX9EH5aoA==", "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "license": "MIT", "dependencies": { - "commander": "^6.1.0", + "commander": "^2.15.1", "jsonparse": "^1.3.1", "lodash.get": "^4.4.2" }, "bin": { "json2csv": "bin/json2csv.js" - }, - "engines": { - "node": ">= 10", - "npm": ">= 6.13.0" } }, "node_modules/json2csv/node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/jsonfile": { "version": "4.0.0", @@ -12012,10 +11948,10 @@ } }, "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "devOptional": true }, "node_modules/tunnel-agent": { "version": "0.6.0", @@ -12829,4 +12765,4 @@ } } } -} \ No newline at end of file +} diff --git a/service/package.json b/service/package.json index ccd96153d..8149e14bc 100644 --- a/service/package.json +++ b/service/package.json @@ -1,11 +1,11 @@ { "name": "@ngageoint/mage.service", - "version": "6.5.5", - "displayName": "Mage Service", - "description": "Mage is a geospatial situational awareness and data collection platform. The Mage Service is the ReST service API that the Mage client apps use to interact with Mage data.", + "version": "6.3.0", + "displayName": "MAGE Service", + "description": "MAGE is a geospatial situational awareness and data collection platform. The MAGE Service is the ReST service API that the MAGE client apps use to interact with MAGE data.", "keywords": [ "NGA", - "Mage", + "MAGE", "situational awareness", "geospatial" ], @@ -31,8 +31,8 @@ "@ngageoint/geopackage": "4.2.6", "@ngageoint/mongodb-migrations": "1.0.0", "@node-saml/passport-saml": "4.0.4", - "@turf/centroid": "7.2.0", - "@turf/kinks": "7.2.0", + "@turf/centroid": "6.5.0", + "@turf/kinks": "6.5.0", "@types/geojson": "7946.0.16", "@types/json-schema": "7.0.15", "@types/mime-types": "2.1.4", @@ -51,7 +51,7 @@ "fs-extra": "4.0.3", "geojson": "0.5.0", "geojson-validation": "1.0.2", - "json2csv": "5.0.7", + "json2csv": "4.5.4", "jsonwebtoken": "9.0.2", "lodash": "4.17.21", "mgrs": "1.0.0", @@ -82,7 +82,6 @@ }, "devDependencies": { "@fluffy-spoon/substitute": "1.208.0", - "@types/adm-zip": "0.5.7", "@types/archiver": "5.3.4", "@types/async": "3.2.24", "@types/bson": "1.0.11", @@ -93,7 +92,7 @@ "@types/express": "4.17.21", "@types/express-serve-static-core": "4.19.6", "@types/fs-extra": "8.1.5", - "@types/json2csv": "5.0.7", + "@types/json2csv": "4.5.1", "@types/lodash": "4.17.16", "@types/mocha": "7.0.2", "@types/multer": "1.4.12", diff --git a/service/src/adapters/observations/adapters.observations.dto.ecma404-json.ts b/service/src/adapters/observations/adapters.observations.dto.ecma404-json.ts index cfe7faeeb..ac6650df4 100644 --- a/service/src/adapters/observations/adapters.observations.dto.ecma404-json.ts +++ b/service/src/adapters/observations/adapters.observations.dto.ecma404-json.ts @@ -24,28 +24,28 @@ export function exoObservationModFromJson(json: Json): ExoObservationMod | Inval return invalidInput('Observation update must be a JSON object.') } if (typeof json.id !== 'string') { - return invalidInput('Observation must have a string ID.', ['id']) + return invalidInput('Observation must have a string ID.', [ 'id' ]) } const bbox = json.bbox if (bbox !== undefined && !Array.isArray(bbox)) { - return invalidInput('BBox must be an array.', ['bbox']) + return invalidInput('BBox must be an array.', [ 'bbox' ]) } if (typeof json?.geometry !== 'object' || Array.isArray(json.geometry) || json.geometry === null) { - return invalidInput('Geometry must be an object.', ['geometry']) + return invalidInput('Geometry must be an object.', [ 'geometry' ]) } if (json.type !== undefined && json.type !== 'Feature') { - return invalidInput('GeoJSON type must be \'Feature\'', ['type']) + return invalidInput('GeoJSON type must be \'Feature\'', [ 'type' ]) } const properties = json.properties if (!properties || typeof properties !== 'object' || Array.isArray(properties)) { - return invalidInput('Observation properties must be an object.', ['properties']) + return invalidInput('Observation properties must be an object.', [ 'properties' ]) } if (!properties.timestamp || typeof properties.timestamp !== 'string') { - return invalidInput('Observation timestamp must be a string.', ['properties', 'timestamp']) + return invalidInput('Observation timestamp must be a string.', [ 'properties', 'timestamp' ]) } const timestamp = moment(properties.timestamp, moment.ISO_8601, true) if (!timestamp.isValid()) { - return invalidInput('Observation timestamp must be a valid ISO-8601 date.', ['properties', 'timestamp']) + return invalidInput('Observation timestamp must be a valid ISO-8601 date.', [ 'properties', 'timestamp' ]) } const mod: ExoObservationMod = { id: json.id, @@ -54,8 +54,7 @@ export function exoObservationModFromJson(json: Json): ExoObservationMod | Inval properties: { ...properties as any, timestamp: timestamp.toDate() - }, - noGeometry: !!json.noGeometry + } } if (bbox) { mod.bbox = bbox as BBox diff --git a/service/src/api/form.js b/service/src/api/form.js index a99e31211..31097a938 100644 --- a/service/src/api/form.js +++ b/service/src/api/form.js @@ -32,22 +32,22 @@ function compareDisplayName(a, b) { } function getUserFields(form) { - return form.fields.filter(function (field) { + return form.fields.filter(function(field) { if (field.archived) return false; - return form.userFields.some(function (memberField) { + return form.userFields.some(function(memberField) { return memberField === field.name; }); }); } -Form.prototype.populateUserFields = function (callback) { +Form.prototype.populateUserFields = function(callback) { var event = this._event; var form = this._form; var forms = form ? [form] : event.forms; var formsUserFields = []; - forms.forEach(function (form) { + forms.forEach(function(form) { var userFields = getUserFields(form); if (userFields.length) { formsUserFields.push(userFields); @@ -67,7 +67,7 @@ Form.prototype.populateUserFields = function (callback) { clean-up. */ const teamIds = (event.teamIds || []).map(x => x._id ? x._id : x) - Team.getTeams({ teamIds }, function (err, teams) { + Team.getTeams({ teamIds }, function(err, teams) { if (err) { console.error(err); return callback(err); @@ -76,8 +76,8 @@ Form.prototype.populateUserFields = function (callback) { var choices = []; var users = {}; - teams.forEach(function (team) { - team.userIds.forEach(function (user) { + teams.forEach(function(team) { + team.userIds.forEach(function(user) { users[user.displayName] = user.displayName; }); }); @@ -93,12 +93,12 @@ Form.prototype.populateUserFields = function (callback) { } // Update the choices for user field - formsUserFields.forEach(function (userFields) { - userFields.forEach(function (userField) { + formsUserFields.forEach(function(userFields) { + userFields.forEach(function(userField) { userField.choices = choices.slice(); if (!userField.required && userField.type === 'dropdown') { - userField.choices.unshift({ id: 0, value: 0, title: "" }); + userField.choices.unshift({id: 0, value: 0, title: ""}); } }); }); @@ -107,15 +107,15 @@ Form.prototype.populateUserFields = function (callback) { }); }; -Form.prototype.export = function (formId, callback) { +Form.prototype.export = function(formId, callback) { var iconBasePath = new api.Icon(this._event._id).getBasePath(); var formBasePath = path.join(iconBasePath, formId.toString()); var archive = archiver('zip'); archive.directory(formBasePath, 'form/icons'); - archive.append("", { name: 'icons/', prefix: 'form' }); + archive.append("", {name: 'icons/', prefix: 'form'}); - var forms = this._event.forms.filter(function (form) { + var forms = this._event.forms.filter(function(form) { return form._id === formId; }); @@ -125,7 +125,7 @@ Form.prototype.export = function (formId, callback) { return callback(err); } - archive.append(JSON.stringify(forms[0]), { name: "form/form.json" }); + archive.append(JSON.stringify(forms[0]), {name: "form/form.json"}); archive.finalize(); callback(null, { @@ -134,7 +134,7 @@ Form.prototype.export = function (formId, callback) { }); }; -Form.prototype.validate = function (file, callback) { +Form.prototype.validate = function(file, callback) { let archiveError = new Error('Form archive file is invalid, please choose a valid file.'); archiveError.status = 400; @@ -169,7 +169,7 @@ Form.prototype.validate = function (file, callback) { callback(null, form); }; -Form.prototype.importIcons = function (file, form, callback) { +Form.prototype.importIcons = function(file, form, callback) { var event = this._event; var zip = new Zip(file.path); @@ -177,19 +177,11 @@ Form.prototype.importIcons = function (file, form, callback) { if (iconsEntry) { var iconPath = path.join(new api.Icon(event._id).getBasePath(), form._id.toString()) + path.sep; - // Extract all entries within form/icons/ - zip.getEntries().forEach(function (entry) { - if (entry.entryName.startsWith('form/icons/') && !entry.isDirectory) { - var relativePath = entry.entryName.substring('form/icons/'.length); - var targetDir = path.join(iconPath, path.dirname(relativePath)); - var fileName = path.basename(relativePath); - zip.extractEntryTo(entry, targetDir, false, true, false, fileName); - } - }); + zip.extractEntryTo(iconsEntry, iconPath, false, false); // for each file in each directory var walker = walk.walk(iconPath); - walker.on("file", function (filePath, stat, next) { + walker.on("file", function(filePath, stat, next) { var primary = null; var variant = null; var regex = new RegExp(iconPath + path.sep + "+(.*)"); @@ -201,11 +193,11 @@ Form.prototype.importIcons = function (file, form, callback) { variant = variants.shift(); } - new api.Icon(event._id, form._id, primary, variant).add({ name: stat.name }, function (err) { + new api.Icon(event._id, form._id, primary, variant).add({name: stat.name}, function(err) { next(err); }); }); - walker.on("end", function () { + walker.on("end", function() { callback(null); }); } else { @@ -270,7 +262,7 @@ function cleanForm(form) { return form.userFields.includes(field.name); }); - form.userFields = [...userFields.reduce((fields, field) => { + form.userFields = [...userFields.reduce((fields, field) => { if (form.userFields.includes(field.name)) { fields.add(fieldName(field.id)); } diff --git a/service/src/api/observation.js b/service/src/api/observation.js index 536be1046..bc212611b 100644 --- a/service/src/api/observation.js +++ b/service/src/api/observation.js @@ -1,9 +1,9 @@ -const async = require("async"), - log = require("winston"), - ObservationEvents = require("./events/observation.js"), - FieldFactory = require("./field"), - ObservationModel = require("../models/observation"), - Attachment = require("./attachment"); +const async = require('async') + , log = require('winston') + , ObservationEvents = require('./events/observation.js') + , FieldFactory = require('./field') + , ObservationModel = require('../models/observation') + , Attachment = require('./attachment'); const fieldFactory = new FieldFactory(); @@ -16,30 +16,26 @@ function Observation(event, user, deviceId) { const EventEmitter = new ObservationEvents(); Observation.on = EventEmitter; -Observation.prototype.getAll = function (options, callback) { +Observation.prototype.getAll = function(options, callback) { const event = this._event; const filter = options.filter; if (filter && filter.geometries) { let allObservations = []; async.each( filter.geometries, - function (geometry, done) { + function(geometry, done) { options.filter.geometry = geometry; - ObservationModel.getObservations( - event, - options, - function (err, observations) { - if (err) return done(err); + ObservationModel.getObservations(event, options, function (err, observations) { + if (err) return done(err); - if (observations) { - allObservations = allObservations.concat(observations); - } - - done(); + if (observations) { + allObservations = allObservations.concat(observations); } - ); + + done(); + }); }, - function (err) { + function(err) { callback(err, allObservations); } ); @@ -48,66 +44,44 @@ Observation.prototype.getAll = function (options, callback) { } }; -Observation.prototype.getById = function (observationId, options, callback) { - if (typeof options === "function") { +Observation.prototype.getById = function(observationId, options, callback) { + if (typeof options === 'function') { callback = options; options = {}; } - ObservationModel.getObservationById( - this._event, - observationId, - options, - callback - ); + ObservationModel.getObservationById(this._event, observationId, options, callback); }; -Observation.prototype.validate = function (observation) { +Observation.prototype.validate = function(observation) { const errors = {}; - let message = ""; - - if (observation.type !== "Feature") { - errors.type = { - error: "required", - message: observation.type - ? "type is required" - : 'type must equal "Feature"', - }; - message += observation.type - ? "\u2022 type is required\n" - : '\u2022 type must equal "Feature"\n'; + let message = ''; + + if (observation.type !== 'Feature') { + errors.type = { error: 'required', message: observation.type ? 'type is required' : 'type must equal "Feature"' }; + message += observation.type ? '\u2022 type is required\n' : '\u2022 type must equal "Feature"\n' } // validate timestamp const properties = observation.properties || {}; - const timestampError = fieldFactory - .createField( - { - type: "date", - required: true, - name: "timestamp", - title: "Date", - }, - properties - ) - .validate(); + const timestampError = fieldFactory.createField({ + type: 'date', + required: true, + name: 'timestamp', + title: 'Date' + }, properties).validate(); if (timestampError) { errors.timestamp = timestampError; message += `\u2022 ${timestampError.message}\n`; } // validate geometry - const geometryError = fieldFactory - .createField( - { - type: "geometry", - required: true, - name: "geometry", - title: "Location", - }, - observation - ) - .validate(); + const geometryError = fieldFactory.createField({ + type: 'geometry', + required: true, + name: 'geometry', + title: 'Location' + }, observation).validate(); if (geometryError) { errors.geometry = geometryError; message += `\u2022 ${geometryError.message}\n`; @@ -117,23 +91,17 @@ Observation.prototype.validate = function (observation) { const formCount = formEntries.reduce((count, form) => { count[form.formId] = (count[form.formId] || 0) + 1; return count; - }, {}); + }, {}) const formDefinitions = {}; // Validate total number of forms - if ( - this._event.minObservationForms != null && - formEntries.length < this._event.minObservationForms - ) { + if (this._event.minObservationForms != null && formEntries.length < this._event.minObservationForms) { errors.minObservationForms = new Error("Insufficient number of forms"); message += `\u2022 Total number of forms in observation must be at least ${this._event.minObservationForms}\n`; } - if ( - this._event.maxObservationForms != null && - formEntries.length > this._event.maxObservationForms - ) { + if (this._event.maxObservationForms != null && formEntries.length > this._event.maxObservationForms) { errors.maxObservationForms = new Error("Exceeded maximum number of forms"); message += `\u2022 Total number of forms in observation cannot be more than ${this._event.maxObservationForms}\n`; } @@ -141,23 +109,23 @@ Observation.prototype.validate = function (observation) { // Validate forms min/max occurrences const formError = {}; this._event.forms - .filter((form) => !form.archived) - .forEach((formDefinition) => { + .filter(form => !form.archived) + .forEach(formDefinition => { formDefinitions[formDefinition._id] = formDefinition; const count = formCount[formDefinition.id] || 0; if (formDefinition.min && count < formDefinition.min) { formError[formDefinition.id] = { - error: "min", - message: `${formDefinition.name} form must be included in observation at least ${formDefinition.min} times`, - }; + error: 'min', + message: `${formDefinition.name} form must be included in observation at least ${formDefinition.min} times` + } message += `\u2022 ${formDefinition.name} form must be included in observation at least ${formDefinition.min} times\n`; - } else if (formDefinition.max && count > formDefinition.max) { + } else if (formDefinition.max && (count > formDefinition.max)) { formError[formDefinition.id] = { - error: "max", - message: `${formDefinition.name} form cannot be included in observation more than ${formDefinition.max} times`, - }; + error: 'max', + message: `${formDefinition.name} form cannot be included in observation more than ${formDefinition.max} times` + } message += `\u2022 ${formDefinition.name} form cannot be included in observation more than ${formDefinition.max} times\n`; } @@ -172,18 +140,14 @@ Observation.prototype.validate = function (observation) { // Validate form fields const formErrors = []; - formEntries.forEach((formEntry) => { - let fieldsMessage = ""; + formEntries.forEach(formEntry => { + let fieldsMessage = ''; const fieldsError = {}; formDefinitions[formEntry.formId].fields - .filter((fieldDefinition) => !fieldDefinition.archived) - .forEach((fieldDefinition) => { - const field = fieldFactory.createField( - fieldDefinition, - formEntry, - observation - ); + .filter(fieldDefinition => !fieldDefinition.archived) + .forEach(fieldDefinition => { + const field = fieldFactory.createField(fieldDefinition, formEntry, observation); const fieldError = field.validate(); if (fieldError) { @@ -200,12 +164,12 @@ Observation.prototype.validate = function (observation) { }); if (formErrors.length) { - errors.forms = formErrors; + errors.forms = formErrors } if (Object.keys(errors).length) { - const err = new Error("Invalid Observation"); - err.name = "ValidationError"; + const err = new Error('Invalid Observation'); + err.name = 'ValidationError'; err.status = 400; err.message = message; err.errors = errors; @@ -213,12 +177,12 @@ Observation.prototype.validate = function (observation) { } }; -Observation.prototype.createObservationId = function (callback) { +Observation.prototype.createObservationId = function(callback) { ObservationModel.createObservationId(callback); }; -Observation.prototype.validateObservationId = function (id, callback) { - ObservationModel.getObservationId(id, function (err, id) { +Observation.prototype.validateObservationId = function(id, callback) { + ObservationModel.getObservationId(id, function(err, id) { if (err) return callback(err); if (!id) { @@ -231,112 +195,70 @@ Observation.prototype.validateObservationId = function (id, callback) { }; // TODO create is gone, do I need to figure out if this is an observation create? -Observation.prototype.update = function (observationId, observation, callback) { +Observation.prototype.update = function(observationId, observation, callback) { if (this._user) observation.userId = this._user._id; if (this._deviceId) observation.deviceId = this._deviceId; const err = this.validate(observation); if (err) return callback(err); - ObservationModel.updateObservation( - this._event, - observationId, - observation, - (err, updatedObservation) => { - if (updatedObservation) { - EventEmitter.emit( - ObservationEvents.events.update, - updatedObservation.toObject({ event: this._event }), - this._event, - this._user - ); - - // Remove any deleted attachments from file system - /* + ObservationModel.updateObservation(this._event, observationId, observation, (err, updatedObservation) => { + if (updatedObservation) { + EventEmitter.emit(ObservationEvents.events.update, updatedObservation.toObject({event: this._event}), this._event, this._user); + + // Remove any deleted attachments from file system + /* TODO: this might not even work. observation form entries are not stored with field entry keys for attachment fields, so finding attachments based on matching form entry keys with form field names will not produce any results. */ - const { forms: formEntries = [] } = observation.properties || {}; - formEntries.forEach((formEntry) => { - const formDefinition = this._event.forms.find( - (form) => form._id === formEntry.formId - ); - Object.keys(formEntry).forEach((fieldName) => { - const fieldDefinition = formDefinition.fields.find( - (field) => field.name === fieldName - ); - if (fieldDefinition && fieldDefinition.type === "attachment") { - const attachmentsField = formEntry[fieldName] || []; - attachmentsField - .filter( - (attachmentField) => attachmentField.action === "delete" - ) - .forEach((attachmentField) => { - const attachment = observation.attachments.find( - (attachment) => - attachment._id.toString() === attachmentField.id - ); - if (attachment) { - console.info( - `deleting attachment ${attachment.id} for field ${fieldName} on observation ${observation.id}` - ); - new Attachment(this._event, observation).delete( - attachment._id, - (err) => { - log.warn( - "Error removing deleted attachment from file system", - err - ); - } - ); - } + const {forms: formEntries = []} = observation.properties || {}; + formEntries.forEach(formEntry => { + const formDefinition = this._event.forms.find(form => form._id === formEntry.formId); + Object.keys(formEntry).forEach(fieldName => { + const fieldDefinition = formDefinition.fields.find(field => field.name === fieldName); + if (fieldDefinition && fieldDefinition.type === 'attachment') { + const attachmentsField = formEntry[fieldName] || []; + attachmentsField.filter(attachmentField => attachmentField.action === 'delete').forEach(attachmentField => { + const attachment = observation.attachments.find(attachment => attachment._id.toString() === attachmentField.id); + if (attachment) { + console.info(`deleting attachment ${attachment.id} for field ${fieldName} on observation ${observation.id}`) + new Attachment(this._event, observation).delete(attachment._id, err => { + log.warn('Error removing deleted attachment from file system', err); }); - } - }); + } + }); + } }); - } - - callback(err, updatedObservation); + }); } - ); + + callback(err, updatedObservation); + }); }; -Observation.prototype.addFavorite = function (observationId, user, callback) { +Observation.prototype.addFavorite = function(observationId, user, callback) { ObservationModel.addFavorite(this._event, observationId, user, callback); }; -Observation.prototype.removeFavorite = function (observation, user, callback) { +Observation.prototype.removeFavorite = function(observation, user, callback) { ObservationModel.removeFavorite(this._event, observation, user, callback); }; -Observation.prototype.addImportant = function ( - observationId, - important, - callback -) { - ObservationModel.addImportant( - this._event, - observationId, - important, - callback - ); +Observation.prototype.addImportant = function(observationId, important, callback) { + ObservationModel.addImportant(this._event, observationId, important, callback); }; -Observation.prototype.removeImportant = function (observation, callback) { +Observation.prototype.removeImportant = function(observation, callback) { ObservationModel.removeImportant(this._event, observation, callback); }; -Observation.prototype.addState = function (observationId, state, callback) { +Observation.prototype.addState = function(observationId, state, callback) { ObservationModel.addState(this._event, observationId, state, (err, state) => { if (!err) { - if (state.name === "archive") { - EventEmitter.emit( - ObservationEvents.events.remove, - observationId, - this._event - ); + if (state.name === 'archive') { + EventEmitter.emit(ObservationEvents.events.remove, observationId, this._event); } } callback(err, state); diff --git a/service/src/app.api/observations/app.api.observations.ts b/service/src/app.api/observations/app.api.observations.ts index d2b07d717..1207b9054 100644 --- a/service/src/app.api/observations/app.api.observations.ts +++ b/service/src/app.api/observations/app.api.observations.ts @@ -19,12 +19,12 @@ export interface ObservationRequestContext extends AppReque deviceId: string observationRepository: EventScopedObservationRepository } -export interface ObservationRequest extends AppRequest> { } +export interface ObservationRequest extends AppRequest> {} export interface AllocateObservationId { (req: AllocateObservationIdRequest): Promise> } -export interface AllocateObservationIdRequest extends ObservationRequest { } +export interface AllocateObservationIdRequest extends ObservationRequest {} export interface SaveObservation { (req: SaveObservationRequest): Promise> @@ -61,8 +61,7 @@ export type ExoObservation = Omit & { @@ -125,12 +124,12 @@ export function exoObservationFor(from: ObservationAttrs, users?: { creator?: Us return { ...attrs, attachments, - user: from.userId === users.creator?.id ? exoObservationUserLiteFor(users.creator) : void (0), - state: states ? states[0] : void (0), + user: from.userId === users.creator?.id ? exoObservationUserLiteFor(users.creator) : void(0), + state: states ? states[0] : void(0), important: from.important ? { ...from.important, - user: from.important.userId === users.importantFlagger?.id ? exoObservationUserLiteFor(users.importantFlagger) : void (0) - } : void (0) + user: from.important.userId === users.importantFlagger?.id ? exoObservationUserLiteFor(users.importantFlagger) : void(0) + } : void(0) } } @@ -161,7 +160,7 @@ export function exoAttachmentForThumbnailDimension(targetDimension: number, atta } export function exoObservationUserLiteFor(from: User | null | undefined): ExoObservationUserLite | undefined { - return from ? { id: from.id, displayName: from.displayName } : void (0) + return from ? { id: from.id, displayName: from.displayName } : void(0) } export function domainObservationFor(from: ExoObservation): ObservationAttrs { diff --git a/service/src/app.impl/observations/app.impl.observations.ts b/service/src/app.impl/observations/app.impl.observations.ts index a335532f7..d2a184f36 100644 --- a/service/src/app.impl/observations/app.impl.observations.ts +++ b/service/src/app.impl/observations/app.impl.observations.ts @@ -23,14 +23,14 @@ export function SaveObservation(permissionService: api.ObservationPermissionServ return async function saveObservation(req: api.SaveObservationRequest): ReturnType { const repo = req.context.observationRepository const mod = req.observation - const existingObservation = await repo.findById(mod.id) - const denied = existingObservation ? - await permissionService.ensureUpdateObservationPermission(req.context) : - await permissionService.ensureCreateObservationPermission(req.context) + const before = await repo.findById(mod.id) + const denied = before ? + await permissionService.ensureUpdateObservationPermission(req.context) : + await permissionService.ensureCreateObservationPermission(req.context) if (denied) { return AppResponse.error(denied) } - const obs = await prepareObservationMod(mod, existingObservation, req.context) + const obs = await prepareObservationMod(mod, before, req.context) if (obs instanceof MageError) { return AppResponse.error(obs) } @@ -111,11 +111,11 @@ export function ReadAttachmentContent(permissionService: api.ObservationPermissi return AppResponse.error(entityNotFound(req.attachmentId, 'Attachment')) } const contentRange = typeof req.contentRange?.start === 'number' && typeof req.contentRange.end === 'number' ? - { start: req.contentRange.start, end: req.contentRange.end } : void (0) + { start: req.contentRange.start, end: req.contentRange.end } : void(0) let contentStream: NodeJS.ReadableStream | null | AttachmentStoreError = null let exoAttachment: api.ExoAttachment = api.exoAttachmentFor(attachment) if (typeof req.minDimension === 'number') { - const thumbIndex = thumbnailIndexForTargetDimension(req.minDimension, attachment) + const thumbIndex = thumbnailIndexForTargetDimension(req.minDimension, attachment) const thumb = attachment.thumbnails[Number(thumbIndex)] if (thumb) { contentStream = await attachmentStore.readThumbnailContent(thumb.minDimension, attachment.id, obs) @@ -138,7 +138,7 @@ export function ReadAttachmentContent(permissionService: api.ObservationPermissi return AppResponse.success({ attachment: exoAttachment, bytes: contentStream, - bytesRange: typeof req.minDimension === 'number' ? void (0) : contentRange + bytesRange: typeof req.minDimension === 'number' ? void(0) : contentRange }) } } @@ -169,20 +169,20 @@ export function registerDeleteRemovedAttachmentsHandler(domainEvents: EventEmitt * an `isPending` property. That should be reasonable to implement, but no * time now, as usual. */ -async function prepareObservationMod(mod: api.ExoObservationMod, observationToUpdate: Observation | null, context: api.ObservationRequestContext): Promise { +async function prepareObservationMod(mod: api.ExoObservationMod, before: Observation | null, context: api.ObservationRequestContext): Promise { const event = context.mageEvent const repo = context.observationRepository - const modAttrs = baseObservationAttrsForMod(mod, observationToUpdate, context) + const modAttrs = baseObservationAttrsForMod(mod, before, context) // first get new form entry ids so new attachments have a proper id to reference - const [removedFormEntries, newFormEntries] = mod.properties.forms.reduce(([removed, added], entryMod) => { - if (entryMod.id && observationToUpdate?.formEntryForId(entryMod.id)) { + const [ removedFormEntries, newFormEntries ] = mod.properties.forms.reduce(([ removed, added ], entryMod ) => { + if (entryMod.id && before?.formEntryForId(entryMod.id)) { removed.delete(entryMod.id) } else { added.push(entryMod) } - return [removed, added] - }, [new Map(observationToUpdate?.formEntries.map(x => [x.id, x]) || []), [] as api.ExoFormEntryMod[]]) + return [ removed, added ] + }, [ new Map(before?.formEntries.map(x => [ x.id, x ]) || []), [] as api.ExoFormEntryMod[] ]) const newFormEntryIds = newFormEntries.length ? await repo.nextFormEntryIds(newFormEntries.length) : [] newFormEntries.forEach(x => x.id = newFormEntryIds.shift()) const attachmentExtraction = extractAttachmentModsFromFormEntries(mod, event) @@ -190,12 +190,12 @@ async function prepareObservationMod(mod: api.ExoObservationMod, observationToUp const attachmentMods = attachmentExtraction.attachmentMods const addCount = attachmentMods.reduce((count, x) => x.action === api.AttachmentModAction.Add ? count + 1 : count, 0) const attachmentIds = addCount ? await repo.nextAttachmentIds(addCount) : [] - const afterRemovedFormEntryAttachments = observationToUpdate?.attachments.reduce((obs, attachment) => { + const afterRemovedFormEntryAttachments = before?.attachments.reduce((obs, attachment) => { if (removedFormEntries.has(attachment.observationFormId)) { return removeAttachment(obs, attachment.id) as Observation } return obs - }, observationToUpdate) + }, before) if (afterRemovedFormEntryAttachments) { modAttrs.attachments = afterRemovedFormEntryAttachments.attachments } @@ -206,17 +206,18 @@ async function prepareObservationMod(mod: api.ExoObservationMod, observationToUp if (obs instanceof MageError) { return obs } - let mod; - if (attachmentMod.action === api.AttachmentModAction.Add) { - mod = addAttachment(obs, attachmentIds.shift() as string, attachmentMod.fieldName, attachmentMod.formEntryId, attachmentCreateAttrsForMod(attachmentMod)) - } else if (attachmentMod.action === api.AttachmentModAction.Delete) { - mod = removeAttachment(obs, attachmentMod.id) - } else { - return invalidInput(`invalid attachment action: ${attachmentMod.action}`) - } + const mod = + attachmentMod.action === api.AttachmentModAction.Add ? + addAttachment(obs, attachmentIds.shift() as string, attachmentMod.fieldName, attachmentMod.formEntryId, attachmentCreateAttrsForMod(attachmentMod)) : + attachmentMod.action === api.AttachmentModAction.Delete ? + removeAttachment(obs, attachmentMod.id) : + null if (mod instanceof Observation) { return mod } + if (mod === null) { + return invalidInput(`invalid attachment action: ${attachmentMod.action}`) + } const message = `error adding attachment on observation ${obs.id}` return invalidInput(`${message}: ${String(mod)}`) }, afterFormEntriesRemoved) @@ -228,33 +229,32 @@ async function prepareObservationMod(mod: api.ExoObservationMod, observationToUp * existing observation. The result will not include form entries and * attachments, which require separate processing to resolve IDs and actions. * @param mod the modifications from an external client - * @param observationToUpdate the observation to update, or null if none exists + * @param before the observation to update, or null if none exists */ -function baseObservationAttrsForMod(mod: api.ExoObservationMod, observationToUpdate: Observation | null, context: api.ObservationRequestContext): ObservationAttrs { +function baseObservationAttrsForMod(mod: api.ExoObservationMod, before: Observation | null, context: api.ObservationRequestContext): ObservationAttrs { const attrs: ObservationAttrs = { id: mod.id, eventId: context.mageEvent.id, - userId: observationToUpdate ? observationToUpdate.userId : context.userId, - deviceId: observationToUpdate ? observationToUpdate.deviceId : context.deviceId, - createdAt: observationToUpdate ? observationToUpdate.createdAt : new Date(), + userId: before ? before.userId : context.userId, + deviceId: before ? before.deviceId : context.deviceId, + createdAt: before ? before.createdAt : new Date(), lastModified: new Date(), geometry: mod.geometry, type: 'Feature', - states: observationToUpdate ? observationToUpdate.states : [], - bbox: mod.bbox || observationToUpdate?.bbox, - favoriteUserIds: observationToUpdate?.favoriteUserIds || [], - important: observationToUpdate?.important, + states: before ? before.states : [], + bbox: mod.bbox || before?.bbox, + favoriteUserIds: before?.favoriteUserIds || [], + important: before?.important, properties: { // TODO: should timestamp be optional on the mod object? timestamp: mod.properties.timestamp, forms: [] }, attachments: [], - noGeometry: !!mod.noGeometry, } - assignFirstDefined('accuracy', attrs.properties, mod.properties, observationToUpdate?.properties) - assignFirstDefined('delta', attrs.properties, mod.properties, observationToUpdate?.properties) - assignFirstDefined('provider', attrs.properties, mod.properties, observationToUpdate?.properties) + assignFirstDefined('accuracy', attrs.properties, mod.properties, before?.properties) + assignFirstDefined('delta', attrs.properties, mod.properties, before?.properties) + assignFirstDefined('provider', attrs.properties, mod.properties, before?.properties) return attrs } @@ -295,11 +295,11 @@ function extractAttachmentModsFromFormEntries(mod: api.ExoObservationMod, event: function extractAttachmentModsFromFormEntry(formEntryMod: api.ExoFormEntryMod, event: MageEvent): { formEntry: FormEntry, attachmentMods: QualifiedAttachmentMod[] } { const attachmentMods = [] as QualifiedAttachmentMod[] const { id, formId, ...fieldEntries } = formEntryMod as Required - const formEntry = Object.entries(fieldEntries).reduce((formEntry, [fieldName, fieldEntry]) => { + const formEntry = Object.entries(fieldEntries).reduce((formEntry, [ fieldName, fieldEntry ]) => { const field = event.formFieldFor(fieldName, formId) if (field?.type === FormFieldType.Attachment) { const attachmentModEntry = (fieldEntry || []) as api.ExoAttachmentMod[] - attachmentModEntry.forEach(x => void (x.action && attachmentMods.push({ ...x, formEntryId: formEntry.id, fieldName }))) + attachmentModEntry.forEach(x => void(x.action && attachmentMods.push({ ...x, formEntryId: formEntry.id, fieldName }))) } else { // let it be invalid diff --git a/service/src/authentication/ldap.js b/service/src/authentication/ldap.js index f00fe4133..719808363 100644 --- a/service/src/authentication/ldap.js +++ b/service/src/authentication/ldap.js @@ -23,9 +23,7 @@ function configure(strategy) { groupSearchScope: strategy.settings.groupSearchScope, bindProperty: strategy.settings.bindProperty, groupDnProperty: strategy.settings.groupDnProperty - }, - usernameField: 'username', - passwordField: 'password' + } }, function (profile, done) { const username = profile[strategy.settings.profile.id ]; @@ -105,42 +103,43 @@ function initialize(strategy) { invalidCredentials: `Invalid ${strategy.title} username/password.` }; - app.post(`/auth/${strategy.name}/signin`, function authenticate(req, res, next) { - passport.authenticate(strategy.name, authenticationOptions, function (err, user, info = {}) { - if (err) return next(err); - - if (!user) { - return res.status(401).send(info.message); - } - - if (!user.active) { - return res.status(info.status || 401).send('User account is not approved, please contact your MAGE administrator to approve your account.'); - } - - if (!user.enabled) { - log.warn('Failed user login attempt: User ' + user.username + ' account is disabled.'); - return res.status(401).send('Your account has been disabled, please contact a MAGE administrator for assistance.') - } - - if (!user.authentication.authenticationConfigurationId) { - log.warn('Failed user login attempt: ' + user.authentication.type + ' is not configured'); - return res.status(401).send(user.authentication.type + ' authentication is not configured, please contact a MAGE administrator for assistance.') - } - - if (!user.authentication.authenticationConfiguration.enabled) { - log.warn('Failed user login attempt: Authentication ' + user.authentication.authenticationConfiguration.title + ' is disabled.'); - return res.status(401).send(user.authentication.authenticationConfiguration.title + ' authentication is disabled, please contact a MAGE administrator for assistance.') - } - - tokenService.generateToken(user._id.toString(), TokenAssertion.Authorized, 60 * 5) - .then(token => { - res.json({ - user: userTransformer.transform(req.user, { path: req.getRoot() }), - token: token - }); - }).catch(err => next(err)); - })(req, res, next); - } + app.post(`/auth/${strategy.name}/signin`, + function authenticate(req, res, next) { + passport.authenticate(strategy.name, authenticationOptions, function (err, user, info = {}) { + if (err) return next(err); + + if (!user) { + return res.status(401).send(info.message); + } + + if (!user.active) { + return res.status(info.status || 401).send('User account is not approved, please contact your MAGE administrator to approve your account.'); + } + + if (!user.enabled) { + log.warn('Failed user login attempt: User ' + user.username + ' account is disabled.'); + return res.status(401).send('Your account has been disabled, please contact a MAGE administrator for assistance.') + } + + if (!user.authentication.authenticationConfigurationId) { + log.warn('Failed user login attempt: ' + user.authentication.type + ' is not configured'); + return res.status(401).send(user.authentication.type + ' authentication is not configured, please contact a MAGE administrator for assistance.') + } + + if (!user.authentication.authenticationConfiguration.enabled) { + log.warn('Failed user login attempt: Authentication ' + user.authentication.authenticationConfiguration.title + ' is disabled.'); + return res.status(401).send(user.authentication.authenticationConfiguration.title + ' authentication is disabled, please contact a MAGE administrator for assistance.') + } + + tokenService.generateToken(user._id.toString(), TokenAssertion.Authorized, 60 * 5) + .then(token => { + res.json({ + user: userTransformer.transform(req.user, { path: req.getRoot() }), + token: token + }); + }).catch(err => next(err)); + })(req, res, next); + } ); }; diff --git a/service/src/docs/openapi.yaml b/service/src/docs/openapi.yaml index a74c2e09a..0599bce2b 100644 --- a/service/src/docs/openapi.yaml +++ b/service/src/docs/openapi.yaml @@ -1,9 +1,9 @@ openapi: 3.0.1 info: - title: Mage API - description: Mage API + title: MAGE API + description: MAGE API contact: - name: Mage Support + name: MAGE Support email: mage@nga.mil license: name: Apache 2.0 @@ -174,7 +174,7 @@ paths: schema: { $ref: '#/components/schemas/DeviceIn' } responses: 200: - description: Successful device authorization, Mage api token is returned. + description: Successful device authorization, MAGE api token is returned. 401: description: User is not authorized. Typically this means you need to authenticate `/auth/local/signin`. 403: @@ -275,7 +275,7 @@ paths: be inactive and an admin must activate the user later. Additionally, the `roleId` key is required when the requesting user is an admin. Otherwise, the created user receives a default role. When the request - body contains `multipart/form-data`, Mage will handle the `icon` and/or + body contains `multipart/form-data`, MAGE will handle the `icon` and/or `avatar` file form parameters. The server only sets the user's map icon if the requesting user has the `CREATE_USER` permission. operationId: createUser @@ -777,7 +777,7 @@ paths: - in: query name: omit_event_teams description: > - Whether to omit the event's implicit team that Mage automatically + Whether to omit the event's implicit team that MAGE automatically creates for adding individual users to an event. schema: type: boolean @@ -949,7 +949,7 @@ paths: operationId: createEvent description: > Create a new event. The requesting user must have `CREATE_EVENT` - permission. Mage assigns the requesting user to the event's ACL with + permission. MAGE assigns the requesting user to the event's ACL with the `OWNER` role. Creating a new event implicitly creates a team coupled to the event by the team's `teamEventId` property. One can add users to this team to allow access to the event on an individual @@ -973,7 +973,7 @@ paths: get: tags: [ Event ] description: > - Get all of the Mage server's events. The requesting user must have + Get all of the MAGE server's events. The requesting user must have `READ_EVENT_ALL` permission and an ACL entry on the even with `read` permission. operationId: getEvents @@ -1170,8 +1170,8 @@ paths: The `` and `` directory components above are named after the choice values of the form's primary and variant select fields, respectively. Each `primary_x/variant_x` directory - contains the map icon image that Mage clients will use to represent - observations with those values on a map. Mage clients will use the + contains the map icon image that MAGE clients will use to represent + observations with those values on a map. MAGE clients will use the form's default icon image to represent primary/variant combinations that are not present in the `icons` directory. The requesting user must have `READ_EVENT_ALL` permission and an ACL entry with `read` @@ -1535,7 +1535,7 @@ paths: description: > The `populate` parameter is a comma-separated list of keys in the returned team documents to populate with their referenced documents. - When the value of `populate` includes `users`, Mage will populate + When the value of `populate` includes `users`, MAGE will populate the returned team documents with the user documents they reference, replacing the `userIds` key in each team document with `users`. schema: @@ -1545,7 +1545,7 @@ paths: - in: query name: omit_event_teams description: > - Whether to omit the event's implicit team that Mage automatically + Whether to omit the event's implicit team that MAGE automatically creates for adding individual users to an event. schema: type: boolean @@ -2950,10 +2950,10 @@ paths: tags: [ Export ] operationId: export description: > - Export Mage data (GeoJSON, KML, GeoPackage, CSV) in the background. The requesting user must have + Export MAGE data (GeoJSON, KML, GeoPackage, CSV) in the background. The requesting user must have `READ_OBSERVATION_ALL` permission or `READ_OBSERVATION_EVENT` or an ACL entry in the event with `read`. - summary: Export Mage data using a background task. + summary: Export MAGE data using a background task. requestBody: content: application/json: @@ -3019,7 +3019,7 @@ components: mageToken: type: http description: > - Mage generates an API token when a client authenticates + MAGE generates an API token when a client authenticates initially. The client can use the token for subsequent requests until it expires. scheme: bearer @@ -3106,7 +3106,7 @@ components: UserRef: description: > `UserRef` is an object that references an existing user document with - the required `id` property. Mage ignores any properties other than + the required `id` property. MAGE ignores any properties other than `id`. type: object allOf: @@ -3318,7 +3318,7 @@ components: teamEventId: $ref: '#/components/schemas/Event/properties/id' description: > - Mage adds this property to indicate that a team is the implicitly + MAGE adds this property to indicate that a team is the implicitly created team paired with an event for grouping the event's users on an individual basis. This property references the ID of the event document to which the team belongs. To add an individual @@ -3496,7 +3496,7 @@ components: type: string FormIcon: description: > - `FormIcon` documents are the meta-data about icon images that Mage + `FormIcon` documents are the meta-data about icon images that MAGE clients use to mark the location on the map display of observations with the associated form. type: object @@ -3596,9 +3596,9 @@ components: Observation: title: Observation description: > - The `Observation` is the operative concept of Mage's geospatial data + The `Observation` is the operative concept of MAGE's geospatial data collection functionality. Observation documents are the geo-tagged - form and media records that Mage users submit to the Mage server. + form and media records that MAGE users submit to the MAGE server. Observation documents are extensions of GeoJSON feature documents, so all observations have a `type` property whose value is `Feature`, as well as a `geometry` property that holds the geospatial geometry of the @@ -3695,7 +3695,7 @@ components: } ObservationFeatureProperties: description: > - This schema defines the specific keys that Mage recognizes under the + This schema defines the specific keys that MAGE recognizes under the GeoJSON feature's `properties` entry. type: object properties: diff --git a/service/src/entities/observations/entities.observations.ts b/service/src/entities/observations/entities.observations.ts index f1b43b74c..72955f2c3 100644 --- a/service/src/entities/observations/entities.observations.ts +++ b/service/src/entities/observations/entities.observations.ts @@ -31,11 +31,6 @@ export interface ObservationAttrs extends Feature ({ ...x })), - }, - noGeometry: !!from.noGeometry + } } } @@ -287,9 +281,9 @@ export class Observation implements Readonly { const updateAttachments = update.attachments.reduce((updateAttachments, att) => { return updateAttachments.set(att.id, att) }, new Map()) - const removedAttachments = target.attachments.filter(x => !updateAttachments.has(x.id)) + const removedAttachments = target.attachments.filter(x =>!updateAttachments.has(x.id)) // TODO: whatever other mods generate events that matter - const updateEvents = removedAttachments.length ? [AttachmentsRemovedDomainEvent(target, removedAttachments)] : [] as PendingObservationDomainEvent[] + const updateEvents = removedAttachments.length ? [ AttachmentsRemovedDomainEvent(target, removedAttachments) ] : [] as PendingObservationDomainEvent[] const pendingEvents = mergePendingDomainEvents(target, updateEvents) return createObservation(update, target.mageEvent, pendingEvents) } @@ -322,7 +316,6 @@ export class Observation implements Readonly { readonly properties: Readonly readonly attachments: readonly Attachment[] readonly pendingEvents: readonly PendingObservationDomainEvent[] - readonly noGeometry?: boolean constructor(...args: unknown[]) { if (args[0] !== ObservationConstructionToken) { @@ -349,13 +342,12 @@ export class Observation implements Readonly { this.type = 'Feature' this.bbox = attrs.bbox this.geometry = attrs.geometry - this.attachments = Object.freeze([...attrs.attachments]) + this.attachments = Object.freeze([ ...attrs.attachments ]) this.properties = { ...attrs.properties } - this.#formEntriesById = new Map(this.properties.forms.map(x => [x.id, x])) - this.#attachmentsById = new Map(this.attachments.map(x => [x.id, x])) + this.#formEntriesById = new Map(this.properties.forms.map(x => [ x.id, x ])) + this.#attachmentsById = new Map(this.attachments.map(x => [ x.id, x ])) this.#validation = args[3] as ObservationValidationResult this.pendingEvents = (args[4] || []) as PendingObservationDomainEvent[] - this.noGeometry = !!attrs.noGeometry } get validation(): ObservationValidationResult { @@ -402,11 +394,11 @@ export enum ObservationDomainEventType { export type PendingObservationDomainEvent = { readonly type: ObservationDomainEventType } & ( - | { - type: ObservationDomainEventType.AttachmentsRemoved - readonly removedAttachments: readonly Readonly[] - } - ) + | { + type: ObservationDomainEventType.AttachmentsRemoved + readonly removedAttachments: readonly Readonly[] + } +) // export type ObservationDomainEvent = PendingObservationDomainEvent & { @@ -436,14 +428,14 @@ export type AttachmentsRemovedDomainEvent = Extract x.id === attachmentId) const target = observation.attachments[targetPos] if (!target) { @@ -783,7 +775,7 @@ export function putAttachmentThumbnailForMinDimension(observation: Observation, */ export function thumbnailIndexForTargetDimension(targetDimension: number, attachment: Attachment): number | undefined { if (attachment.thumbnails.length === 0) { - return void (0) + return void(0) } return attachment.thumbnails.reduce((best, candidate, index) => { if (candidate.minDimension >= targetDimension && @@ -791,7 +783,7 @@ export function thumbnailIndexForTargetDimension(targetDimension: number, attach return index } return best - }, void (0)) + }, void(0)) } export class AttachmentAddError extends Error { @@ -889,7 +881,7 @@ export interface ObservationRepositoryForEvent { export type StagedAttachmentContentId = unknown export class StagedAttachmentContentRef { - constructor(readonly id: StagedAttachmentContentId) { } + constructor(readonly id: StagedAttachmentContentId) {} } export class StagedAttachmentContent extends StagedAttachmentContentRef { @@ -1065,7 +1057,7 @@ function validateObservationFormEntries(validation: ObservationValidationContext return formEntryCounts }, activeFormEntryCounts) let totalActiveFormEntryCount = 0 - for (const [formId, formEntryCount] of formEntryCounts) { + for (const [ formId, formEntryCount ] of formEntryCounts) { const form = mageEvent.formFor(formId)! if (typeof form.min === 'number' && formEntryCount < form.min) { validation.addFormCountError(FormCountError.tooFewEntriesForForm(form)) @@ -1192,7 +1184,7 @@ function validateFormFieldEntries(formEntry: FormEntry, form: Form, formEntryErr if (resultEntry instanceof FormFieldValidationError) { formEntryError.addFieldError(resultEntry) } - else if (resultEntry !== void (0)) { + else if (resultEntry !== void(0)) { formEntry[field.name] = resultEntry } }) @@ -1211,8 +1203,8 @@ class ObservationValidationContext { constructor(from: ObservationValidationContext) constructor(observationAttrs: ObservationAttrs, mageEvent: MageEvent) - constructor(...args: [from: ObservationValidationContext] | [attrs: ObservationAttrs, mageEvent: MageEvent]) { - const [fromOrAttrs, maybeMageEvent] = args + constructor(...args: [ from: ObservationValidationContext ] | [ attrs: ObservationAttrs, mageEvent: MageEvent ]) { + const [ fromOrAttrs, maybeMageEvent ] = args if (fromOrAttrs instanceof ObservationValidationContext) { this.observationAttrs = fromOrAttrs.observationAttrs this.mageEvent = fromOrAttrs.mageEvent @@ -1311,13 +1303,13 @@ function AttachmentsRemovedDomainEvent(observation: Observation, removedAttachme function mergePendingDomainEvents(from: Observation, nextEvents: PendingObservationDomainEvent[]): PendingObservationDomainEvent[] { const removedAttachments = [] as Readonly[] - const merged = [...from.pendingEvents, ...nextEvents].reduce((merged, e) => { + const merged = [ ...from.pendingEvents, ...nextEvents ].reduce((merged, e) => { if (e.type === ObservationDomainEventType.AttachmentsRemoved) { removedAttachments.push(...e.removedAttachments) return merged } else { - return [...merged, e] + return [ ...merged, e ] } }, [] as PendingObservationDomainEvent[]) if (removedAttachments.length) { diff --git a/service/src/export/csv.ts b/service/src/export/csv.ts index d45887098..8df82aebd 100644 --- a/service/src/export/csv.ts +++ b/service/src/export/csv.ts @@ -3,15 +3,16 @@ import async from 'async' import archiver from 'archiver' import path from 'path' +import { AllGeoJSON } from '@turf/helpers' import { Exporter } from './exporter' -import { centroid as turfCenteroid } from '@turf/centroid' +import turfCentroid from '@turf/centroid' import * as User from '../models/user' import * as Device from '../models/device' import * as json2csv from 'json2csv' const mgrs = require('mgrs') const log = require('winston') const wkx = require('wkx') -import { attachmentBaseDirectory as attachmentBase } from '../environment/env' +import { attachmentBaseDirectory as attachmentBase } from '../environment/env' import stream from 'stream' import { ObservationDocument } from '../models/observation' import { UserDocument } from '../adapters/users/adapters.users.db.mongoose' @@ -91,7 +92,7 @@ export class Csv extends Exporter { }); }, (done): void => { - if (!this._filter.exportLocations) { + if (!this._filter.exportLocations){ return done(); } const asyncParser = new json2csv.AsyncParser({ fields: locationFields }, { readableObjectMode: true, writableObjectMode: true }); @@ -160,7 +161,7 @@ export class Csv extends Exporter { flat.device = cache.device.uid; } - const centroid = turfCenteroid(observation); + const centroid = turfCentroid(observation as AllGeoJSON); flat.mgrs = mgrs.forward(centroid.geometry.coordinates); flat.shapeType = observation.geometry.type; @@ -191,7 +192,7 @@ export class Csv extends Exporter { } if (observation.attachments) { - observation.attachments.forEach((attachment) => { + observation.attachments.forEach((attachment, index) => { if (!attachment.relativePath) { // exclude attachments that are pending upload and/or not saved return @@ -220,16 +221,16 @@ export class Csv extends Exporter { stream.push(locationRecord) numLocations++ }) - .then(() => { - if (cursor) { - cursor.close - } - log.info('Successfully wrote ' + numLocations + ' locations to CSV') - log.info('done writing locations') - stream.push(null) - done() - }) - .catch(err => done(err)) + .then(() => { + if (cursor) { + cursor.close + } + log.info('Successfully wrote ' + numLocations + ' locations to CSV') + log.info('done writing locations') + stream.push(null) + done() + }) + .catch(err => done(err)) } async flattenLocation(location: UserLocationDocument, cache: { user: UserDocument | null, device: any }): Promise { diff --git a/service/src/export/geojson.ts b/service/src/export/geojson.ts index a7d9044c7..2dd4c5a84 100755 --- a/service/src/export/geojson.ts +++ b/service/src/export/geojson.ts @@ -6,7 +6,8 @@ import archiver from 'archiver' import moment from 'moment' import stream from 'stream' import path from 'path' -import { centroid as turfCentroid } from '@turf/centroid' +import turfCentroid from '@turf/centroid' +import { AllGeoJSON } from '@turf/helpers' import { Exporter } from './exporter' import { attachmentBaseDirectory as attachmentBase } from '../environment/env' import User, { UserDocument } from '../models/user' @@ -16,7 +17,7 @@ import { FormFieldType } from '../entities/events/entities.events.forms' const mgrs = require('mgrs') const logger = require('../logger') -const log = ['debug', 'info', 'warn', 'error', 'log'].reduce((log: any, methodName: string): any => { +const log = [ 'debug', 'info', 'warn', 'error', 'log' ].reduce((log: any, methodName: string): any => { const logMethod = logger[methodName] as (...args: any[]) => any return { ...log, @@ -63,7 +64,7 @@ export class GeoJson extends Exporter { } mapObservationProperties(observation: ObservationDocument, archive: archiver.Archiver): void { - const centroid = turfCentroid(observation); + const centroid = turfCentroid(observation as AllGeoJSON) const exportProperties = { ...observation.properties, id: observation._id, @@ -87,7 +88,7 @@ export class GeoJson extends Exporter { return attachment.relativePath && attachment.fieldName === field.name && String(attachment.observationFormId) === String(formEntry._id) - } + } ) const attachmentRelPaths = fieldAttachments.map(x => x.relativePath) fieldEntryHash[field.name] = attachmentRelPaths @@ -149,17 +150,17 @@ export class GeoJson extends Exporter { stream.write(data); numObservations++; }) - .then(() => { - if (cursor) { - cursor.close() - } - stream.write(']}'); - // throw in icons - archive.directory(new api.Icon(this._event.id).getBasePath(), 'mage-export/icons', { date: new Date() }); - log.info(`wrote ${numObservations} observations`); - done(); - }) - .catch(err => done(err)); + .then(() => { + if (cursor) { + cursor.close() + } + stream.write(']}'); + // throw in icons + archive.directory(new api.Icon(this._event.id).getBasePath(), 'mage-export/icons', { date: new Date() }); + log.info(`wrote ${numObservations} observations`); + done(); + }) + .catch(err => done(err)); } streamLocations(stream: NodeJS.WritableStream, done: (err?: any) => void): void { @@ -179,14 +180,14 @@ export class GeoJson extends Exporter { stream.write(data); numLocations++; }) - .then(() => { - if (cursor) { - cursor.close(); - } - stream.write(']}'); - log.info(`wrote ${numLocations} locations`); - done(); - }) - .catch(err => done(err)); + .then(() => { + if (cursor) { + cursor.close(); + } + stream.write(']}'); + log.info(`wrote ${numLocations} locations`); + done(); + }) + .catch(err => done(err)); } } diff --git a/service/src/export/kmlWriter.ts b/service/src/export/kmlWriter.ts index 2319ce2d9..f1e6559b4 100755 --- a/service/src/export/kmlWriter.ts +++ b/service/src/export/kmlWriter.ts @@ -1,10 +1,11 @@ 'use strict'; const mgrs = require('mgrs') -import moment from 'moment' +import moment from 'moment' import path from 'path' -import { centroid as turfCentroid } from '@turf/centroid' -import { fragment } from 'xmlbuilder2' +import turfCentroid from '@turf/centroid' +import { AllGeoJSON } from '@turf/helpers' +import { fragment } from 'xmlbuilder2' import { UserDocument } from '../models/user' import { FormDocument, FormFieldDocument, MageEventDocument } from '../models/event' import { ObservationDocument, ObservationDocumentFormEntry } from '../models/observation' @@ -27,10 +28,10 @@ const defaultStyle: Required = { function requiredStyle(style: BaseFormStyle): Required { const dup = copyBaseFormStyle(style) dup.fill = style.fill || defaultStyle.fill, - dup.stroke = style.stroke || defaultStyle.stroke, - dup.fillOpacity = isNumber(style.fillOpacity) ? style.fillOpacity : defaultStyle.fillOpacity, - dup.strokeOpacity = isNumber(style.strokeOpacity) ? style.strokeOpacity : defaultStyle.strokeOpacity, - dup.strokeWidth = isNumber(style.strokeWidth) ? style.strokeWidth : defaultStyle.strokeWidth + dup.stroke = style.stroke || defaultStyle.stroke, + dup.fillOpacity = isNumber(style.fillOpacity) ? style.fillOpacity : defaultStyle.fillOpacity, + dup.strokeOpacity = isNumber(style.strokeOpacity) ? style.strokeOpacity : defaultStyle.strokeOpacity, + dup.strokeWidth = isNumber(style.strokeWidth) ? style.strokeWidth : defaultStyle.strokeWidth return dup as Required } @@ -263,7 +264,7 @@ export function generateObservationStyles(event: MageEventDocument, icons: any[] const formStyles = event.forms.map(form => { return generateFormStyles(event, form, icons.filter(icon => icon.formId === form._id)); }) - return [generateEventStyle(event, icons), ...formStyles].join('') + return [ generateEventStyle(event, icons), ...formStyles ].join('') } export function generateObservationPlacemark(observation: ObservationDocument, event: MageEvent): string { @@ -335,7 +336,7 @@ export function generateObservationPlacemark(observation: ObservationDocument, e sections.push({ title: 'GPS', properties: gpsProperties }) } - const styles = [String(event.id)] + const styles = [ String(event.id) ] if (firstFormEntry) { const form = event.formFor(firstFormEntry.formId) if (form) { @@ -405,21 +406,21 @@ export function generateKMLClose(): string { return '' } -export function generateDescription(feature: Feature, sections: any[]): { description: { $: string } } { - const centroid = turfCentroid(feature); +export function generateDescription(feature: Feature, sections: any[]): { description: { $: string }} { + const centroid = turfCentroid(feature as AllGeoJSON); const header = [{ section: [ { - span: [{ label: 'Timestamp' }, moment(feature.properties!.timestamp).utc().format('YYYY-MM-DDTHH:mm:ss') + 'Z'] + span: [ { label: 'Timestamp' }, moment(feature.properties!.timestamp).utc().format('YYYY-MM-DDTHH:mm:ss') + 'Z' ] }, { - span: [{ label: 'Latitude' }, centroid.geometry.coordinates[1]] + span: [ { label: 'Latitude' }, centroid.geometry.coordinates[1] ] }, { - span: [{ label: 'Longitude' }, centroid.geometry.coordinates[0]] + span: [ { label: 'Longitude' }, centroid.geometry.coordinates[0] ] }, { - span: [{ label: 'MGRS' }, mgrs.forward(centroid.geometry.coordinates)] + span: [ { label: 'MGRS' }, mgrs.forward(centroid.geometry.coordinates) ] } ] }] @@ -457,7 +458,7 @@ export function generateDescription(feature: Feature, sections: any[]): { descri }) } else { properties.push({ - span: [{ label: property.key }, property.value.toString()] + span: [ { label: property.key }, property.value.toString() ] }) } }); diff --git a/service/src/models/event.d.ts b/service/src/models/event.d.ts index 0918c2f30..bc1947599 100644 --- a/service/src/models/event.d.ts +++ b/service/src/models/event.d.ts @@ -53,11 +53,12 @@ export type FormFieldChoiceDocument = FormFieldChoice & mongoose.Document & { } export type TODO = any -export type Callback = (err: Error | null, result?: Result, totalCount?: number) => void +export type Callback = (err: Error | null, result?: Result) => void export declare function count(options: TODO, callback: Callback): void export declare function getEvents(options: TODO, callback: Callback): void export declare function getById(id: MageEventId, options: TODO, callback: Callback): void +export declare function filterEventsByUserId(events: MageEventDocument[], userId: string, callback: Callback): void export declare function create(event: MageEventCreateAttrs, user: Partial & Pick, callback: Callback): void export declare function addForm(eventId: MageEventId, form: any, callback: Callback): void export declare function addLayer(event: MageEventDocument, layer: any, callback: Callback): void diff --git a/service/src/models/event.js b/service/src/models/event.js index 24f3d14e9..1b0758a4a 100644 --- a/service/src/models/event.js +++ b/service/src/models/event.js @@ -76,7 +76,6 @@ const EventSchema = new Schema({ _id: { type: Number, required: true }, name: { type: String, required: true, unique: true }, description: { type: String, required: false }, - // noGeometry: { type: Boolean, default: false }, complete: { type: Boolean }, collectionName: { type: String, required: true }, teamIds: [{ type: Schema.Types.ObjectId, ref: 'Team' }], @@ -111,7 +110,7 @@ EventSchema.virtual('id') async function uniqueViolationToValidationErrorHook(err, _, next) { if (err.code === 11000 || err.code === 11001) { err = new mongoose.Error.ValidationError() - err.errors = { name: { type: 'unique', message: 'Duplicate event name' } } + err.errors = { name: { type: 'unique', message: 'Duplicate event name' }} } return next(err) } @@ -316,12 +315,12 @@ exports.count = function (options, callback) { conditions['$or'] = accesses; } - Event.countDocuments(conditions, function (err, count) { + Event.count(conditions, function (err, count) { callback(err, count); }); }; -exports.getEvents = async function (options, callback) { +exports.getEvents = function (options, callback) { if (typeof options === 'function') { callback = options; options = {}; @@ -331,25 +330,6 @@ exports.getEvents = async function (options, callback) { const filter = options.filter || {}; if (filter.complete === true) query.complete = true; if (filter.complete === false) query.complete = { $ne: true }; - if (filter.searchTerm) { - const searchRegex = new RegExp(filter.searchTerm, 'i'); - query['$or'] = [ - { name: searchRegex }, - { description: searchRegex } - ]; - } - if (filter.excludeTeamId != null) { - query.teamIds = { $nin: [filter.excludeTeamId] }; - } - if (filter.teamId != null) { - query.teamIds = { ...query.teamIds, $in: filter.teamId }; - } - if (filter.excludeFeedId != null) { - query.feedIds = { $nin: [filter.excludeFeedId] }; - } - if (filter.feedId != null) { - query.feedIds = { ...query.feedIds, $in: [filter.feedId] }; - } let projection = {}; if (options.projection) { @@ -360,61 +340,47 @@ exports.getEvents = async function (options, callback) { projection.teamIds = true; } - try { - const andClauses = []; - - const buildAccessClause = async (userId) => { - if (!userId) return null; - - const teamDocs = await Team.TeamModel.find({ userIds: { $in: [userId] } }, { _id: 1 }).lean(); - const teamIdsForUser = teamDocs.map(t => t._id); - const readRoles = rolesWithPermission('read'); - const aclKey = `acl.${userId.toString()}`; - return { - $or: [ - { teamIds: { $in: teamIdsForUser } }, - { [aclKey]: { $in: readRoles } } - ] - }; - }; + Event.find(query, projection, function (err, events) { + if (err) return callback(err); - const accessUserId = options && options.access && options.access.user ? options.access.user._id : null; - const filterUserId = filter && filter.userId ? filter.userId : null; + const filters = []; - const [accessClause, filterClause] = await Promise.all([ - buildAccessClause(accessUserId), - buildAccessClause(filterUserId) - ]); + // First filter out events user cannot access + if (options.access && options.access.user) { + filters.push(function (done) { + filterEventsByUserId(events, options.access.user._id, function (err, filteredEvents) { + if (err) return done(err); - if (accessClause) andClauses.push(accessClause); - if (filterClause) andClauses.push(filterClause); - if (andClauses.length) { - if (query.$and) { - query.$and = query.$and.concat(andClauses); - } else { - query.$and = andClauses; - } + events = filteredEvents; + done(); + }); + }); } - } catch (err) { - return callback(err); - } - - const totalCount = await Event.countDocuments(query).exec(); - Event.find(query, projection, (err, events) => { - if (err) return callback(err); + // Filter again if filtering based on particular user + if (options.filter && options.filter.userId) { + filters.push(function (done) { + filterEventsByUserId(events, options.filter.userId, function (err, filteredEvents) { + if (err) return done(err); - if (options.populate) { - Event.populate(events, [{ path: 'teamIds' }, { path: 'layerIds' }], function (err, events) { - callback(err, events, totalCount); + events = filteredEvents; + done(); + }); }); - } else { - callback(null, events, totalCount); } - }) - .sort({ name: 1, _id: 1 }) - .limit(options.limit || 1000) - .skip(options.start * options.limit || 0); + + async.series(filters, function (err) { + if (err) return callback(err); + + if (options.populate) { + Event.populate(events, [{ path: 'teamIds' }, { path: 'layerIds' }], function (err, events) { + callback(err, events); + }); + } else { + callback(null, events); + } + }); + }); }; exports.getById = function (id, options, callback) { @@ -525,7 +491,7 @@ exports.update = function (id, event, options, callback) { options = {}; } - const update = ['name', 'description', 'noGeometry', 'minObservationForms', 'maxObservationForms', 'complete', 'forms'].reduce(function (o, k) { + const update = ['name', 'description', 'minObservationForms', 'maxObservationForms', 'complete', 'forms'].reduce(function(o, k) { if (Object.prototype.hasOwnProperty.call(event, k)) { o[k] = event[k]; } @@ -640,7 +606,7 @@ exports.getMembers = async function (eventId, options) { const includeTotalCount = typeof options.includeTotalCount === 'boolean' ? options.includeTotalCount : options.pageIndex === 0 if (includeTotalCount) { - page.totalCount = await User.Model.countDocuments(params); + page.totalCount = await User.Model.count(params); } return page; @@ -698,7 +664,7 @@ exports.getNonMembers = async function (eventId, options) { const includeTotalCount = typeof options.includeTotalCount === 'boolean' ? options.includeTotalCount : options.pageIndex === 0 if (includeTotalCount) { - page.totalCount = await User.Model.countDocuments(params); + page.totalCount = await User.Model.count(params); } return page; @@ -743,7 +709,7 @@ exports.getTeamsInEvent = async function (eventId, options) { }; const includeTotalCount = typeof options.includeTotalCount === 'boolean' ? options.includeTotalCount : options.pageIndex === 0 if (includeTotalCount) { - page.totalCount = await Team.TeamModel.countDocuments(params); + page.totalCount = await Team.TeamModel.count(params); } return page; }; @@ -781,7 +747,7 @@ exports.getTeamsNotInEvent = async function (eventId, options) { const includeTotalCount = typeof options.includeTotalCount === 'boolean' ? options.includeTotalCount : options.pageIndex === 0 if (includeTotalCount) { - page.totalCount = await Team.TeamModel.countDocuments(params); + page.totalCount = await Team.TeamModel.count(params); } return page; diff --git a/service/src/models/observation.d.ts b/service/src/models/observation.d.ts index dbaa507cf..0297c2ef7 100644 --- a/service/src/models/observation.d.ts +++ b/service/src/models/observation.d.ts @@ -14,7 +14,7 @@ export type ObservationDocument = Omit & Omit { } +export interface ObservationModel extends mongoose.Model {} export type ObservationDocumentJson = Omit & { id: mongoose.Types.ObjectId eventId?: number diff --git a/service/src/models/team.js b/service/src/models/team.js index 5fb35c352..72cfedcef 100644 --- a/service/src/models/team.js +++ b/service/src/models/team.js @@ -65,23 +65,6 @@ TeamSchema.pre('remove', function(next) { Event.removeTeamFromEvents(team, next); }); -TeamSchema.pre('save', function(next) { - var team = this; - Team.findOne({ name: new RegExp('^' + team.name + '$', 'i') }, function (err, possibleDuplicate) { - if (err) { - return next(err); - } - - if (possibleDuplicate && !possibleDuplicate._id.equals(team._id)) { - const error = new Error('Team already exists'); - error.status = 409; - return next(error); - } - - next(); - }) -}) - function transform(team, ret, options) { ret.id = ret._id; delete ret._id; @@ -377,8 +360,7 @@ exports.getTeams = async function(options, callback) { } } - const sortoptions = options.sort ? JSON.parse(options.sort) : { _id: 1 }; - let baseQuery = Team.find(conditions).collation({ locale: 'en', strength: 2 }).sort(sortoptions); + let baseQuery = Team.find(conditions).sort('_id'); if (options.populate == null || options.populate == 'true') { baseQuery = baseQuery.populate('userIds'); } diff --git a/service/src/routes/events.ts b/service/src/routes/events.ts index 97534f6e3..1b5b1e3fe 100644 --- a/service/src/routes/events.ts +++ b/service/src/routes/events.ts @@ -75,9 +75,6 @@ interface EventQueryParams { complete?: boolean userId?: string populate?: boolean - limit?: number - start?: number - includePagination?: boolean } function clearUserFieldChoicesFromFormJson(form: FormJson): FormJson { @@ -122,16 +119,16 @@ const parseForm: express.RequestHandler = function parseRequestBodyAsForm(req, r if (form.style) { const whitelistStyle = reduceStyle(form.style) as FieldChoiceStyles - const primaryField = form.fields.filter(function (field) { + const primaryField = form.fields.filter(function(field) { return field.name === form.primaryField; }).shift(); - const primaryChoices = primaryField ? primaryField.choices.map(function (item) { + const primaryChoices = primaryField ? primaryField.choices.map(function(item) { return item.title; }) : []; - const secondaryField = form.fields.filter(function (field) { + const secondaryField = form.fields.filter(function(field) { return field.name === form.variantField; }).shift(); - const secondaryChoices = secondaryField ? secondaryField.choices.map(function (choice) { + const secondaryChoices = secondaryField ? secondaryField.choices.map(function(choice) { return choice.title; }) : []; @@ -160,8 +157,8 @@ const parseForm: express.RequestHandler = function parseRequestBodyAsForm(req, r * @param style an object that could have style keys */ function reduceStyle(style: any): LineStyle { - const styleKeys: (keyof LineStyle)[] = ['fill', 'fillOpacity', 'stroke', 'strokeOpacity', 'strokeWidth'] - return styleKeys.reduce(function (result, styleKey): LineStyle { + const styleKeys: (keyof LineStyle)[] = [ 'fill', 'fillOpacity', 'stroke', 'strokeOpacity', 'strokeWidth' ] + return styleKeys.reduce(function(result, styleKey): LineStyle { if (style[styleKey] !== undefined) { result[styleKey] = style[styleKey] } @@ -185,8 +182,8 @@ function EventRoutes(app: express.Application, security: { authentication: authe '/api/events', passport.authenticate('bearer'), access.authorize(MageEventPermission.CREATE_EVENT), - function (req, res, next) { - new api.Event().createEvent(req.body, req.user, function (err: any, event: MageEventDocument) { + function(req, res, next) { + new api.Event().createEvent(req.body, req.user, function(err: any, event: MageEventDocument) { if (err) { return next(err); } @@ -203,36 +200,17 @@ function EventRoutes(app: express.Application, security: { authentication: authe function (req, res, next) { const filter = { complete: req.parameters!.complete, - teamId: req.query.teamId as string | undefined, - excludeTeamId: req.query.excludeTeamId as string | undefined, - feedId: req.query.feedId as string | undefined, - excludeFeedId: req.query.excludeFeedId as string | undefined, - searchTerm: req.query.term as string | undefined, - userId: req.query.userId as string | undefined - }; + } as any if (req.parameters!.userId) { filter.userId = req.parameters!.userId } - const pageSize = parseInt(String(req.query.page_size)) || parseInt(String(req.query.limit)) || 20 - const page = parseInt(String(req.query.page)) || parseInt(String(req.query.start)) || 0 - EventModel.getEvents({ access: req.access, filter: filter, populate: req.parameters!.populate, projection: req.parameters!.projection, limit: pageSize, start: page }, (err, events, totalCount) => { + EventModel.getEvents({access: req.access, filter: filter, populate: req.parameters!.populate, projection: req.parameters!.projection}, function(err, events) { if (err) { return next(err); } - if (req.query.includePagination) { - res.json({ - pageSize: pageSize, - page: page, - items: events!.map((event) => { - return event.toObject({ access: req.access!, projection: req.parameters!.projection }); - }), - totalCount: totalCount - }) - } else { - res.json(events!.map((event) => { - return event.toObject({ access: req.access!, projection: req.parameters!.projection }); - })); - } + res.json(events!.map(function(event) { + return event.toObject({access: req.access!, projection: req.parameters!.projection}); + })); }); } ); @@ -241,11 +219,11 @@ function EventRoutes(app: express.Application, security: { authentication: authe '/api/events/count', passport.authenticate('bearer'), determineReadAccess, - function (req, res, next) { - EventModel.count({ access: req.access }, function (err, count) { + function(req, res, next) { + EventModel.count({access: req.access}, function(err, count) { if (err) return next(err); - return res.json({ count: count }); + return res.json({count: count}); }); } ); @@ -259,11 +237,11 @@ function EventRoutes(app: express.Application, security: { authentication: authe function (req, res, next) { // TODO already queried event to check access, don't need to get it again. Just need to populate the // correct fields based on query params - EventModel.getById(req.event!._id, { access: req.access, populate: req.parameters!.populate }, function (err, event) { + EventModel.getById(req.event!._id, {access: req.access, populate: req.parameters!.populate}, function(err, event) { if (err) return next(err); if (!event) return res.sendStatus(404); - res.json(event.toObject({ access: req.access!, projection: req.parameters!.projection })); + res.json(event.toObject({access: req.access!, projection: req.parameters!.projection})); }); } ); @@ -272,12 +250,12 @@ function EventRoutes(app: express.Application, security: { authentication: authe '/api/events/:eventId', passport.authenticate('bearer'), middlewareAuthorizeAccess(MageEventPermission.UPDATE_EVENT, EventAccessType.Update), - function (req, res, next) { - new api.Event(req.event).updateEvent(req.body, {}, function (err: any, event: MageEventDocument) { + function(req, res, next) { + new api.Event(req.event).updateEvent(req.body, {}, function(err: any, event: MageEventDocument) { if (err) { return next(err); } - new api.Form(event).populateUserFields(function (err: any) { + new api.Form(event).populateUserFields(function(err: any) { if (err) { return next(err); } @@ -291,8 +269,8 @@ function EventRoutes(app: express.Application, security: { authentication: authe '/api/events/:eventId', passport.authenticate('bearer'), middlewareAuthorizeAccess(MageEventPermission.DELETE_EVENT, EventAccessType.Delete), - function (req, res, next) { - new api.Event(req.event).deleteEvent(function (err: any) { + function(req, res, next) { + new api.Event(req.event).deleteEvent(function(err: any) { if (err) return next(err); res.status(204).send(); }); @@ -304,7 +282,7 @@ function EventRoutes(app: express.Application, security: { authentication: authe passport.authenticate('bearer'), middlewareAuthorizeAccess(MageEventPermission.UPDATE_EVENT, EventAccessType.Update), upload.single('form'), - function (req, res, next) { + function(req, res, next) { if (!req.is('multipart/form-data')) { return next(); @@ -317,13 +295,13 @@ function EventRoutes(app: express.Application, security: { authentication: authe function updateEvent(form: FormDocument, callback: any): void { form.name = req.param('name'); form.color = req.param('color'); - new api.Event(req.event).addForm(form, function (err: any, form: FormDocument) { + new api.Event(req.event).addForm(form, function(err: any, form: FormDocument) { callback(err, form); }); } function importIcons(form: FormDocument, callback: any): void { - new api.Form(req.event).importIcons(req.file, form, function (err: any) { + new api.Form(req.event).importIcons(req.file, form, function(err: any) { callback(err, form); }); } @@ -346,23 +324,23 @@ function EventRoutes(app: express.Application, security: { authentication: authe passport.authenticate('bearer'), middlewareAuthorizeAccess(MageEventPermission.UPDATE_EVENT, EventAccessType.Update), parseForm, - function (req, res, next) { + function(req, res, next) { const form = req.form; - new api.Event(req.event).addForm(form, function (err: any, form: FormDocument) { + new api.Event(req.event).addForm(form, function(err: any, form: FormDocument) { if (err) return next(err); async.parallel([ - function (done: any): void { - new api.Icon(req.event!._id, form._id).saveDefaultIconToEventForm(function (err: any) { + function(done: any): void { + new api.Icon(req.event!._id, form._id).saveDefaultIconToEventForm(function(err: any) { done(err); }); }, - function (done: any): void { - new api.Form(req.event, form).populateUserFields(function (err: any) { + function(done: any): void { + new api.Form(req.event, form).populateUserFields(function(err: any) { done(err); }); } - ], function (err: any): void { + ], function(err: any): void { if (err) return next(err); res.status(201).json(form.toJSON()); }); @@ -375,14 +353,14 @@ function EventRoutes(app: express.Application, security: { authentication: authe passport.authenticate('bearer'), middlewareAuthorizeAccess(MageEventPermission.UPDATE_EVENT, EventAccessType.Update), parseForm, - function (req, res, next) { + function(req, res, next) { const form = req.form as any form._id = parseInt(req.params.formId) - new api.Event(req.event).updateForm(form, function (err: any, form: any) { + new api.Event(req.event).updateForm(form, function(err: any, form: any) { if (err) { return next(err); } - new api.Form(req.event, form).populateUserFields(function (err: any) { + new api.Form(req.event, form).populateUserFields(function(err: any) { if (err) { return next(err); } @@ -398,8 +376,8 @@ function EventRoutes(app: express.Application, security: { authentication: authe '/api/events/:eventId/:formId/form.zip', passport.authenticate('bearer'), middlewareAuthorizeAccess(MageEventPermission.READ_EVENT_ALL, EventAccessType.Read), - function (req, res, next) { - new api.Form(req.event).export(parseInt(req.params.formId, 10), function (err: any, form: any) { + function(req, res, next) { + new api.Form(req.event).export(parseInt(req.params.formId, 10), function(err: any, form: any) { if (err) { return next(err); } @@ -413,10 +391,10 @@ function EventRoutes(app: express.Application, security: { authentication: authe '/api/events/:eventId/form/icons.zip', passport.authenticate('bearer'), middlewareAuthorizeAccess(MageEventPermission.READ_EVENT_ALL, EventAccessType.Read), - function (req, res) { - new api.Icon(req.event!._id).getZipPath(function (err: any, zipPath: string) { - res.on('finish', function () { - fs.remove(zipPath, function () { + function(req, res) { + new api.Icon(req.event!._id).getZipPath(function(err: any, zipPath: string) { + res.on('finish', function() { + fs.remove(zipPath, function() { console.log('Deleted the temp icon zip %s', zipPath); }); }); @@ -431,7 +409,7 @@ function EventRoutes(app: express.Application, security: { authentication: authe '/api/events/:eventId/form/icons*', passport.authenticate('bearer'), middlewareAuthorizeAccess(MageEventPermission.READ_EVENT_ALL, EventAccessType.Read), - function (req, res) { + function(req, res) { res.sendFile(api.Icon.defaultIconPath); } ); @@ -440,12 +418,12 @@ function EventRoutes(app: express.Application, security: { authentication: authe '/api/events/:eventId/icons/:formId.json', passport.authenticate('bearer'), middlewareAuthorizeAccess(MageEventPermission.READ_EVENT_ALL, EventAccessType.Read), - function (req, res, next) { - new api.Icon(req.event!._id, req.params.formId).getIcons(function (err: any, icons: any) { + function(req, res, next) { + new api.Icon(req.event!._id, req.params.formId).getIcons(function(err: any, icons: any) { if (err) { return next(); } - async.map(icons, function (icon: any, done: any) { + async.map(icons, function(icon: any, done: any) { fs.readFile(icon.path, async (err, data) => { if (err) { return done(err); @@ -465,12 +443,12 @@ function EventRoutes(app: express.Application, security: { authentication: authe }); }); }, - function (err: any, icons: any) { - if (err) { - return next(err); - } - res.json(icons); - }); + function(err: any, icons: any) { + if (err) { + return next(err); + } + res.json(icons); + }); }); } ); @@ -482,8 +460,8 @@ function EventRoutes(app: express.Application, security: { authentication: authe passport.authenticate('bearer'), middlewareAuthorizeAccess(MageEventPermission.UPDATE_EVENT, EventAccessType.Update), upload.single('icon'), - function (req, res, next) { - new api.Icon(req.event!._id, req.params.formId, req.params.primary, req.params.variant).create(req.file, function (err: any, icon: any) { + function(req, res, next) { + new api.Icon(req.event!._id, req.params.formId, req.params.primary, req.params.variant).create(req.file, function(err: any, icon: any) { if (err) { return next(err); } @@ -497,16 +475,16 @@ function EventRoutes(app: express.Application, security: { authentication: authe '/api/events/:eventId/icons/:formId?/:primary?/:variant?', passport.authenticate('bearer'), middlewareAuthorizeAccess(MageEventPermission.READ_EVENT_ALL, EventAccessType.Read), - function (req, res, next) { - new api.Icon(req.event!._id, req.params.formId, req.params.primary, req.params.variant).getIcon(function (err: any, icon: any) { + function(req, res, next) { + new api.Icon(req.event!._id, req.params.formId, req.params.primary, req.params.variant).getIcon(function(err: any, icon: any) { if (err || !icon) { return next(); } res.format({ - 'image/*': function () { + 'image/*': function() { res.sendFile(icon.path); }, - 'application/json': function () { + 'application/json': function() { fs.readFile(icon.path, async (err: any, data) => { if (err) { return next(err); @@ -531,8 +509,8 @@ function EventRoutes(app: express.Application, security: { authentication: authe '/api/events/:eventId/icons/:formId?/:primary?/:variant?', passport.authenticate('bearer'), middlewareAuthorizeAccess(MageEventPermission.UPDATE_EVENT, EventAccessType.Update), - function (req, res, next) { - new api.Icon(req.event!._id, req.params.formId, req.params.primary, req.params.variant).delete(function (err: any) { + function(req, res, next) { + new api.Icon(req.event!._id, req.params.formId, req.params.primary, req.params.variant).delete(function(err: any) { if (err) return next(err); return res.status(204).send(); @@ -544,8 +522,8 @@ function EventRoutes(app: express.Application, security: { authentication: authe '/api/events/:eventId/layers', passport.authenticate('bearer'), middlewareAuthorizeAccess(MageEventPermission.UPDATE_EVENT, EventAccessType.Update), - function (req, res, next) { - EventModel.addLayer(req.event!, req.body, function (err: any, event?: MageEventDocument) { + function(req, res, next) { + EventModel.addLayer(req.event!, req.body, function(err: any, event?: MageEventDocument) { if (err) { return next(err); } @@ -558,8 +536,8 @@ function EventRoutes(app: express.Application, security: { authentication: authe '/api/events/:eventId/layers/:id', passport.authenticate('bearer'), middlewareAuthorizeAccess(MageEventPermission.UPDATE_EVENT, EventAccessType.Update), - function (req, res, next) { - EventModel.removeLayer(req.event!, { id: req.params.id }, function (err: any, event?: MageEventDocument) { + function(req, res, next) { + EventModel.removeLayer(req.event!, {id: req.params.id}, function(err: any, event?: MageEventDocument) { if (err) { return next(err); } @@ -574,11 +552,11 @@ function EventRoutes(app: express.Application, security: { authentication: authe middlewareAuthorizeAccess(MageEventPermission.READ_EVENT_ALL, EventAccessType.Read), determineReadAccess, function (req, res, next) { - EventModel.getUsers(req.event!._id, function (err, users) { + EventModel.getUsers(req.event!._id, function(err, users) { if (err) { return next(err); } - users = userTransformer.transform(users, { path: req.getRoot() }); + users = userTransformer.transform(users, {path: req.getRoot()}); res.json(users); }); } @@ -588,8 +566,8 @@ function EventRoutes(app: express.Application, security: { authentication: authe '/api/events/:eventId/teams', passport.authenticate('bearer'), middlewareAuthorizeAccess(MageEventPermission.UPDATE_EVENT, EventAccessType.Update), - function (req, res, next) { - EventModel.addTeam(req.event!, req.body, function (err, event) { + function(req, res, next) { + EventModel.addTeam(req.event!, req.body, function(err, event) { if (err) { return next(err); } @@ -602,8 +580,8 @@ function EventRoutes(app: express.Application, security: { authentication: authe '/api/events/:eventId/teams/:teamId', passport.authenticate('bearer'), middlewareAuthorizeAccess(MageEventPermission.UPDATE_EVENT, EventAccessType.Update), - function (req, res, next) { - EventModel.removeTeam(req.event!, req.team, function (err, event) { + function(req, res, next) { + EventModel.removeTeam(req.event!, req.team, function(err, event) { if (err) { return next(err); } @@ -616,8 +594,8 @@ function EventRoutes(app: express.Application, security: { authentication: authe '/api/events/:eventId/acl/:targetUserId', passport.authenticate('bearer'), middlewareAuthorizeAccess(MageEventPermission.UPDATE_EVENT, EventAccessType.Update), - function (req, res, next) { - EventModel.updateUserInAcl(req.event!._id, req.params.targetUserId, req.body.role, function (err, event) { + function(req, res, next) { + EventModel.updateUserInAcl(req.event!._id, req.params.targetUserId, req.body.role, function(err, event) { if (err) { return next(err); } @@ -630,8 +608,8 @@ function EventRoutes(app: express.Application, security: { authentication: authe '/api/events/:eventId/acl/:targetUserId', passport.authenticate('bearer'), middlewareAuthorizeAccess(MageEventPermission.UPDATE_EVENT, EventAccessType.Update), - function (req, res, next) { - EventModel.removeUserFromAcl(req.event!._id, req.params.targetUserId, function (err, event) { + function(req, res, next) { + EventModel.removeUserFromAcl(req.event!._id, req.params.targetUserId, function(err, event) { if (err) { return next(err); } @@ -734,7 +712,7 @@ export = EventRoutes function parseIntOrUndefined(input: any): number | undefined { const num = parseInt(String(input)) - return Number.isNaN(num) ? void (0) : num + return Number.isNaN(num) ? void(0) : num } function teamQueryOptionsFromRequest(req: express.Request): any { diff --git a/service/src/routes/imports.js b/service/src/routes/imports.js new file mode 100644 index 000000000..ed1dfa2ba --- /dev/null +++ b/service/src/routes/imports.js @@ -0,0 +1,65 @@ +module.exports = function(app, security) { + const api = require('../api') + , access = require('../access') + , fs = require('fs-extra') + , {defaultHandler: upload} = require('../upload') + , DOMParser = require('@xmldom/xmldom').DOMParser + , toGeoJson = require('../utilities/togeojson'); + + const passport = security.authentication.passport; + + function validate(req, res, next) { + if (req.layer.type !== 'Feature') { + return res.status(400).send('Cannot import data, layer type is not "Static".'); + } + + if (!req.file) { + return res.status(400).send('Invalid file, please upload a KML file.'); + } + + fs.readFile(req.file.path, 'utf8', function (err, data) { + if (err) return next(err); + + const parser = new DOMParser(); + const kml = parser.parseFromString(data, "application/xml"); + const parseError = kml.getElementsByTagName("parsererror"); + + if (parseError.length > 0) { + console.error("KML Parsing Error:", parseError[0].textContent); + } else { + console.log("Parsed KML successfully"); + } + + if (!kml || kml.documentElement.nodeName !== 'kml') { + return res.status(400).send('Invalid file, please upload a KML file.'); + } + + req.kml = kml; + return next(); + }); + } + + app.post( + '/api/layers/:layerId/kml', + passport.authenticate('bearer'), + access.authorize('CREATE_LAYER'), + upload.single('file'), + validate, + function(req, res, next) { + const features = toGeoJson.kml(req.kml); + new api.Feature(req.layer).createFeatures(features) + .then(newFeatures => { + const response = { + files: [{ + name: Buffer.from(req.file.originalname, 'latin1').toString('utf-8'), + size: req.file.size, + features: newFeatures ? newFeatures.length : 0 + }] + }; + + res.json(response); + }) + .catch(err => next(err)); + } + ); +}; diff --git a/service/src/routes/imports.ts b/service/src/routes/imports.ts deleted file mode 100644 index 284f562b2..000000000 --- a/service/src/routes/imports.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { Express, Request, Response, NextFunction } from 'express'; -import api from '../api'; -import access from '../access'; -import { AnyPermission } from '../entities/authorization/entities.permissions' -import fs from 'fs-extra'; -import Zip from 'adm-zip'; -import { defaultHandler as upload } from '../upload'; -import { KmlFeature, kml } from '../utilities/transformKML'; - -interface SecurityConfig { - authentication: { - passport: any; - }; -} -interface LayerRequest extends Request { - layer: { - type: string; - }; - features?: any[]; - file?: Express.Multer.File; -} - -interface ImportResponse { - files: Array<{ - name: string; - size: number; - features: number; - }>; -} - -const getMimeType = (filename: string): string => { - const ext = filename.toLowerCase().split('.').pop() || ''; - const mimeTypes: { [key: string]: string } = { - 'png': 'image/png', - 'jpg': 'image/jpeg', - 'jpeg': 'image/jpeg', - 'gif': 'image/gif', - 'bmp': 'image/bmp' - }; - return mimeTypes[ext] || 'application/octet-stream'; -} - -const kmlToGeoJSON = (kmlPathname: string, isKMZ: boolean): KmlFeature[] => { - let kmlString: string; - let images: Record = {}; - - if (isKMZ) { - // TODO: Update how images are handled in KMZ files to prevent duplication. Move images to a separate directory and store their paths in the KML. - const zip = new Zip(kmlPathname); - const zipEntries = zip.getEntries(); - const kmlEntry = zipEntries.find(entry => entry.entryName.toLowerCase().endsWith('.kml')); - - if (!kmlEntry) { - throw new Error('No KML file found inside KMZ.'); - } - - zipEntries.forEach(entry => { - const entryName = entry.entryName; - try { - if (!entry.isDirectory && /\.(png|jpg|jpeg|gif|bmp)$/i.test(entryName)) { - const buffer = entry.getData(); - const base64 = buffer.toString('base64'); - const mimeType = getMimeType(entryName); - images[entryName] = `data:${mimeType};base64,${base64}`; - } - } catch (error) { - console.error(`Error processing entry ${entryName}:`, error); - } - }); - - kmlString = kmlEntry.getData().toString('utf8'); - } else { - kmlString = fs.readFileSync(kmlPathname, 'utf8'); - } - - try { - return kml(kmlString, images); - } catch (error) { - throw new Error('Failed to transform KML: ' + error); - } -} - -const validate = async (req: Request, res: Response, next: NextFunction): Promise => { - const layRequest = req as LayerRequest; - if (layRequest.layer.type !== 'Feature') { - return res.status(400).send('Cannot import data, layer type is not "Static".'); - } - - const fileExtension: string = layRequest.file?.originalname?.toLowerCase().split('.').pop() || ''; - - if (!['kml', 'kmz'].includes(fileExtension)) { - return res.status(400).send('Invalid file, please upload a KML or KMZ file.'); - } - - try { - layRequest.features = kmlToGeoJSON(layRequest.file!.path, fileExtension === 'kmz'); - } catch (err) { - return res.status(400).send('Unable to extract contents from KMZ file.' + err); - } - return next(); -} - -function importRoutes(app: Express, security: SecurityConfig): void { - const passport = security.authentication.passport; - - app.post( - '/api/layers/:layerId/kml', - passport.authenticate('bearer'), - access.authorize('CREATE_LAYER' as AnyPermission), - upload.single('file'), - validate, - (req: Request, res: Response, next: NextFunction) => { - const layerRequest = req as LayerRequest; - new api.Feature(layerRequest.layer).createFeatures(layerRequest.features) - .then((newFeatures: any[]) => { - const response: ImportResponse = { - files: [{ - name: Buffer.from(layerRequest.file!.originalname, 'latin1').toString('utf-8'), - size: layerRequest.file!.size, - features: newFeatures ? newFeatures.length : 0 - }] - }; - - res.json(response); - }) - .catch((err: Error) => next(err)); - } - ); -} - -export = importRoutes; diff --git a/service/src/routes/logins.js b/service/src/routes/logins.js index d13e4d88d..d701471e3 100644 --- a/service/src/routes/logins.js +++ b/service/src/routes/logins.js @@ -54,10 +54,6 @@ module.exports = function(app, security) { if (req.query.deviceId) { filter.deviceId = req.query.deviceId; } - if (req.query.deviceIds) { - const ids = req.query.deviceIds.split(',').map(id => id.trim()); - filter.deviceId = { $in: ids }; - } if (req.query.startDate) { filter.startDate = moment(req.query.startDate).toDate(); } diff --git a/service/src/routes/observations.js b/service/src/routes/observations.js index 9ce934ebb..a3496f64a 100644 --- a/service/src/routes/observations.js +++ b/service/src/routes/observations.js @@ -1,47 +1,40 @@ -const { - attachmentTypeIsValidForField, -} = require("../entities/events/entities.events.forms"); +const { attachmentTypeIsValidForField } = require('../entities/events/entities.events.forms'); module.exports = function (app, security) { - const async = require("async"), - api = require("../api"), - log = require("winston"), - archiver = require("archiver"), - path = require("path"), - environment = require("../environment/env"), - fs = require("fs-extra"), - moment = require("moment"), - Team = require("../models/team"), - access = require("../access"), - { default: turfCentroid } = require("@turf/centroid"), - geometryFormat = require("../format/geoJsonFormat"), - observationXform = require("../transformers/observation"), - FileType = require("file-type"), - passport = security.authentication.passport, - { - defaultEventPermissionsService: eventPermissions, - } = require("../permissions/permissions.events"); + + const async = require('async') + , api = require('../api') + , log = require('winston') + , archiver = require('archiver') + , path = require('path') + , environment = require('../environment/env') + , fs = require('fs-extra') + , moment = require('moment') + , Team = require('../models/team') + , access = require('../access') + , { default: turfCentroid } = require('@turf/centroid') + , geometryFormat = require('../format/geoJsonFormat') + , observationXform = require('../transformers/observation') + , FileType = require('file-type') + , passport = security.authentication.passport + , { defaultEventPermissionsService: eventPermissions } = require('../permissions/permissions.events'); const sortColumnWhitelist = ["lastModified"]; function transformOptions(req) { return { event: req.event, - path: req.getPath().match(/(.*observations)/)[0], + path: req.getPath().match(/(.*observations)/)[0] }; } async function validateObservationReadAccess(req, res, next) { - if (access.userHasPermission(req.user, "READ_OBSERVATION_ALL")) { + if (access.userHasPermission(req.user, 'READ_OBSERVATION_ALL')) { return next(); } - if (access.userHasPermission(req.user, "READ_OBSERVATION_EVENT")) { + if (access.userHasPermission(req.user, 'READ_OBSERVATION_EVENT')) { // Make sure I am part of this event - const hasPermission = await eventPermissions.userHasEventPermission( - req.event, - req.user.id, - "read" - ); + const hasPermission = await eventPermissions.userHasEventPermission(req.event, req.user.id, 'read') if (hasPermission) { return next(); } @@ -51,11 +44,12 @@ module.exports = function (app, security) { function validateObservationCreateAccess(validateObservationId) { return function (req, res, next) { - if (!access.userHasPermission(req.user, "CREATE_OBSERVATION")) { + + if (!access.userHasPermission(req.user, 'CREATE_OBSERVATION')) { return res.sendStatus(403); } - const tasks = []; + var tasks = []; if (validateObservationId) { tasks.push(function (done) { /* @@ -63,7 +57,7 @@ module.exports = function (app, security) { validate the id from the url path instead? the path id is the one that is passed down to the update operation */ - new api.Observation().validateObservationId(req.param("id"), done); + new api.Observation().validateObservationId(req.param('id'), done); }); } @@ -72,11 +66,7 @@ module.exports = function (app, security) { if (err) return next(err); if (teams.length === 0) { - return res - .status(403) - .send( - "Cannot submit an observation for an event that you are not part of." - ); + return res.status(403).send('Cannot submit an observation for an event that you are not part of.'); } done(); @@ -88,16 +78,12 @@ module.exports = function (app, security) { } async function validateObservationUpdateAccess(req, res, next) { - if (access.userHasPermission(req.user, "UPDATE_OBSERVATION_ALL")) { + if (access.userHasPermission(req.user, 'UPDATE_OBSERVATION_ALL')) { return next(); } - if (access.userHasPermission(req.user, "UPDATE_OBSERVATION_EVENT")) { + if (access.userHasPermission(req.user, 'UPDATE_OBSERVATION_EVENT')) { // Make sure I am part of this event - const hasPermission = await eventPermissions.userHasEventPermission( - req.event, - req.user.id, - "read" - ); + const hasPermission = await eventPermissions.userHasEventPermission(req.event, req.user.id, 'read') if (hasPermission) { return next(); } @@ -106,40 +92,21 @@ module.exports = function (app, security) { } function validateAttachmentFile(req, res, next) { - FileType.fromFile(req.file.path).then((fileType) => { - const attachment = req.observation.attachments.find( - (attachment) => attachment._id.toString() === req.params.attachmentId - ); - const observationForm = req.observation.properties.forms.find( - (observationForm) => { - return ( - observationForm._id.toString() === - attachment.observationFormId.toString() - ); - } - ); + FileType.fromFile(req.file.path).then(fileType => { + const attachment = req.observation.attachments.find(attachment => attachment._id.toString() === req.params.attachmentId); + const observationForm = req.observation.properties.forms.find(observationForm => { + return observationForm._id.toString() === attachment.observationFormId.toString() + }); if (!observationForm) { - return res.status(400).send("Attachment form not found"); + return res.status(400).send('Attachment form not found'); } - const formDefinition = req.event.forms.find( - (form) => form._id === observationForm.formId - ); - const fieldDefinition = formDefinition.fields.find( - (field) => field.name === attachment.fieldName - ); + const formDefinition = req.event.forms.find(form => form._id === observationForm.formId); + const fieldDefinition = formDefinition.fields.find(field => field.name === attachment.fieldName); if (!fieldDefinition) { - return res.status(400).send("Attachment field not found"); + return res.status(400).send('Attachment field not found'); } if (!attachmentTypeIsValidForField(fieldDefinition, fileType.mime)) { - return res - .status(400) - .send( - `Invalid attachment '${ - attachment.name - }', type must be one of ${fieldDefinition.allowedAttachmentTypes.join( - " or " - )}` - ); + return res.status(400).send(`Invalid attachment '${attachment.name}', type must be one of ${fieldDefinition.allowedAttachmentTypes.join(' or ')}`); } next(); }); @@ -150,11 +117,7 @@ module.exports = function (app, security) { if (access.userHasPermission(req.user, collectionPermission)) { return next(); } - const hasPermission = await eventPermissions.userHasEventPermission( - req.event, - req.user.id, - aclPermission - ); + const hasPermission = await eventPermissions.userHasEventPermission(req.event, req.user.id, aclPermission) if (hasPermission) { return next(); } @@ -163,17 +126,13 @@ module.exports = function (app, security) { } async function authorizeDeleteAccess(req, res, next) { - if (access.userHasPermission(req.user, "UPDATE_EVENT")) { + if (access.userHasPermission(req.user, 'UPDATE_EVENT')) { return next(); } if (req.user._id.toString() === req.observation.userId.toString()) { return next(); } - const hasPermission = await eventPermissions.userHasEventPermission( - req.event, - req.user.id, - "update" - ); + const hasPermission = await eventPermissions.userHasEventPermission(req.event, req.user.id, 'update') if (hasPermission) { return next(); } @@ -181,7 +140,7 @@ module.exports = function (app, security) { } function getUserForObservation(req, res, next) { - let userId = req.observation.userId; + var userId = req.observation.userId; if (!userId) return next(); new api.User().getById(userId, function (err, user) { @@ -193,26 +152,23 @@ module.exports = function (app, security) { } function getIconForObservation(req, res, next) { - let form = {}; - let primary; - let secondary; + var form = {}; + var primary; + var secondary; if (req.observation.properties.forms.length) { - let formId = req.observation.properties.forms[0].formId; - let formDefinitions = req.event.forms.filter(function (form) { + var formId = req.observation.properties.forms[0].formId; + var formDefinitions = req.event.forms.filter(function (form) { return form._id === formId; }); if (formDefinitions.length) { form = formDefinitions[0]; primary = req.observation.properties.forms[0][form.primaryField]; - secondary = req.observation.properties.forms[0][form.letiantField]; + secondary = req.observation.properties.forms[0][form.variantField]; } } - new api.Icon(req.event._id, form._id, primary, secondary).getIcon(function ( - err, - icon - ) { + new api.Icon(req.event._id, form._id, primary, secondary).getIcon(function (err, icon) { if (err) return next(err); req.observationIcon = icon; @@ -223,7 +179,8 @@ module.exports = function (app, security) { function parseQueryParams(req, res, next) { // setup defaults const parameters = { - filter: {}, + filter: { + } }; const fields = req.query.fields; @@ -243,39 +200,35 @@ module.exports = function (app, security) { const observationStartDate = req.query.observationStartDate; if (observationStartDate) { - parameters.filter.observationStartDate = moment(observationStartDate) - .utc() - .toDate(); + parameters.filter.observationStartDate = moment(observationStartDate).utc().toDate(); } const observationEndDate = req.query.observationEndDate; if (observationEndDate) { - parameters.filter.observationEndDate = moment(observationEndDate) - .utc() - .toDate(); + parameters.filter.observationEndDate = moment(observationEndDate).utc().toDate(); } const bbox = req.query.bbox; if (bbox) { - parameters.filter.geometries = geometryFormat.parse("bbox", bbox); + parameters.filter.geometries = geometryFormat.parse('bbox', bbox); } const geometry = req.query.geometry; if (geometry) { - parameters.filter.geometries = geometryFormat.parse("geometry", geometry); + parameters.filter.geometries = geometryFormat.parse('geometry', geometry); } const states = req.query.states; if (states) { - parameters.filter.states = states.split(","); + parameters.filter.states = states.split(','); } const sort = req.query.sort; if (sort) { const columns = {}; let err = null; - sort.split(",").every(function (column) { - const sortParams = column.split("+"); + sort.split(',').every(function (column) { + const sortParams = column.split('+'); // Check sort column is in whitelist if (sortColumnWhitelist.indexOf(sortParams[0]) === -1) { err = `Cannot sort on column '${sortParams[0]}'`; @@ -283,7 +236,7 @@ module.exports = function (app, security) { } // Order can be nothing (ASC by default) or ASC, DESC let direction = 1; // ASC - if (sortParams.length > 1 && sortParams[1] === "DESC") { + if (sortParams.length > 1 && sortParams[1] === 'DESC') { direction = -1; // DESC } columns[sortParams[0]] = direction; @@ -294,7 +247,7 @@ module.exports = function (app, security) { parameters.sort = columns; } - parameters.populate = req.query.populate === "true"; + parameters.populate = req.query.populate === 'true'; req.parameters = parameters; @@ -302,8 +255,8 @@ module.exports = function (app, security) { } app.get( - "/api/events/:eventId/observations/(:observationId).zip", - passport.authenticate("bearer"), + '/api/events/:eventId/observations/(:observationId).zip', + passport.authenticate('bearer'), validateObservationReadAccess, getUserForObservation, getIconForObservation, @@ -319,81 +272,59 @@ module.exports = function (app, security) { formMap[form.id] = form; }); - const archive = archiver("zip"); + const archive = archiver('zip'); archive.pipe(res); - res.render( - "observation", - { - event: req.event, - formMap: formMap, - observation: req.observation, - center: turfCentroid(req.observation).geometry, - user: req.observationUser, - }, - function (err, html) { - if (!err) { - archive.append(html, { name: req.observation._id + "/index.html" }); - - if (req.observationIcon) { - const iconPath = path.join( - environment.iconBaseDirectory, - req.observationIcon.relativePath - ); - archive.file(iconPath, { - name: req.observation._id + "/media/icon.png", - }); - } - - req.observation.attachments.forEach(function (attachment) { - archive.file( - path.join( - environment.attachmentBaseDirectory, - attachment.relativePath - ), - { name: req.observation._id + "/media/" + attachment.name } - ); - }); - } else { - log.warn(err); + res.render('observation', { + event: req.event, + formMap: formMap, + observation: req.observation, + center: turfCentroid(req.observation).geometry, + user: req.observationUser + }, function (err, html) { + if (!err) { + archive.append(html, { name: req.observation._id + '/index.html' }); + + if (req.observationIcon) { + const iconPath = path.join(environment.iconBaseDirectory, req.observationIcon.relativePath); + archive.file(iconPath, { name: req.observation._id + '/media/icon.png' }); } - archive.finalize(); + req.observation.attachments.forEach(function (attachment) { + archive.file(path.join(environment.attachmentBaseDirectory, attachment.relativePath), { name: req.observation._id + '/media/' + attachment.name }); + }); + } else { + log.warn(err); } - ); + + archive.finalize(); + }); } ); app.get( - "/api/events/:eventId/observations/:observationIdInPath", - passport.authenticate("bearer"), + '/api/events/:eventId/observations/:observationIdInPath', + passport.authenticate('bearer'), validateObservationReadAccess, parseQueryParams, function (req, res, next) { const options = { fields: req.parameters.fields }; - new api.Observation(req.event).getById( - req.params.observationIdInPath, - options, - function (err, observation) { - if (err) { - return next(err); - } - if (!observation) { - return res.sendStatus(404); - } - const response = observationXform.transform( - observation, - transformOptions(req) - ); - res.json(response); + new api.Observation(req.event).getById(req.params.observationIdInPath, options, function (err, observation) { + if (err) { + return next(err); } - ); + if (!observation) { + return res.sendStatus(404); + } + const response = observationXform.transform(observation, transformOptions(req)); + res.json(response); + }); } ); app.get( - "/api/events/:eventId/observations", - passport.authenticate("bearer"), + '/api/events/:eventId/observations', + passport.authenticate('bearer'), validateObservationReadAccess, parseQueryParams, function (req, res, next) { @@ -401,24 +332,19 @@ module.exports = function (app, security) { filter: req.parameters.filter, fields: req.parameters.fields, sort: req.parameters.sort, - populate: req.parameters.populate, + populate: req.parameters.populate }; - new api.Observation(req.event).getAll( - options, - function (err, observations) { - if (err) return next(err); - res.json( - observationXform.transform(observations, transformOptions(req)) - ); - } - ); + new api.Observation(req.event).getAll(options, function (err, observations) { + if (err) return next(err); + res.json(observationXform.transform(observations, transformOptions(req))); + }); } ); app.put( - "/api/events/:eventId/observations/:observationIdInPath/favorite", - passport.authenticate("bearer"), + '/api/events/:eventId/observations/:observationIdInPath/favorite', + passport.authenticate('bearer'), /* TODO: this is a strange permission check. this is because the request modifies data, but there is a USER_NO_EDIT_ROLE role that has permission to @@ -429,118 +355,76 @@ module.exports = function (app, security) { */ validateObservationCreateAccess(false), function (req, res, next) { - new api.Observation(req.event).addFavorite( - req.params.observationIdInPath, - req.user, - function (err, updatedObservation) { - if (err) { - return next(err); - } - if (!updatedObservation) { - return res - .status(404) - .send( - `Observation with ID ${req.params.observationIdInPath} does not exist` - ); - } - const response = observationXform.transform( - updatedObservation, - transformOptions(req) - ); - res.json(response); + new api.Observation(req.event).addFavorite(req.params.observationIdInPath, req.user, function (err, updatedObservation) { + if (err) { + return next(err); + } + if (!updatedObservation) { + return res.status(404).send(`Observation with ID ${req.params.observationIdInPath} does not exist`); } - ); + const response = observationXform.transform(updatedObservation, transformOptions(req)); + res.json(response); + }); } ); app.delete( - "/api/events/:eventId/observations/:observationIdInPath/favorite", - passport.authenticate("bearer"), + '/api/events/:eventId/observations/:observationIdInPath/favorite', + passport.authenticate('bearer'), /* TODO: see above note on PUT favorite permission check */ validateObservationCreateAccess(false), function (req, res, next) { - new api.Observation(req.event).removeFavorite( - req.params.observationIdInPath, - req.user, - function (err, updatedObservation) { - if (err) return next(err); - if (!updatedObservation) - return res - .status(404) - .send( - "Observation with id " + - req.params.observationIdInPath + - " does not exist" - ); - - const response = observationXform.transform( - updatedObservation, - transformOptions(req) - ); - res.json(response); - } - ); + + new api.Observation(req.event).removeFavorite(req.params.observationIdInPath, req.user, function (err, updatedObservation) { + if (err) return next(err); + if (!updatedObservation) return res.status(404).send('Observation with id ' + req.params.observationIdInPath + " does not exist"); + + const response = observationXform.transform(updatedObservation, transformOptions(req)); + res.json(response); + }); } ); app.put( - "/api/events/:eventId/observations/:observationId/important", - passport.authenticate("bearer"), - authorizeEventAccess("UPDATE_EVENT", "update"), + '/api/events/:eventId/observations/:observationId/important', + passport.authenticate('bearer'), + authorizeEventAccess('UPDATE_EVENT', 'update'), function (req, res, next) { const important = { userId: req.user._id, timestamp: new Date(), - description: req.body.description, + description: req.body.description }; - new api.Observation(req.event).addImportant( - req.observation._id, - important, - function (err, updatedObservation) { - if (err) return next(err); - if (!updatedObservation) - return res - .status(404) - .send("Observation with id " + req.params.id + " does not exist"); - - const response = observationXform.transform( - updatedObservation, - transformOptions(req) - ); - res.json(response); - } - ); + new api.Observation(req.event).addImportant(req.observation._id, important, function (err, updatedObservation) { + if (err) return next(err); + if (!updatedObservation) return res.status(404).send('Observation with id ' + req.params.id + " does not exist"); + + const response = observationXform.transform(updatedObservation, transformOptions(req)); + res.json(response); + }); } ); app.delete( - "/api/events/:eventId/observations/:observationId/important", - passport.authenticate("bearer"), - authorizeEventAccess("UPDATE_EVENT", "update"), + '/api/events/:eventId/observations/:observationId/important', + passport.authenticate('bearer'), + authorizeEventAccess('UPDATE_EVENT', 'update'), function (req, res, next) { - new api.Observation(req.event).removeImportant( - req.observation._id, - function (err, updatedObservation) { - if (err) return next(err); - if (!updatedObservation) - return res - .status(404) - .send("Observation with id " + req.params.id + " does not exist"); - - const response = observationXform.transform( - updatedObservation, - transformOptions(req) - ); - res.json(response); - } - ); + + new api.Observation(req.event).removeImportant(req.observation._id, function (err, updatedObservation) { + if (err) return next(err); + if (!updatedObservation) return res.status(404).send('Observation with id ' + req.params.id + " does not exist"); + + const response = observationXform.transform(updatedObservation, transformOptions(req)); + res.json(response); + }); } ); app.post( - "/api/events/:eventId/observations/:observationId/states", - passport.authenticate("bearer"), + '/api/events/:eventId/observations/:observationId/states', + passport.authenticate('bearer'), authorizeDeleteAccess, function (req, res) { let state = req.body; @@ -548,29 +432,21 @@ module.exports = function (app, security) { return res.send(400); } if (!state.name) { - return res.status(400).send("name required"); + return res.status(400).send('name required'); } - if (state.name !== "active" && state.name !== "archive") { - return res - .status(400) - .send("state name must be one of 'active', 'complete', 'archive'"); + if (state.name !== 'active' && state.name !== 'archive') { + return res.status(400).send("state name must be one of 'active', 'complete', 'archive'"); } state = { name: state.name }; if (req.user) { state.userId = req.user._id; } - new api.Observation(req.event).addState( - req.observation._id, - state, - function (err, state) { - if (err) { - return res - .status(400) - .send("state is already " + "'" + state.name + "'"); - } - res.status(201).json(state); + new api.Observation(req.event).addState(req.observation._id, state, function (err, state) { + if (err) { + return res.status(400).send('state is already ' + "'" + state.name + "'"); } - ); + res.status(201).json(state); + }); } ); }; diff --git a/service/src/utilities/togeojson.js b/service/src/utilities/togeojson.js new file mode 100644 index 000000000..a305d7d94 --- /dev/null +++ b/service/src/utilities/togeojson.js @@ -0,0 +1,378 @@ +const xpath = require('xpath') + , log = require('winston'); + +exports.kml = kml; + +function kml(document) { + log.info('Generate KML'); + + const styleIndex = getStyles(document); + + // Pull all placemarks regards of depth level + let placemarks = xpath.select("//*[local-name()='Placemark']", document); + + log.info('Style index ', styleIndex); + log.info('Found ' + placemarks.length + ' placemarks in the KML document'); + + let features = []; + placemarks.forEach(placemark => { + features = features.concat(getPlacemark(placemark, styleIndex)); + }); + + return features; +} + +function getProperties(node, styleIndex) { + let properties = {}; + + let name = nodeVal(get1(node, 'name')); + if (name) properties.name = name; + + let description = nodeVal(get1(node, 'description')); + if (description) properties.description = description; + + const extendedData = get1(node, 'ExtendedData'); + if (extendedData) { + const datas = get(extendedData, 'Data'), + simpleDatas = get(extendedData, 'SimpleData'); + + for (let i = 0; i < datas.length; i++) { + properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value')); + } + + for (let i = 0; i < simpleDatas.length; i++) { + properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]); + } + } + + let styleUrl = nodeVal(get1(node, 'styleUrl')); + if (styleUrl && styleIndex[styleUrl]) { + properties.style = styleIndex[styleUrl]; + } else { + // Check if placemark has style + const styleElement = get1(node, 'Style'); + if (styleElement) { + properties.style = { + iconStyle: getIconStyle(styleElement), + lineStyle: getLineStyle(styleElement), + labelStyle: getLabelStyle(styleElement), + polyStyle: getPolygonStyle(styleElement) + }; + } + } + + return properties; +} + +function getPlacemark(node, styleIndex) { + const geometries = getGeometry(node); + if (!geometries.length) return []; + + const properties = getProperties(node, styleIndex); + + return geometries.map(geometry => { + return { + type: 'Feature', + geometry: geometry, + properties: properties + }; + }); +} + +function getGeometry(node) { + if (get1(node, 'MultiGeometry')){ + return getGeometry(get1(node, 'MultiGeometry')); + } + + if (get1(node, 'MultiTrack')) { + return getGeometry(get1(node, 'MultiTrack')); + } + + let geometries = []; + ['Polygon', 'LineString', 'Point', 'Track'].forEach(geometryType => { + let geometryNodes = get(node, geometryType); + if (geometryNodes) { + for (let i = 0; i < geometryNodes.length; i++) { + let geometryNode = geometryNodes[i]; + + switch(geometryType) { + case 'Point': + geometries.push(getPoint(geometryNode)); + break; + case 'LineString': + geometries.push(getLineString(geometryNode)); + break; + case 'Track': + geometries.push(getTrack(geometryNode)); + break; + case 'Polygon': + geometries.push(getPolygon(geometryNode)); + break; + } + } + } + }); + + return geometries; +} + +function getPoint(node) { + return { + type: 'Point', + coordinates: coord1(nodeVal(get1(node, 'coordinates'))) + }; +} + +function getLineString(node) { + return { + type: 'LineString', + coordinates: coord(nodeVal(get1(node, 'coordinates'))) + }; +} + +function getTrack(node) { + return { + type: 'LineString', + coordinates: gxCoords(node) + }; +} + +function getPolygon(node) { + const rings = get(node, 'LinearRing'); + + let coords = []; + for (let i = 0; i < rings.length; i++) { + coords.push(coord(nodeVal(get1(rings[i], 'coordinates')))); + } + + return { + type: 'Polygon', + coordinates: coords + }; +} + +function gxCoords(node) { + let elems = get(node, 'coord', 'gx'); + if (elems.length === 0) { + elems = get(node, 'gx:coord'); + } + + let coords = []; + for (let i = 0; i < elems.length; i++) { + coords.push(gxCoord(nodeVal(elems[i]))); + } + + let times = []; + const timeElems = get(node, 'when'); + for (let i = 0; i < timeElems.length; i++) { + times.push(nodeVal(timeElems[i])); + } + + return { + coords: coords, + times: times + }; +} + +function gxCoord(v) { + return numarray(v.split(' ')); +} + +function getStyles(node) { + let styleIndex = {}; + + const styles = get(node, 'Style'); + for (let i = 0; i < styles.length; i++) { + const kmlStyle = styles[i]; + const styleId = '#' + attr(kmlStyle, 'id'); + styleIndex[styleId] = { + iconStyle: getIconStyle(kmlStyle), + lineStyle: getLineStyle(kmlStyle), + labelStyle: getLabelStyle(kmlStyle), + polyStyle: getPolygonStyle(kmlStyle) + }; + } + + const styleMaps = get(node, 'StyleMap'); + for (let i = 0; i < styleMaps.length; i++) { + const styleMap = styleMaps[i]; + const pairs = xpath.select("*[local-name()='Pair']", styleMap); + for (let p = 0; p < pairs.length; p++) { + const key = get(pairs[p], 'key'); + if (key) { + const keyName = nodeVal(key[0]); + if (keyName === 'normal') { + const styleUrl = get(pairs[p], 'styleUrl'); + if (styleUrl) { + const styleUrlName = nodeVal(styleUrl[0]); + const styleMapId = '#' + attr(styleMap, 'id'); + styleIndex[styleMapId] = styleIndex[styleUrlName]; + } + } + } + } + } + + return styleIndex; +} + +function getIconStyle(node) { + const iconStyle = get(node, 'IconStyle'); + if (iconStyle[0]) { + let style = {}; + + const iconScale = get(iconStyle[0], 'scale'); + if (iconScale && iconScale[0]) { + style.scale = nodeVal(iconScale[0]); + } + + const icon = get(iconStyle[0], 'Icon'); + if (icon && icon[0]) { + style.icon = {}; + + const href = get(icon[0], 'href'); + if (href[0]) { + style.icon.href = nodeVal(href[0]); + } + } + + return style; + } +} + +function getLineStyle(node) { + const lineStyle = get(node, 'LineStyle'); + if (lineStyle[0]) { + let style = {}; + + const lineColor = get(lineStyle[0], 'color'); + if (lineColor[0]) { + style.color = parseColor(nodeVal(lineColor[0])); + } + + const width = get(lineStyle[0], 'width'); + if (width[0]) { + style.width = nodeVal(width[0]); + } + + return style; + } +} + +function getLabelStyle(node) { + const labelStyle = get(node, 'LabelStyle'); + if (labelStyle[0]) { + let style = {}; + + const labelColor = get(labelStyle[0], 'color'); + if (labelColor[0]) { + style.color = parseColor(nodeVal(labelColor[0])); + } + + const labelScale = get(labelStyle[0], 'scale'); + if (labelScale[0]) { + style.color = nodeVal(labelScale[0]); + } + + return style; + } +} + +function getPolygonStyle(node) { + + const polyStyle = get(node, 'PolyStyle'); + if (polyStyle[0]) { + let style = {}; + + const color = get(polyStyle[0], 'color'); + if (color[0]) { + style.color = parseColor(nodeVal(color[0])); + } + + return style; + } +} + +// all Y children of X +function get(x, y) { + return x.getElementsByTagNameNS("*", y); +} + +function attr(x, y) { return x.getAttribute(y); } + +// one Y child of X, if any, otherwise null +function get1(x, y) { + let n = get(x, y); + return n.length ? n[0] : null; +} + +// https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize +function norm(el) { + if (el.normalize) { + el.normalize(); + } + + return el; +} + +// cast array x into numbers +function numarray(x) { + let o = []; + for (let i = 0; i < x.length; i++) { + o[i] = parseFloat(x[i]); + } + + return o; +} + +// cast array x into numbers +function coordinateArray(x) { + let o = []; + for (let i = 0; i < x.length; i++) { + o[i] = parseFloat(x[i]); + } + + return o.splice(0,2); +} + +// get the content of a text node, if any +function nodeVal(x) { + if (x) { + norm(x); + } + + return x && x.firstChild && x.firstChild.nodeValue; +} + +// get one coordinate from a coordinate array, if any +function coord1(v) { + const removeSpace = (/\s*/g); + return coordinateArray(v.replace(removeSpace, '').split(',')); +} + +// get all coordinates from a coordinate array as [[],[]] +function coord(v) { + const trimSpace = (/^\s*|\s*$/g); + const splitSpace = (/\s+/); + + let coords = v.replace(trimSpace, '').split(splitSpace), + o = []; + + for (let i = 0; i < coords.length; i++) { + o.push(coord1(coords[i])); + } + + return o; +} + +function parseColor(color) { + const r = color.slice(6,8); + const g = color.slice(4,6); + const b = color.slice(2,4); + const a = color.slice(0,2); + + return { + rgb: '#' + r + g + b, + opacity: parseInt(a, 16) + }; +} diff --git a/service/src/utilities/transformKML.ts b/service/src/utilities/transformKML.ts deleted file mode 100644 index b67c0674e..000000000 --- a/service/src/utilities/transformKML.ts +++ /dev/null @@ -1,388 +0,0 @@ -var xpath = require('xpath'); -import { DOMParser, Document } from '@xmldom/xmldom'; - -interface KmlStyle { - iconStyle?: any; - lineStyle?: any; - labelStyle?: any; - polyStyle?: any; -} - -interface Color { - rgb: string; - opacity: number; -} - -interface KmlFeature { - type: 'Feature'; - geometry: any; - properties: any; -} - -function kml(docString: string, images: Record = {}): KmlFeature[] { - const parser = new DOMParser(); - const document = parser.parseFromString(docString, 'application/xml'); - if (!document || document.documentElement?.nodeName !== 'kml') { - throw new Error('KML file is not valid or does not contain a root element.'); - } - - const styleIndex = getStyles(document, images); - - // Pull all placemarks regards of depth level - const placemarks = xpath.select("//*[local-name()='Placemark']", document) as Element[]; - - return placemarks.map((placemark) => { - return getPlacemark(placemark, styleIndex, images); - }).flat(); -} - -function getProperties(node: Element, styleIndex: Record, images: Record = {}): any { - const properties: any = {}; - - const name = nodeVal(getFirstElementByNamespace(node, 'name')); - if (name) properties.name = name; - - const description = nodeVal(getFirstElementByNamespace(node, 'description')); - if (description) properties.description = description; - - const extendedData = getFirstElementByNamespace(node, 'ExtendedData'); - if (extendedData) { - const datas = getElementsByNamespace(extendedData, 'Data'), - simpleDatas = getElementsByNamespace(extendedData, 'SimpleData'); - - for (let i = 0; i < datas.length; i++) { - properties[datas[i].getAttribute('name') as string] = nodeVal(getFirstElementByNamespace(datas[i], 'value')); - } - - for (let i = 0; i < simpleDatas.length; i++) { - properties[simpleDatas[i].getAttribute('name') as string] = nodeVal(simpleDatas[i]); - } - } - - const styleUrl = nodeVal(getFirstElementByNamespace(node, 'styleUrl')); - if (styleUrl && styleIndex[styleUrl]) { - properties.style = styleIndex[styleUrl]; - } else { - // Check if placemark has style - const styleElement = getFirstElementByNamespace(node, 'Style'); - if (styleElement) { - properties.style = { - iconStyle: getIconStyle(styleElement, images), - lineStyle: getLineStyle(styleElement), - labelStyle: getLabelStyle(styleElement), - polyStyle: getPolygonStyle(styleElement) - }; - } - } - - return properties; -} - -function getPlacemark(node: Element, styleIndex: Record, images: Record = {}): KmlFeature[] { - const geometries = getGeometry(node); - if (!geometries.length) return []; - - const properties = getProperties(node, styleIndex, images); - - return geometries.map(geometry => { - return { - type: 'Feature', - geometry: geometry, - properties: properties - }; - }); -} - -function getGeometry(node: Element): any[] { - if (getFirstElementByNamespace(node, 'MultiGeometry')) { - return getGeometry(getFirstElementByNamespace(node, 'MultiGeometry') as Element); - } - - if (getFirstElementByNamespace(node, 'MultiTrack')) { - return getGeometry(getFirstElementByNamespace(node, 'MultiTrack') as Element); - } - const geometries: any[] = []; - ['Polygon', 'LineString', 'Point', 'Track'].forEach(geometryType => { - const geometryNodes = getElementsByNamespace(node, geometryType); - if (geometryNodes) { - for (let i = 0; i < geometryNodes.length; i++) { - const geometryNode = geometryNodes[i]; - - switch (geometryType) { - case 'Point': - geometries.push({ - type: 'Point', - coordinates: coord1(nodeVal(getFirstElementByNamespace(geometryNode, 'coordinates'))) - }); - break; - case 'LineString': - geometries.push({ - type: 'LineString', - coordinates: coord(nodeVal(getFirstElementByNamespace(geometryNode, 'coordinates'))) - }); - break; - case 'Track': - geometries.push({ - type: 'LineString', - coordinates: gxCoords(geometryNode) - }); - break; - case 'Polygon': - const rings = getElementsByNamespace(geometryNode, 'LinearRing'); - - const coords: (number[])[][] = []; - for (let i = 0; i < rings.length; i++) { - coords.push(coord(nodeVal(getFirstElementByNamespace(rings[i], 'coordinates')))); - } - geometries.push({ - type: 'Polygon', - coordinates: coords - }); - } - } - } - }); - - return geometries; -} - -function gxCoords(node: Element): any { - let elems = getElementsByNamespace(node, 'coord'); - if (elems.length === 0) { - elems = getElementsByNamespace(node, 'gx:coord'); - } - - const coords: number[][] = []; - for (let i = 0; i < elems.length; i++) { - coords.push(gxCoord(nodeVal(elems[i]))); - } - - const times: (string | null)[] = []; - const timeElems = getElementsByNamespace(node, 'when'); - for (let i = 0; i < timeElems.length; i++) { - times.push(nodeVal(timeElems[i])); - } - - return { - coords: coords, - times: times - }; -} - -function gxCoord(v: string | null): number[] { - if (!v) return []; - return numarray(v.split(' ')); -} - -function getStyles(node: Document, images: Record = {}): Record { - const styleIndex: Record = {}; - - const styles = getElementsByNamespace(node, 'Style'); - for (let i = 0; i < styles.length; i++) { - const kmlStyle = styles[i]; - const styleId = '#' + attr(kmlStyle, 'id'); - styleIndex[styleId] = { - iconStyle: getIconStyle(kmlStyle, images), - lineStyle: getLineStyle(kmlStyle), - labelStyle: getLabelStyle(kmlStyle), - polyStyle: getPolygonStyle(kmlStyle) - }; - } - - const styleMaps = getElementsByNamespace(node, 'StyleMap'); - for (let i = 0; i < styleMaps.length; i++) { - const styleMap = styleMaps[i]; - const pairs = xpath.select("*[local-name()='Pair']", styleMap) as Element[]; - for (let p = 0; p < pairs.length; p++) { - const key = getElementsByNamespace(pairs[p], 'key'); - if (key) { - const keyName = nodeVal(key[0]); - if (keyName === 'normal') { - const styleUrl = getElementsByNamespace(pairs[p], 'styleUrl'); - if (styleUrl) { - const styleUrlName = nodeVal(styleUrl[0]); - if (!styleUrlName) continue; - const styleMapId = '#' + attr(styleMap, 'id'); - styleIndex[styleMapId] = styleIndex[styleUrlName]; - } - } - } - } - } - - return styleIndex; -} - -function getIconStyle(node: Element, images: Record = {}): any { - const iconStyle = getElementsByNamespace(node, 'IconStyle'); - if (iconStyle[0]) { - const style: any = {}; - - const iconScale = getElementsByNamespace(iconStyle[0], 'scale'); - if (iconScale && iconScale[0]) { - style.scale = nodeVal(iconScale[0]); - } - - const icon = getElementsByNamespace(iconStyle[0], 'Icon'); - if (icon && icon[0]) { - const href = getElementsByNamespace(icon[0], 'href'); - if (href[0]) { - const hrefValue = nodeVal(href[0]); - if (hrefValue) { - const isWebUrl = /^(http|https):/.test(hrefValue); - - if (isWebUrl || images[hrefValue]) { - style.icon = { - href: images[hrefValue] || hrefValue - }; - } - } - } - } - - return style; - } -} - -function getLineStyle(node: Element): any { - const lineStyle = getElementsByNamespace(node, 'LineStyle'); - if (lineStyle[0]) { - const style: any = {}; - - const lineColor = getElementsByNamespace(lineStyle[0], 'color'); - if (lineColor[0]) { - style.color = parseColor(nodeVal(lineColor[0])); - } - - const width = getElementsByNamespace(lineStyle[0], 'width'); - if (width[0]) { - style.width = nodeVal(width[0]); - } - - return style; - } -} - -function getLabelStyle(node: Element): any { - const labelStyle = getElementsByNamespace(node, 'LabelStyle'); - if (labelStyle[0]) { - const style: any = {}; - - const labelColor = getElementsByNamespace(labelStyle[0], 'color'); - if (labelColor[0]) { - style.color = parseColor(nodeVal(labelColor[0])); - } - - const labelScale = getElementsByNamespace(labelStyle[0], 'scale'); - if (labelScale[0]) { - style.scale = nodeVal(labelScale[0]); - } - - return style; - } -} - -function getPolygonStyle(node: Element): any { - - const polyStyle = getElementsByNamespace(node, 'PolyStyle'); - if (polyStyle[0]) { - const style: any = {}; - - const color = getElementsByNamespace(polyStyle[0], 'color'); - if (color[0]) { - style.color = parseColor(nodeVal(color[0])); - } - - return style; - } -} - -function getElementsByNamespace(x: Document | Element, y: string): HTMLCollectionOf { - return (x as Element).getElementsByTagNameNS("*", y); -} - -function attr(x: Element, y: string): string | null { return x.getAttribute(y); } - -function getFirstElementByNamespace(x: Document | Element, y: string): Element | null { - const n = getElementsByNamespace(x, y); - return n.length ? n[0] : null; -} - -// https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize -function norm(el: Node | null): Node | null { - if (el && el.normalize) { - el.normalize(); - } - - return el; -} - -// cast array x into numbers -function numarray(x: string[]): number[] { - const o: number[] = []; - for (let i = 0; i < x.length; i++) { - o[i] = parseFloat(x[i]); - } - - return o; -} - -// cast array x into numbers -function coordinateArray(x: string[]): number[] { - const o: number[] = []; - for (let i = 0; i < x.length; i++) { - o[i] = parseFloat(x[i]); - } - - return o.splice(0, 2); -} - -// get the content of a text node, if any -function nodeVal(x: Node | null): string | null { - if (x) { - norm(x); - } - - return (x && x.firstChild && x.firstChild.nodeValue) ? x.firstChild.nodeValue : null; -} - -// get one coordinate from a coordinate array, if any -function coord1(v: string | null): number[] { - if (!v) return []; - const removeSpace = (/\s*/g); - return coordinateArray(v.replace(removeSpace, '').split(',')); -} - -// get all coordinates from a coordinate array as [[],[]] -function coord(v: string | null): (number[])[] { - if (!v) return []; - const trimSpace = (/^\s*|\s*$/g); - const splitSpace = (/\s+/); - - const coords = v.replace(trimSpace, '').split(splitSpace), - o: (number[])[] = []; - - coords.forEach(coordStr => { - if (coordStr) { - o.push(coord1(coordStr)); - } - }); - - return o; -} - -function parseColor(color: string | null): Color | undefined { - if (!color) return; - - const r = color.slice(6, 8); - const g = color.slice(4, 6); - const b = color.slice(2, 4); - const a = color.slice(0, 2); - - return { - rgb: '#' + r + g + b, - opacity: parseInt(a, 16) - }; -} - -export { kml, KmlFeature }; \ No newline at end of file diff --git a/service/test/adapters/events/adapters.events.db.mongoose.test.ts b/service/test/adapters/events/adapters.events.db.mongoose.test.ts index 18d5f2f8e..0b1fe5e1a 100644 --- a/service/test/adapters/events/adapters.events.db.mongoose.test.ts +++ b/service/test/adapters/events/adapters.events.db.mongoose.test.ts @@ -12,14 +12,14 @@ import { copyMageEventAttrs, MageEvent, MageEventAttrs, MageEventCreateAttrs } f const TeamModel = TeamModelModule.TeamModel -describe('event mongoose repository', function () { +describe('event mongoose repository', function() { let model: MageEventModel let repo: MongooseMageEventRepository let eventDoc: MageEventDocument let createEvent: (attrs: MageEventCreateAttrs & Partial) => Promise - beforeEach('initialize model', async function () { + beforeEach('initialize model', async function() { //TODO remove cast to any, was mongoose.Model model = legacy.Model as any @@ -36,23 +36,21 @@ describe('event mongoose repository', function () { resolve(event!) }) }) - .then(createdWithoutTeamId => { - // fetch again, because the create method does not return the event with - // the implicitly created team id in the teamIds list, presumably - // because it's done in middleware |:$ - // TODO: fix the above - return model.findById(createdWithoutTeamId._id).then(withTeamId => { - if (withTeamId) { - return withTeamId - } - throw new Error(`created event ${createdWithoutTeamId._id} now does not exist!`) - }) + .then(createdWithoutTeamId => { + // fetch again, because the create method does not return the event with + // the implicitly created team id in the teamIds list, presumably + // because it's done in middleware |:$ + // TODO: fix the above + return model.findById(createdWithoutTeamId._id).then(withTeamId => { + if (withTeamId) { + return withTeamId + } + throw new Error(`created event ${createdWithoutTeamId._id} now does not exist!`) }) + }) } - // Use unique event name to avoid team name conflicts - const uniqueId = new mongoose.Types.ObjectId().toHexString() eventDoc = await createEvent({ - name: `Test Event ${uniqueId}`, + name: 'Test Event', description: 'For testing' }) @@ -60,29 +58,27 @@ describe('event mongoose repository', function () { expect(eventDoc.teamIds.length).to.equal(1) }) - afterEach(async function () { + afterEach(async function() { await model.remove({}) - // Also clean up teams that were created for events - await TeamModel.remove({}) }) - describe('finding events by id', function () { + describe('finding events by id', function() { + + it('looks up an event by id', async function() { - it('looks up an event by id', async function () { const fetched = await repo.findById(eventDoc._id) expect(fetched).to.be.instanceOf(MageEvent) expect(omitUndefinedFrom(copyMageEventAttrs(fetched!))).to.deep.equal(eventDoc.toJSON()) }) }) - describe('finding active events', function () { + describe('finding active events', function() { - beforeEach('clear all events', async function () { + beforeEach('clear all events', async function() { await model.remove({}) - await TeamModel.remove({}) }) - it('finds events whose complete key is false', async function () { + it('finds events whose complete key is false', async function() { const active1 = await createEvent({ name: 'Active 1', @@ -112,7 +108,7 @@ describe('event mongoose repository', function () { ]) }) - it('finds events without a complete key', async function () { + it('finds events without a complete key', async function() { const active1 = await createEvent({ name: 'Active 1', @@ -141,27 +137,27 @@ describe('event mongoose repository', function () { }) }) - describe('adding feeds to events', function () { + describe('adding feeds to events', function() { - it('adds a feed id when the feeds list does not exist', async function () { + it('adds a feed id when the feeds list does not exist', async function() { const repo = new MongooseMageEventRepository(model) const feedId = uniqid() const updated = await repo.addFeedsToEvent(eventDoc?._id, feedId) const fetched = await repo.findById(eventDoc?._id) - expect(updated?.feedIds).to.deep.equal([feedId]) + expect(updated?.feedIds).to.deep.equal([ feedId ]) expect(copyMageEventAttrs(fetched!)).to.deep.equal(copyMageEventAttrs(updated!)) }) - it('adds a feed id to a non-empty feeds list', async function () { + it('adds a feed id to a non-empty feeds list', async function() { const repo = new MongooseMageEventRepository(model) - const feedIds = [uniqid(), uniqid()] + const feedIds = [ uniqid(), uniqid() ] let updated = await repo.addFeedsToEvent(eventDoc?._id, feedIds[0]) let fetched = await repo.findById(eventDoc?._id) - expect(updated?.feedIds).to.deep.equal([feedIds[0]]) + expect(updated?.feedIds).to.deep.equal([ feedIds[0] ]) expect(copyMageEventAttrs(fetched!)).to.deep.equal(copyMageEventAttrs(updated!)) updated = await repo.addFeedsToEvent(eventDoc?._id, feedIds[1]) @@ -171,10 +167,10 @@ describe('event mongoose repository', function () { expect(copyMageEventAttrs(fetched!)).to.deep.equal(copyMageEventAttrs(updated!)) }) - it('adds multiple feed ids to the feeds list', async function () { + it('adds multiple feed ids to the feeds list', async function() { const repo = new MongooseMageEventRepository(model) - const feedIds = [uniqid(), uniqid()] + const feedIds = [ uniqid(), uniqid() ] let updated = await repo.addFeedsToEvent(eventDoc?._id, ...feedIds) let fetched = await repo.findById(eventDoc?._id) @@ -182,10 +178,10 @@ describe('event mongoose repository', function () { expect(copyMageEventAttrs(fetched!)).to.deep.equal(copyMageEventAttrs(updated!)) }) - it('does not add duplicate feed ids', async function () { + it('does not add duplicate feed ids', async function() { const repo = new MongooseMageEventRepository(model) - const feedIds = [uniqid(), uniqid()] + const feedIds = [ uniqid(), uniqid() ] let updated = await repo.addFeedsToEvent(eventDoc?._id, ...feedIds) let fetched = await repo.findById(eventDoc?._id) @@ -199,7 +195,7 @@ describe('event mongoose repository', function () { expect(copyMageEventAttrs(fetched!)).to.deep.equal(copyMageEventAttrs(updated!)) }) - it('returns null if the event does not exist', async function () { + it('returns null if the event does not exist', async function() { let typedEventDoc = eventDoc as MageEventDocument const updated = await repo.addFeedsToEvent(typedEventDoc.id - 1, uniqid()) @@ -211,41 +207,41 @@ describe('event mongoose repository', function () { }) }) - describe('removing feeds from an event', function () { + describe('removing feeds from an event', function() { - it('removes a feed id from the list', async function () { + it('removes a feed id from the list', async function() { - const feedIds = Object.freeze([uniqid(), uniqid()]) + const feedIds = Object.freeze([ uniqid(), uniqid() ]) let typedEventDoc = eventDoc as MageEventDocument - typedEventDoc.feedIds = [...feedIds] + typedEventDoc.feedIds = [ ...feedIds ] typedEventDoc = await typedEventDoc.save() as MageEventDocument const updated = await repo.removeFeedsFromEvent(typedEventDoc.id, feedIds[0]) const fetched = await repo.findById(typedEventDoc.id) expect(typedEventDoc.feedIds).to.deep.equal(feedIds) - expect(fetched!.feedIds).to.deep.equal([feedIds[1]]) + expect(fetched!.feedIds).to.deep.equal([ feedIds[1]] ) expect(copyMageEventAttrs(updated!)).to.deep.equal(copyMageEventAttrs(fetched!)) }) - it('removes multiple feed ids from the list', async function () { + it('removes multiple feed ids from the list', async function() { - const feedIds = Object.freeze([uniqid(), uniqid(), uniqid()]) + const feedIds = Object.freeze([ uniqid(), uniqid(), uniqid() ]) let typedEventDoc = eventDoc as MageEventDocument - typedEventDoc.feedIds = [...feedIds] + typedEventDoc.feedIds = [ ...feedIds ] typedEventDoc = await typedEventDoc.save() as MageEventDocument const updated = await repo.removeFeedsFromEvent(typedEventDoc.id, feedIds[0], feedIds[2]) const fetched = await repo.findById(typedEventDoc.id) expect(typedEventDoc.feedIds).to.deep.equal(feedIds) - expect(fetched!.feedIds).to.deep.equal([feedIds[1]]) + expect(fetched!.feedIds).to.deep.equal([ feedIds[1]] ) expect(copyMageEventAttrs(updated!)).to.deep.equal(copyMageEventAttrs(fetched!)) }) - it('has no affect if the feed ids are not in the list', async function () { + it('has no affect if the feed ids are not in the list', async function() { - const feedIds = Object.freeze([uniqid(), uniqid(), uniqid()]) + const feedIds = Object.freeze([ uniqid(), uniqid(), uniqid() ]) let typedEventDoc = eventDoc as MageEventDocument - typedEventDoc.feedIds = [...feedIds] + typedEventDoc.feedIds = [ ...feedIds ] typedEventDoc = await typedEventDoc.save() as MageEventDocument const updated = await repo.removeFeedsFromEvent(typedEventDoc.id, uniqid()) const fetched = await repo.findById(typedEventDoc.id) @@ -255,7 +251,7 @@ describe('event mongoose repository', function () { expect(copyMageEventAttrs(updated!)).to.deep.equal(copyMageEventAttrs(fetched!)) }) - it('has no affect if the event feed ids list is empty', async function () { + it('has no affect if the event feed ids list is empty', async function() { let typedEventDoc = eventDoc as MageEventDocument let updated = await repo.removeFeedsFromEvent(typedEventDoc.id, uniqid()) @@ -266,25 +262,25 @@ describe('event mongoose repository', function () { expect(copyMageEventAttrs(updated!)).to.deep.equal(copyMageEventAttrs(fetched!)) }) - it('removes the given feed ids that are in the list and ignores feed ids that are not', async function () { + it('removes the given feed ids that are in the list and ignores feed ids that are not', async function() { - const feedIds = Object.freeze([uniqid(), uniqid(), uniqid()]) + const feedIds = Object.freeze([ uniqid(), uniqid(), uniqid() ]) let typedEventDoc = eventDoc as MageEventDocument - typedEventDoc.feedIds = [...feedIds] + typedEventDoc.feedIds = [ ...feedIds ] typedEventDoc = await typedEventDoc.save() as MageEventDocument const updated = await repo.removeFeedsFromEvent(typedEventDoc.id, feedIds[2], uniqid()) const fetched = await repo.findById(typedEventDoc.id) expect(typedEventDoc.feedIds).to.deep.equal(feedIds) - expect(fetched!.feedIds).to.deep.equal([feedIds[0], feedIds[1]]) + expect(fetched!.feedIds).to.deep.equal([ feedIds[0], feedIds[1] ]) expect(copyMageEventAttrs(updated!)).to.deep.equal(copyMageEventAttrs(fetched!)) }) - it('returns null if the event does not exist', async function () { + it('returns null if the event does not exist', async function() { - const feedIds = Object.freeze([uniqid(), uniqid(), uniqid()]) + const feedIds = Object.freeze([ uniqid(), uniqid(), uniqid() ]) let typedEventDoc = eventDoc as MageEventDocument - typedEventDoc.feedIds = [...feedIds] + typedEventDoc.feedIds = [ ...feedIds ] typedEventDoc = await typedEventDoc.save() as MageEventDocument const updated = await repo.removeFeedsFromEvent(typedEventDoc.id - 1, feedIds[0]) const fetched = await repo.findById(typedEventDoc.id) @@ -295,9 +291,9 @@ describe('event mongoose repository', function () { }) }) - describe('removing a feed from all referencing events', function () { + describe('removing a feed from all referencing events', function() { - it('removes the feed id entry from all events that reference the feed', async function () { + it('removes the feed id entry from all events that reference the feed', async function() { const feedId = uniqid() const eventDocs = await Promise.all([ @@ -327,7 +323,7 @@ describe('event mongoose repository', function () { }) ]) const updateCount = await repo.removeFeedsFromEvents(feedId) - const updatedEventDocs = await model.find({ _id: { $in: eventDocs.map(x => x._id) } }) + const updatedEventDocs = await model.find({ _id: { $in: eventDocs.map(x => x._id) }}) expect(updateCount).to.equal(2) expect(updatedEventDocs).to.have.length(3) const byId = _.keyBy(updatedEventDocs.map(x => x.toJSON() as MageEventAttrs), 'id') @@ -336,7 +332,7 @@ describe('event mongoose repository', function () { id: eventDocs[0]._id, name: 'Remove Feeds 1', description: 'testing', - feedIds: [eventDocs[0].feedIds[0], eventDocs[0].feedIds[2]] + feedIds: [ eventDocs[0].feedIds[0], eventDocs[0].feedIds[2] ] } ) expect(byId[eventDocs[1].id]).to.deep.include( @@ -357,9 +353,9 @@ describe('event mongoose repository', function () { ) }) - it('removes multiple feeds from multiple events', async function () { + it('removes multiple feeds from multiple events', async function() { - const feedIds = [uniqid(), uniqid()] + const feedIds = [ uniqid(), uniqid() ] const created = await Promise.all([ createEvent({ name: 'Remove Feeds 1', @@ -396,7 +392,7 @@ describe('event mongoose repository', function () { }) ]) as MageEventDocument[] // re-fetch to get teamIds array populated - const idsFilter = { _id: { $in: created.map(x => x._id) } } + const idsFilter = { _id: { $in: created.map(x => x._id) }} const fetched = _.keyBy((await model.find(idsFilter)).map(x => x.toJSON() as MageEventAttrs), 'name') expect(Object.keys(fetched)).to.have.length(4) @@ -404,7 +400,7 @@ describe('event mongoose repository', function () { expect(updateCount).to.equal(3) const updated = _.keyBy((await model.find(idsFilter)).map(x => x.toJSON() as MageEventAttrs), 'name') - for (const nameNum of [1, 2, 3, 4]) { + for (const nameNum of [ 1, 2, 3, 4 ]) { const name = `Remove Feeds ${nameNum}` const createdEvent = fetched[name] const updatedEvent = updated[name] @@ -415,9 +411,9 @@ describe('event mongoose repository', function () { }) }) - describe('getting teams in an event', function () { + describe('getting teams in an event', function() { - it('gets the teams', async function () { + it('gets the teams', async function() { const user = new mongoose.Types.ObjectId().toHexString() const teams: Partial[] = [ @@ -427,10 +423,10 @@ describe('event mongoose repository', function () { acl: { [user]: { role: 'OWNER', - permissions: ['read', 'update', 'delete'] + permissions: [ 'read', 'update', 'delete' ] } }, - userIds: [user, new mongoose.Types.ObjectId().toHexString(), new mongoose.Types.ObjectId().toHexString()] + userIds: [ user, new mongoose.Types.ObjectId().toHexString(), new mongoose.Types.ObjectId().toHexString() ] }, { id: new mongoose.Types.ObjectId().toHexString(), @@ -438,10 +434,10 @@ describe('event mongoose repository', function () { acl: { [user]: { role: 'GUEST', - permissions: ['read'] + permissions: [ 'read' ] } }, - userIds: [user, new mongoose.Types.ObjectId().toHexString()] + userIds: [ user, new mongoose.Types.ObjectId().toHexString() ] } ] const teamDocs = await Promise.all(teams.map(async (x) => { @@ -458,21 +454,21 @@ describe('event mongoose repository', function () { expect(fetchedTeams).to.deep.equal(teams) }) - it('returns null when the event does not exist', async function () { + it('returns null when the event does not exist', async function() { const oops = await repo.findTeamsInEvent(eventDoc.id - 1) expect(oops).to.be.null }) }) - it('does not allow creating events', async function () { + it('does not allow creating events', async function() { await expect(repo.create()).to.eventually.rejectWith(Error) }) - it('does not allow updating events', async function () { - await expect(repo.update({ id: eventDoc._id, feedIds: ['not_allowed'] })).to.eventually.rejectWith(Error) + it('does not allow updating events', async function() { + await expect(repo.update({ id: eventDoc._id, feedIds: [ 'not_allowed' ] })).to.eventually.rejectWith(Error) }) }) function omitUndefinedFrom(x: any) { - return _.omitBy(x, v => v === void (0)) + return _.omitBy(x, v => v === void(0)) } \ No newline at end of file diff --git a/service/test/adapters/observations/adapters.observations.controllers.web.test.ts b/service/test/adapters/observations/adapters.observations.controllers.web.test.ts index c3c5a5e1f..2b4a7a061 100644 --- a/service/test/adapters/observations/adapters.observations.controllers.web.test.ts +++ b/service/test/adapters/observations/adapters.observations.controllers.web.test.ts @@ -32,7 +32,7 @@ describe('observations web controller', function () { let attachmentStore: SubstituteOf let context: ObservationRequestContext - beforeEach(function () { + beforeEach(function() { mageEvent = new MageEvent({ id: Date.now(), name: 'Test Obsevation Web Layer', @@ -69,9 +69,9 @@ describe('observations web controller', function () { client = supertest(webApp) }) - describe('observation response json', function () { + describe('observation response json', function() { - it('is exo observation with urls added', function () { + it('is exo observation with urls added', function() { const obs: ExoObservation = { id: uniqid(), @@ -80,7 +80,7 @@ describe('observations web controller', function () { createdAt: new Date(), lastModified: new Date(), type: 'Feature', - geometry: { type: 'Point', coordinates: [23, 45] }, + geometry: { type: 'Point', coordinates: [ 23, 45 ] }, properties: { timestamp: new Date(), forms: [ @@ -88,7 +88,7 @@ describe('observations web controller', function () { ] }, state: { id: uniqid(), name: 'active', userId: uniqid() }, - favoriteUserIds: [uniqid(), uniqid()], + favoriteUserIds: [ uniqid(), uniqid() ], attachments: [ { id: uniqid(), observationFormId: uniqid(), fieldName: 'field2', oriented: false, contentStored: true }, { id: uniqid(), observationFormId: uniqid(), fieldName: 'field2', oriented: false, contentStored: true } @@ -109,7 +109,7 @@ describe('observations web controller', function () { expect(obsWeb.attachments[1].url).to.equal(`${baseUrl}/events/${mageEvent.id}/observations/${obs.id}/attachments/${obs.attachments[1].id}`) }) - it('omits attachment url if content is not stored', function () { + it('omits attachment url if content is not stored', function() { const obs: ExoObservation = { id: uniqid(), @@ -118,7 +118,7 @@ describe('observations web controller', function () { createdAt: new Date(), lastModified: new Date(), type: 'Feature', - geometry: { type: 'Point', coordinates: [23, 45] }, + geometry: { type: 'Point', coordinates: [ 23, 45 ] }, properties: { timestamp: new Date(), forms: [] @@ -134,9 +134,9 @@ describe('observations web controller', function () { }) }) - describe('POST /id', function () { + describe('POST /id', function() { - it('allocates an observation id', async function () { + it('allocates an observation id', async function() { const observationId = uniqid() app.allocateObservationId(Arg.any()).resolves(AppResponse.success(observationId)) @@ -155,7 +155,7 @@ describe('observations web controller', function () { }) }) - it('returns 403 without permission', async function () { + it('returns 403 without permission', async function() { app.allocateObservationId(Arg.any()).resolves(AppResponse.error(permissionDenied('create', testUser))) const res = await client.post(`${basePath}/events/${mageEvent.id}/observations/id`) @@ -166,13 +166,13 @@ describe('observations web controller', function () { }) }) - describe('PUT /observations/{observationId}', function () { + describe('PUT /observations/{observationId}', function() { - it('saves the observation for a mod request', async function () { + it('saves the observation for a mod request', async function() { const obsId = uniqid() const reqBody = { - geometry: { type: 'Point', coordinates: [23, 45] }, + geometry: { type: 'Point', coordinates: [ 23, 45 ] }, properties: { timestamp: new Date().toISOString(), forms: [ @@ -185,7 +185,6 @@ describe('observations web controller', function () { id: obsId, type: 'Feature', geometry: reqBody.geometry as Geometry, - noGeometry: false, properties: { timestamp: new Date(reqBody.properties.timestamp), forms: reqBody.properties.forms @@ -222,12 +221,12 @@ describe('observations web controller', function () { app.received(1).saveObservation(Arg.is(saveObservationRequestWithObservation(mod))) }) - it('picks only geometry and properties from the request body', async function () { + it('picks only geometry and properties from the request body', async function() { const obsId = uniqid() const reqBody = { type: 'Feature', - geometry: { type: 'Point', coordinates: [23, 45] }, + geometry: { type: 'Point', coordinates: [ 23, 45 ] }, properties: { timestamp: new Date().toISOString(), forms: [ @@ -246,7 +245,6 @@ describe('observations web controller', function () { id: obsId, type: 'Feature', geometry: reqBody.geometry as Geometry, - noGeometry: false, properties: { timestamp: new Date(reqBody.properties.timestamp), forms: reqBody.properties.forms @@ -283,7 +281,7 @@ describe('observations web controller', function () { app.received(1).saveObservation(Arg.is(saveObservationRequestWithObservation(mod))) }) - it('retains only valid properties', async function () { + it('retains only valid properties', async function() { const validProperties: Required = { timestamp: new Date(Date.now() - 500), @@ -302,12 +300,12 @@ describe('observations web controller', function () { } }) - it('uses event id only from the path', async function () { + it('uses event id only from the path', async function() { const obsId = uniqid() const reqBody = { eventId: mageEvent.id + 100, - geometry: { type: 'Point', coordinates: [23, 45] }, + geometry: { type: 'Point', coordinates: [ 23, 45 ] }, properties: { timestamp: new Date().toISOString(), forms: [ @@ -325,12 +323,12 @@ describe('observations web controller', function () { app.didNotReceive().saveObservation(Arg.all()) }) - it('uses observation id only from the path', async function () { + it('uses observation id only from the path', async function() { const obsIdInPath = uniqid() const reqBody = { id: uniqid(), - geometry: { type: 'Point', coordinates: [23, 45] }, + geometry: { type: 'Point', coordinates: [ 23, 45 ] }, properties: { timestamp: new Date().toISOString(), forms: [ @@ -348,11 +346,11 @@ describe('observations web controller', function () { app.didNotReceive().saveObservation(Arg.all()) }) - it('returns 403 without permission', async function () { + it('returns 403 without permission', async function() { const obsId = uniqid() const reqBody = { - geometry: { type: 'Point', coordinates: [23, 45] }, + geometry: { type: 'Point', coordinates: [ 23, 45 ] }, properties: { timestamp: new Date().toISOString(), forms: [ @@ -371,11 +369,11 @@ describe('observations web controller', function () { expect(res.body).to.deep.equal({ message: `permission denied: ${appRes.error?.data.permission}` }) }) - it('returns 404 when the observation id does not exist', async function () { + it('returns 404 when the observation id does not exist', async function() { const obsId = uniqid() const reqBody = { - geometry: { type: 'Point', coordinates: [23, 45] }, + geometry: { type: 'Point', coordinates: [ 23, 45 ] }, properties: { timestamp: new Date().toISOString(), forms: [ @@ -394,11 +392,11 @@ describe('observations web controller', function () { expect(res.body).to.deep.equal({ message: `Observation not found: ${obsId}` }) }) - it('returns 400 when the observation is invalid', async function () { + it('returns 400 when the observation is invalid', async function() { const obsId = uniqid() const reqBody = { - geometry: { type: 'Point', coordinates: [23, 45] } as Point, + geometry: { type: 'Point', coordinates: [ 23, 45 ] } as Point, properties: { timestamp: new Date().toISOString(), forms: [ @@ -435,21 +433,21 @@ describe('observations web controller', function () { }) }) - describe('PUT /observations/{observationId}/attachments/{attachmentId}', function () { + describe('PUT /observations/{observationId}/attachments/{attachmentId}', function() { let observationId: string let attachmentId: string let attachmentRequestPath: string let attachmentBytes: Buffer - beforeEach(function () { + beforeEach(function() { observationId = uniqid() attachmentId = uniqid() attachmentRequestPath = `${basePath}/events/${mageEvent.id}/observations/${observationId}/attachments/${attachmentId}` attachmentBytes = Buffer.from(Array.from({ length: 10000 }).map(x => uniqid()).join(' | ')) }) - it('accepts a file upload to store as attachment content', async function () { + it('accepts a file upload to store as attachment content', async function() { const fileName = uniqid('attachment-', '.mp4') const obs: ExoObservation = { @@ -459,8 +457,7 @@ describe('observations web controller', function () { eventId: mageEvent.id, favoriteUserIds: [], type: 'Feature', - geometry: { type: 'Point', coordinates: [65, 56] }, - noGeometry: false, + geometry: { type: 'Point', coordinates: [ 65, 56 ] }, properties: { timestamp: new Date(), forms: [] @@ -502,7 +499,7 @@ describe('observations web controller', function () { })) }) - it('accepts the upload if the first part is the attachment in an invalid request', async function () { + it('accepts the upload if the first part is the attachment in an invalid request', async function() { const fileName = uniqid('attachment-', '.mp4') const obs: ExoObservation = { @@ -512,7 +509,7 @@ describe('observations web controller', function () { eventId: mageEvent.id, favoriteUserIds: [], type: 'Feature', - geometry: { type: 'Point', coordinates: [65, 56] }, + geometry: { type: 'Point', coordinates: [ 65, 56 ] }, properties: { timestamp: new Date(), forms: [] @@ -557,7 +554,7 @@ describe('observations web controller', function () { })) }) - it('returns 403 without permission', async function () { + it('returns 403 without permission', async function() { app.storeAttachmentContent(Arg.all()).resolves(AppResponse.error(permissionDenied('store attachment', 'you', observationId))) const res = await client.put(attachmentRequestPath) @@ -566,7 +563,7 @@ describe('observations web controller', function () { expect(res.status).to.equal(403) expect(res.type).to.match(jsonMediaType) - expect(res.body).to.deep.equal({ message: `permission denied: store attachment` }) + expect(res.body).to.deep.equal({ message: `permission denied: store attachment`}) app.received(1).storeAttachmentContent(Arg.all()) app.received(1).storeAttachmentContent(Arg.is(actualReq => { expect(actualReq.observationId).to.equal(observationId) @@ -580,7 +577,7 @@ describe('observations web controller', function () { })) }) - it('returns 404 when the observation is not found', async function () { + it('returns 404 when the observation is not found', async function() { app.storeAttachmentContent(Arg.all()).resolves(AppResponse.error(entityNotFound(observationId, 'Observation'))) const res = await client.put(attachmentRequestPath) @@ -589,7 +586,7 @@ describe('observations web controller', function () { expect(res.status).to.equal(404) expect(res.type).to.match(jsonMediaType) - expect(res.body).to.deep.equal({ message: `Observation not found: ${observationId}` }) + expect(res.body).to.deep.equal({ message: `Observation not found: ${observationId}`}) app.received(1).storeAttachmentContent(Arg.all()) app.received(1).storeAttachmentContent(Arg.is(actualReq => { expect(actualReq.observationId).to.equal(observationId) @@ -603,7 +600,7 @@ describe('observations web controller', function () { })) }) - it('returns 404 when the attachment is not found', async function () { + it('returns 404 when the attachment is not found', async function() { const notFound = entityNotFound(attachmentId, `Attachment on observation ${observationId}`) app.storeAttachmentContent(Arg.all()).resolves(AppResponse.error(notFound)) @@ -627,7 +624,7 @@ describe('observations web controller', function () { })) }) - it('returns 400 when the attachment multipart field is not a file', async function () { + it('returns 400 when the attachment multipart field is not a file', async function() { const res = await client.put(attachmentRequestPath) .field('attachment', 'not a file.png') @@ -639,7 +636,7 @@ describe('observations web controller', function () { app.didNotReceive().storeAttachmentContent(Arg.all()) }) - it('returns 400 when there is more than one multipart field preceding the attachment', async function () { + it('returns 400 when there is more than one multipart field preceding the attachment', async function() { const res = await client.put(attachmentRequestPath) .field('why', 'is this here') @@ -653,7 +650,7 @@ describe('observations web controller', function () { app.didNotReceive().storeAttachmentContent(Arg.all()) }) - it('returns 400 if the request is not multipart/form-data', async function () { + it('returns 400 if the request is not multipart/form-data', async function() { const res = await client.put(attachmentRequestPath) .accept('application/json') @@ -665,7 +662,7 @@ describe('observations web controller', function () { app.didNotReceive().storeAttachmentContent(Arg.all()) }) - it('returns 400 when the content type does not match the attachment', async function () { + it('returns 400 when the content type does not match the attachment', async function() { const invalid = invalidInput('content type must match attachment media type') app.storeAttachmentContent(Arg.all()).resolves(AppResponse.error(invalid)) @@ -689,7 +686,7 @@ describe('observations web controller', function () { })) }) - it('returns 400 when the file name does not match the attachment', async function () { + it('returns 400 when the file name does not match the attachment', async function() { const invalid = invalidInput('content name must match attachment name') app.storeAttachmentContent(Arg.all()).resolves(AppResponse.error(invalid)) @@ -716,26 +713,26 @@ describe('observations web controller', function () { it('TODO: supports localization - uploading localized attachment content, e.g. video or audio recordings?') }) - describe('HEAD /observations/{observationId}/attachments/{attachmentId}', function () { + describe('HEAD /observations/{observationId}/attachments/{attachmentId}', function() { it('TODO: query for the attachment and return the headers based on the attachment meta-data') // TODO: include 'accept-ranges: bytes' header https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests }) - describe('GET /observations/{observationId}/attachments/{attachmentId}', function () { + describe('GET /observations/{observationId}/attachments/{attachmentId}', function() { let observationId: string let attachmentId: string let attachmentRequestPath: string let attachmentBytes: Buffer - beforeEach(function () { + beforeEach(function() { observationId = uniqid() attachmentId = uniqid() attachmentRequestPath = `${basePath}/events/${mageEvent.id}/observations/${observationId}/attachments/${attachmentId}` attachmentBytes = Buffer.from(Array.from({ length: 10000 }).map(x => uniqid()).join(' | ')) }) - it('requests the content for the attachment in the request path', async function () { + it('requests the content for the attachment in the request path', async function() { const content: ExoAttachmentContent = { attachment: { @@ -769,7 +766,7 @@ describe('observations web controller', function () { })) }) - it('gets the specified minimum thumbnail dimension', async function () { + it('gets the specified minimum thumbnail dimension', async function() { const content: ExoAttachmentContent = { attachment: { @@ -804,7 +801,7 @@ describe('observations web controller', function () { })) }) - it('passes the requested content range to the app layer', async function () { + it('passes the requested content range to the app layer', async function() { const content: ExoAttachmentContent = { attachment: { @@ -841,7 +838,7 @@ describe('observations web controller', function () { })) }) - it('returns 403 without permission', async function () { + it('returns 403 without permission', async function() { const denied = permissionDenied('read attachment content', 'bernie') app.readAttachmentContent(Arg.all()).resolves(AppResponse.error(denied)) @@ -853,7 +850,7 @@ describe('observations web controller', function () { app.received(1).readAttachmentContent(Arg.all()) }) - it('returns 404 if the attachment does not exist', async function () { + it('returns 404 if the attachment does not exist', async function() { const notFound = entityNotFound(attachmentId, 'Attachment') app.readAttachmentContent(Arg.all()).resolves(AppResponse.error(notFound)) @@ -865,7 +862,7 @@ describe('observations web controller', function () { app.received(1).readAttachmentContent(Arg.all()) }) - it('returns 404 if the attachment content does not exist', async function () { + it('returns 404 if the attachment content does not exist', async function() { const notFound = entityNotFound(attachmentId, 'Attachment content') app.readAttachmentContent(Arg.all()).resolves(AppResponse.error(notFound)) @@ -877,7 +874,7 @@ describe('observations web controller', function () { app.received(1).readAttachmentContent(Arg.all()) }) - it('returns 404 if the observation does not exist', async function () { + it('returns 404 if the observation does not exist', async function() { const notFound = entityNotFound(observationId, 'Observation') app.readAttachmentContent(Arg.all()).resolves(AppResponse.error(notFound)) diff --git a/service/test/adapters/observations/adapters.observations.db.mongoose.test.ts b/service/test/adapters/observations/adapters.observations.db.mongoose.test.ts index 7eeded16a..6ccdd8558 100644 --- a/service/test/adapters/observations/adapters.observations.db.mongoose.test.ts +++ b/service/test/adapters/observations/adapters.observations.db.mongoose.test.ts @@ -24,10 +24,9 @@ function observationStub(id: ObservationId, eventId: MageEventId): ObservationAt id, eventId, type: 'Feature', - geometry: { type: 'Point', coordinates: [0, 0] }, + geometry: { type: 'Point', coordinates: [ 0, 0 ] }, createdAt: new Date(now), lastModified: new Date(now), - noGeometry: false, properties: { timestamp: new Date(now), forms: [] @@ -47,7 +46,7 @@ function omitKeysAndUndefinedValues(x: T, . return omitUndefinedValues(_.omit(x, keys)) } -describe('mongoose observation repository', function () { +describe('mongoose observation repository', function() { let model: ObservationModel let repo: MongooseObservationRepository @@ -56,7 +55,7 @@ describe('mongoose observation repository', function () { let createEvent: (attrs: MageEventCreateAttrs & Partial) => Promise let domainEvents: SubstituteOf - beforeEach('initialize model', async function () { + beforeEach('initialize model', async function() { //TODO remove cast to any, was mongoose.Model const MageEventModel = legacyEvent.Model as any const eventRepo = new MongooseMageEventRepository(MageEventModel) @@ -72,23 +71,21 @@ describe('mongoose observation repository', function () { reject(err) }) }) - .then(createdWithoutTeamId => { - // fetch again, because the create method does not return the event with - // the implicitly created team id in the teamIds list, presumably - // because it's done in middleware |:$ - // TODO: fix the above - return MageEventModel.findById(createdWithoutTeamId._id).then((withTeamId: any) => { - if (withTeamId) { - return withTeamId - } - throw new Error(`created event ${createdWithoutTeamId._id} now does not exist!`) - }) + .then(createdWithoutTeamId => { + // fetch again, because the create method does not return the event with + // the implicitly created team id in the teamIds list, presumably + // because it's done in middleware |:$ + // TODO: fix the above + return MageEventModel.findById(createdWithoutTeamId._id).then((withTeamId: any) => { + if (withTeamId) { + return withTeamId + } + throw new Error(`created event ${createdWithoutTeamId._id} now does not exist!`) }) + }) } - // Use unique event name to avoid team name conflicts - const uniqueId = new mongoose.Types.ObjectId().toHexString() eventDoc = await createEvent({ - name: `Test Event ${uniqueId}`, + name: 'Test Event', description: 'For testing', maxObservationForms: 2, }) @@ -120,7 +117,7 @@ describe('mongoose observation repository', function () { name: 'field3', title: 'Field 3', required: false, - allowedAttachmentTypes: [AttachmentPresentationType.Image] + allowedAttachmentTypes: [ AttachmentPresentationType.Image ] } ], userFields: [] @@ -134,26 +131,20 @@ describe('mongoose observation repository', function () { expect(eventDoc.teamIds.length).to.equal(1) }) - afterEach(async function () { + afterEach(async function() { try { - if (model) { - await model.ensureIndexes() - } - } catch (err) { + await model.ensureIndexes() + } catch(err) { //don't care } // should run all the middleware to drop the observation collection - if (eventDoc) { - await eventDoc.remove() - } - if (repo && repo.idModel) { - await repo.idModel.remove({}) - } + await eventDoc.remove() + await repo.idModel.remove({}) }) - describe('allocating an observation id', function () { + describe('allocating an observation id', function() { - it('adds an observation id to the collection and returns it', async function () { + it('adds an observation id to the collection and returns it', async function() { const id = await repo.allocateObservationId() const parsed = new mongoose.Types.ObjectId(id) @@ -167,11 +158,11 @@ describe('mongoose observation repository', function () { }) }) - describe('saving observations', function () { + describe('saving observations', function() { - describe('new observations', function () { + describe('new observations', function() { - it('fails if the observation is new and the id is not in the id collection', async function () { + it('fails if the observation is new and the id is not in the id collection', async function() { const id = new mongoose.Types.ObjectId() const stub = observationStub(id.toHexString(), event.id) @@ -185,7 +176,7 @@ describe('mongoose observation repository', function () { expect(count).to.equal(0) }) - it('saves a minimal valid observation', async function () { + it('saves a minimal valid observation', async function() { const id = await repo.allocateObservationId() const attrs = observationStub(id, event.id) @@ -208,7 +199,7 @@ describe('mongoose observation repository', function () { expect(count).to.equal(1) }) - it('saves a complex valid observation', async function () { + it('saves a complex valid observation', async function() { const id = await repo.allocateObservationId() const attrs = observationStub(id, event.id) @@ -281,13 +272,13 @@ describe('mongoose observation repository', function () { }) }) - describe('updating observations', function () { + describe('updating observations', function() { let origAttrs: ObservationAttrs let origDoc: ObservationDocument let orig: Observation - beforeEach(async function () { + beforeEach(async function() { const id = await repo.allocateObservationId() const formEntryId = (await repo.nextFormEntryIds())[0] @@ -327,12 +318,12 @@ describe('mongoose observation repository', function () { origDoc = await model.findById(id) as ObservationDocument }) - it('uses put/replace semantics to save the observation as the attributes specify', async function () { + it('uses put/replace semantics to save the observation as the attributes specify', async function() { const putAttrs = copyObservationAttrs(origAttrs) putAttrs.geometry = { type: 'Point', - coordinates: [12, 34] + coordinates: [ 12, 34 ] } putAttrs.states = [ { name: 'archived', id: PendingEntityId } @@ -366,7 +357,7 @@ describe('mongoose observation repository', function () { expect(count).to.equal(1) }) - it('does not allow changing the create timestamp', async function () { + it('does not allow changing the create timestamp', async function() { const modAttrs = copyObservationAttrs(orig) const createdTime = modAttrs.createdAt.getTime() @@ -380,7 +371,7 @@ describe('mongoose observation repository', function () { }) }) - it('fails if the id is invalid', async function () { + it('fails if the id is invalid', async function() { const stub = observationStub('not an objectid', event.id) const observation = Observation.evaluate(stub, event) @@ -393,7 +384,7 @@ describe('mongoose observation repository', function () { expect(count).to.equal(0) }) - it('fails if the observation is invalid', async function () { + it('fails if the observation is invalid', async function() { const id = await repo.allocateObservationId() const stub = observationStub(id, event.id) @@ -414,7 +405,7 @@ describe('mongoose observation repository', function () { expect(count).to.equal(0) }) - it('assigns new ids to new states', async function () { + it('assigns new ids to new states', async function() { const id = await repo.allocateObservationId() const state1Stub = observationStub(id, event.id) @@ -462,11 +453,11 @@ describe('mongoose observation repository', function () { it('retains ids for existing entities') }) - describe('updating individual attachments', function () { + describe('updating individual attachments', function() { let obs: Observation - beforeEach(async function () { + beforeEach(async function() { const id = await repo.allocateObservationId() const formEntryId = (await repo.nextFormEntryIds())[0] const attrs = observationStub(id, event.id) @@ -513,7 +504,7 @@ describe('mongoose observation repository', function () { expect(obs.validation.hasErrors).to.be.false }) - it('saves the content meta-data for the given attachment id', async function () { + it('saves the content meta-data for the given attachment id', async function() { const contentInfo: AttachmentContentPatchAttrs = { size: 674523, @@ -530,7 +521,7 @@ describe('mongoose observation repository', function () { expect(copyObservationAttrs(fetched)).to.deep.equal(copyObservationAttrs(updated)) }) - it('updates all attributes', async function () { + it('updates all attributes', async function() { const patch: Required = { size: 674523, @@ -553,7 +544,7 @@ describe('mongoose observation repository', function () { expect(copyObservationAttrs(fetched)).to.deep.equal(copyObservationAttrs(updated)) }) - it('unsets keys with undefined values', async function () { + it('unsets keys with undefined values', async function() { const patch: AttachmentPatchAttrs = { size: undefined, @@ -572,7 +563,7 @@ describe('mongoose observation repository', function () { expect(copyObservationAttrs(fetched)).to.deep.equal(copyObservationAttrs(updated)) }) - it('does not overwrite changes of concurrent update', async function () { + it('does not overwrite changes of concurrent update', async function() { const contentInfo1: AttachmentContentPatchAttrs = { size: 111111, @@ -599,7 +590,7 @@ describe('mongoose observation repository', function () { expect(fetched.attachments[2]).to.deep.include(contentInfo3) }) - it('returns null if the observation does not exist', async function () { + it('returns null if the observation does not exist', async function() { const contentInfo: AttachmentContentPatchAttrs = { size: 111111, @@ -620,7 +611,7 @@ describe('mongoose observation repository', function () { expect(copyObservationAttrs(all[0])).to.deep.equal(copyObservationAttrs(obs)) }) - it('returns an error if the attachment id does not exist on the observation', async function () { + it('returns an error if the attachment id does not exist on the observation', async function() { const contentInfo: AttachmentContentPatchAttrs = { size: 111111, @@ -634,11 +625,11 @@ describe('mongoose observation repository', function () { }) }) - describe('dispatching domain events', function () { + describe('dispatching domain events', function() { let obs: Observation - beforeEach(async function () { + beforeEach(async function() { const id = await repo.allocateObservationId() const formId = await repo.nextFormEntryIds().then(x => x[0]) const attachmentIds = await repo.nextAttachmentIds(3) @@ -683,7 +674,7 @@ describe('mongoose observation repository', function () { obs = await repo.save(obs) as Observation }) - it('dispatches pending events on the observation after the observation saves', async function () { + it('dispatches pending events on the observation after the observation saves', async function() { /* TODO: should there a mechanism to ensure domain events cannot be @@ -705,7 +696,7 @@ describe('mongoose observation repository', function () { ) }) - it('emits readonly events', async function () { + it('emits readonly events', async function() { const mod = removeAttachment(obs, obs.attachments[1].id) as Observation const receivedEvents = [] as ObservationEmitted[] @@ -733,7 +724,7 @@ describe('mongoose observation repository', function () { expect(receivedEvent.removedAttachments).to.equal(removedAttachments) }) - it('does not dispatch events if the observation is invalid', async function () { + it('does not dispatch events if the observation is invalid', async function() { const mod = Observation.assignTo(obs, { ...copyObservationAttrs(obs), @@ -752,7 +743,7 @@ describe('mongoose observation repository', function () { domainEvents.didNotReceive().emit(Arg.all()) }) - it('does not dispatch events if there was a database saving the observation', async function () { + it('does not dispatch events if there was a database saving the observation', async function() { let mod = Observation.evaluate({ ...copyObservationAttrs(obs), diff --git a/service/test/adapters/observations/adapters.observations.dto.ecma404-json.test.ts b/service/test/adapters/observations/adapters.observations.dto.ecma404-json.test.ts index 848ba88b9..2374e04b0 100644 --- a/service/test/adapters/observations/adapters.observations.dto.ecma404-json.test.ts +++ b/service/test/adapters/observations/adapters.observations.dto.ecma404-json.test.ts @@ -6,12 +6,12 @@ import { JsonObject } from '../../../lib/entities/entities.json_types' import { MageError, InvalidInputError, ErrInvalidInput } from '../../../lib/app.api/app.api.errors' import _ from 'lodash' -describe('observation json dto transform', function () { +describe('observation json dto transform', function() { let modJson: JsonObject let modPropertiesJson: JsonObject - beforeEach(function () { + beforeEach(function() { modPropertiesJson = { timestamp: new Date(Date.now() - 113355).toISOString(), @@ -37,20 +37,19 @@ describe('observation json dto transform', function () { modJson = { id: uniqid(), type: 'Feature', - bbox: [11, 22, 33, 12, 23, 33], + bbox: [ 11, 22, 33, 12, 23, 33 ], geometry: { type: 'Point', - coordinates: [23, 45, 67], - bbox: [11, 22, 33, 12, 23, 33] + coordinates: [ 23, 45, 67 ], + bbox: [ 11, 22, 33, 12, 23, 33 ] }, - noGeometry: false, properties: modPropertiesJson } }) - describe('observation mod transform', function () { + describe('observation mod transform', function() { - it('preserves all valid observation mod properties', function () { + it('preserves all valid observation mod properties', function() { const expectedMod: Required = { ...modJson as any, @@ -65,7 +64,7 @@ describe('observation json dto transform', function () { expect(mod).to.deep.equal(expectedMod) }) - it('adds geojson type property if not present', function () { + it('adds geojson type property if not present', function() { delete modJson.type let mod = exoObservationModFromJson(modJson) as ExoObservationMod @@ -80,13 +79,13 @@ describe('observation json dto transform', function () { describe('validation', () => { - it('fails if the json is not an object hash', function () { + it('fails if the json is not an object hash', function() { [ - [true, 'boolean'], - [0, 'number'], - ['invalid', 'string'], - [[], 'array'], - [null, 'null'], + [ true, 'boolean' ], + [ 0, 'number' ], + [ 'invalid', 'string' ], + [ [], 'array' ], + [ null, 'null' ], ].forEach(testCase => { const invalid = exoObservationModFromJson(testCase[0]) as InvalidInputError expect(invalid).to.be.instanceOf(MageError, testCase[1] as string) @@ -95,106 +94,106 @@ describe('observation json dto transform', function () { }) }) - it('fails if id is not a string', function () { + it('fails if id is not a string', function() { [ - [true, 'boolean'], - [0, 'number'], - [{}, 'object'], - [[], 'array'], - [null, 'null'], + [ true, 'boolean' ], + [ 0, 'number' ], + [ {}, 'object' ], + [ [], 'array' ], + [ null, 'null' ], ].forEach(testCase => { const invalidJson = { ...modJson, id: testCase[0] } const invalid = exoObservationModFromJson(invalidJson) as InvalidInputError expect(invalid).to.be.instanceOf(MageError, testCase[1] as string) expect(invalid.code).to.equal(ErrInvalidInput, testCase[1] as string) - expect(invalid.data).to.deep.equal([['id']], testCase[1] as string) + expect(invalid.data).to.deep.equal([[ 'id' ]], testCase[1] as string) }) }) - it('fails if geojson type is not feature', function () { + it('fails if geojson type is not feature', function() { [ - [true, 'boolean'], - [0, 'number'], - [{}, 'object'], - [[], 'array'], - [null, 'null'], - ['FeatureCollection', 'wrong type'], - ['feature', 'case-sensitive'], + [ true, 'boolean' ], + [ 0, 'number' ], + [ {}, 'object' ], + [ [], 'array' ], + [ null, 'null' ], + [ 'FeatureCollection', 'wrong type' ], + [ 'feature', 'case-sensitive' ], ].forEach(testCase => { const invalidJson = { ...modJson, type: testCase[0] } const invalid = exoObservationModFromJson(invalidJson) as InvalidInputError expect(invalid).to.be.instanceOf(MageError, testCase[1] as string) expect(invalid.code).to.equal(ErrInvalidInput, testCase[1] as string) - expect(invalid.data).to.deep.equal([['type']], testCase[1] as string) + expect(invalid.data).to.deep.equal([[ 'type' ]], testCase[1] as string) }) }) - it('fails if bbox is present and not an array', function () { + it('fails if bbox is present and not an array', function() { [ - [true, 'boolean'], - [0, 'number'], - [{}, 'object'], - [null, 'null'], - ['wut', 'string'], + [ true, 'boolean' ], + [ 0, 'number' ], + [ {}, 'object' ], + [ null, 'null' ], + [ 'wut', 'string' ], ].forEach(testCase => { const invalidJson = { ...modJson, bbox: testCase[0] } const invalid = exoObservationModFromJson(invalidJson) as InvalidInputError expect(invalid).to.be.instanceOf(MageError, testCase[1] as string) expect(invalid.code).to.equal(ErrInvalidInput, testCase[1] as string) - expect(invalid.data).to.deep.equal([['bbox']], testCase[1] as string) + expect(invalid.data).to.deep.equal([[ 'bbox' ]], testCase[1] as string) }) const valid = exoObservationModFromJson(_.omit(modJson, 'bbox')) as ExoObservationMod expect(valid).to.not.be.instanceOf(Error) }) - it('fails if geometry is not an object hash', function () { + it('fails if geometry is not an object hash', function() { [ - [true, 'boolean'], - [0, 'number'], - [[], 'array'], - [null, 'null'], - ['wut', 'string'], + [ true, 'boolean' ], + [ 0, 'number' ], + [ [], 'array' ], + [ null, 'null' ], + [ 'wut', 'string' ], ].forEach(testCase => { const invalidJson = { ...modJson, geometry: testCase[0] } const invalid = exoObservationModFromJson(invalidJson) as InvalidInputError expect(invalid).to.be.instanceOf(MageError, testCase[1] as string) expect(invalid.code).to.equal(ErrInvalidInput, testCase[1] as string) - expect(invalid.data).to.deep.equal([['geometry']], testCase[1] as string) + expect(invalid.data).to.deep.equal([[ 'geometry' ]], testCase[1] as string) }) }) - it('fails if properties is not an object hash', function () { + it('fails if properties is not an object hash', function() { [ - [true, 'boolean'], - [0, 'number'], - [[], 'array'], - [null, 'null'], - ['wut', 'string'], + [ true, 'boolean' ], + [ 0, 'number' ], + [ [], 'array' ], + [ null, 'null' ], + [ 'wut', 'string' ], ].forEach(testCase => { const invalidJson = { ...modJson, properties: testCase[0] } const invalid = exoObservationModFromJson(invalidJson) as InvalidInputError expect(invalid).to.be.instanceOf(MageError, testCase[1] as string) expect(invalid.code).to.equal(ErrInvalidInput, testCase[1] as string) - expect(invalid.data).to.deep.equal([['properties']], testCase[1] as string) + expect(invalid.data).to.deep.equal([[ 'properties' ]], testCase[1] as string) }) }) - it('fails if the timestamp is not an iso-8601 date string', function () { + it('fails if the timestamp is not an iso-8601 date string', function() { [ - [true, 'boolean'], - [0, 'number'], - [[], 'array'], - [{}, 'object'], - [null, 'null'], - ['wut', 'string'], - ['31 Oct', 'not iso'] + [ true, 'boolean' ], + [ 0, 'number' ], + [ [], 'array' ], + [ {}, 'object' ], + [ null, 'null' ], + [ 'wut', 'string' ], + [ '31 Oct', 'not iso' ] ].forEach(testCase => { - const invalidJson = { ...modJson, properties: { ...modPropertiesJson, timestamp: testCase[0] } } + const invalidJson = { ...modJson, properties: { ...modPropertiesJson, timestamp: testCase[0] }} const invalid = exoObservationModFromJson(invalidJson) as InvalidInputError expect(invalid).to.be.instanceOf(MageError, testCase[1] as string) expect(invalid.code).to.equal(ErrInvalidInput, testCase[1] as string) - expect(invalid.data).to.deep.equal([['properties', 'timestamp']], testCase[1] as string) + expect(invalid.data).to.deep.equal([[ 'properties', 'timestamp' ]], testCase[1] as string) }) }) }) diff --git a/service/test/event/eventReadTest.js b/service/test/event/eventReadTest.js index b3d711128..f909e2cb1 100644 --- a/service/test/event/eventReadTest.js +++ b/service/test/event/eventReadTest.js @@ -42,14 +42,6 @@ describe("event read tests", function () { .expects('appendToConfig') .resolves(config); - sinon.stub(TeamModel, 'find').returns({ - lean: sinon.stub().resolves([]) - }); - - sinon.stub(EventModel, 'count').returns({ - exec: sinon.stub().resolves(0) - }); - userId = new mongoose.Types.ObjectId(); app = require('../../lib/express').app; }); @@ -73,71 +65,48 @@ describe("event read tests", function () { _id: eventId, name: 'Mock Event' }); - - const findStub = sinon.mock(EventModel) + sinon.mock(EventModel) .expects('find') - .callsFake((query, projection, callback) => { - expect(query).to.have.property('complete'); - expect(query.complete).to.deep.equal({ $ne: true }); - - if (callback) callback(null, [mockEvent]); - return null; - }); + .withArgs({ complete: { $ne: true } }) + .yields(null, [mockEvent]); request(app) .get('/api/events') .set('Accept', 'application/json') .set('Authorization', 'Bearer 12345') .expect(200) - .expect(function (res) { - should.exist(res.body); - res.body.should.be.an('array'); - expect(findStub.calledOnce).to.be.true; - }) .end(done); }); it("should read active events if user has read permission in acl", function (done) { mockTokenWithPermission(''); - const mockEvent1 = new EventModel({ + const mockEvent1 = { _id: 1, name: 'Mock Event', - acl: {} - }); + acl: { + userId: userId, + role: 'GUEST' + } + }; mockEvent1.acl[userId] = 'GUEST'; - const chain = { sort: () => chain, limit: () => chain, skip: () => chain }; - const findStub = sinon.stub(EventModel, 'find').callsFake((query, projection, callback) => { - expect(query).to.have.property('$and'); - expect(query.$and).to.be.an('array').with.length.greaterThan(0); - - expect(query).to.have.property('complete'); - expect(query.complete).to.deep.equal({ $ne: true }); - - const accessClause = query.$and.find(clause => clause.$or); - expect(accessClause).to.exist; - expect(accessClause.$or).to.be.an('array').with.length(2); - - const teamClause = accessClause.$or.find(clause => clause.teamIds); - expect(teamClause).to.exist; - expect(teamClause.teamIds).to.have.property('$in'); - expect(teamClause.teamIds.$in).to.be.an('array'); - - const aclClause = accessClause.$or.find(clause => clause[`acl.${userId.toString()}`]); - expect(aclClause).to.exist; - expect(aclClause[`acl.${userId.toString()}`]).to.have.property('$in'); - - const allowedRoles = aclClause[`acl.${userId.toString()}`].$in; - expect(allowedRoles).to.include.members(['OWNER', 'MANAGER', 'GUEST']); - expect(allowedRoles).to.have.lengthOf(3); + const mockEvent2 = { + _id: 2, + name: 'Mock Event', + acl: {} + }; - expect(allowedRoles).to.not.include('NONE'); - expect(allowedRoles).to.not.include('ADMIN'); + const mockCursor = { + toArray: function (callback) { + callback(null, [mockEvent1, mockEvent2]); + } + }; - setImmediate(() => callback(null, [mockEvent1])); - return chain; - }); + sinon.mock(EventModel.collection) + .expects('find') + .withArgs({ complete: { $ne: true } }) + .yields(null, mockCursor); request(app) .get('/api/events') @@ -147,7 +116,7 @@ describe("event read tests", function () { .expect(function (res) { should.exist(res.body); res.body.should.be.an('array'); - expect(findStub.calledOnce).to.be.true; + expect(res.body).to.have.lengthOf(1); }) .end(done); }); @@ -173,28 +142,20 @@ describe("event read tests", function () { } }); - const chain = { sort: () => chain, limit: () => chain, skip: () => chain }; - const findStub = sinon.stub(EventModel, 'find').callsFake((query, projection, callback) => { - expect(query).to.have.property('$and'); - expect(query.$and).to.be.an('array').with.length.greaterThan(0); - - const teamClause = query.$and.find(clause => - clause.$or && clause.$or.some(orClause => - orClause.teamIds && orClause.teamIds.$in - ) - ); - expect(teamClause).to.exist; - - expect(query).to.have.property('complete'); - expect(query.complete).to.deep.equal({ $ne: true }); - - setImmediate(() => callback(null, [mockEvent1])); - return chain; + const mockEvent2 = new EventModel({ + _id: eventId, + name: 'Mock Event 267', + acl: {} }); - sinon.stub(EventModel, 'populate').callsFake((docs, paths, cb) => { - setImmediate(() => cb(null, docs)); - }); + sinon.mock(EventModel) + .expects('populate') + .yields(null, [mockEvent1, mockEvent2]); + + sinon.mock(EventModel) + .expects('find') + .withArgs({ complete: { $ne: true } }) + .yields(null, [mockEvent1, mockEvent2]); request(app) .get('/api/events?populate=false') @@ -204,7 +165,7 @@ describe("event read tests", function () { .expect(function (res) { should.exist(res.body); res.body.should.be.an('array'); - expect(findStub.calledOnce).to.be.true; + expect(res.body).to.have.lengthOf(1); }) .end(done); }); @@ -220,29 +181,20 @@ describe("event read tests", function () { acl: {} }); - const chain2 = { sort: () => chain2, limit: () => chain2, skip: () => chain2 }; - const findStub = sinon.stub(EventModel, 'find').callsFake((query, projection, callback) => { - expect(query).to.have.property('$and'); - expect(query.$and).to.be.an('array').with.length.greaterThan(0); - - expect(query).to.have.property('complete'); - expect(query.complete).to.deep.equal({ $ne: true }); - - const accessClause = query.$and.find(clause => - clause.$or && ( - clause.$or.some(orClause => orClause.teamIds) || - clause.$or.some(orClause => orClause[`acl.${userId.toString()}`]) - ) - ); - expect(accessClause).to.exist; - - setImmediate(() => callback(null, [])); - return chain2; + const mockEvent2 = new EventModel({ + _id: eventId, + name: 'Mock Event 2', + acl: {} }); - sinon.stub(EventModel, 'populate').callsFake((docs, paths, cb) => { - setImmediate(() => cb(null, docs)); - }); + sinon.mock(EventModel) + .expects('populate') + .yields(null, [mockEvent1, mockEvent2]); + + sinon.mock(EventModel) + .expects('find') + .withArgs({ complete: { $ne: true } }) + .yields(null); request(app) .get('/api/events?populate=false') @@ -250,10 +202,10 @@ describe("event read tests", function () { .set('Authorization', 'Bearer 12345') .expect(200) .expect(function (res) { + console.log('res.body', res.body); should.exist(res.body); res.body.should.be.an('array'); expect(res.body).to.have.lengthOf(0); - expect(findStub.calledOnce).to.be.true; }) .end(done); }); @@ -266,18 +218,14 @@ describe("event read tests", function () { _id: eventId, name: 'Mock Event' }); + sinon.mock(EventModel) + .expects('find') + .withArgs({ complete: true }) + .yields(null, [mockEvent]); - const chain3 = { sort: () => chain3, limit: () => chain3, skip: () => chain3 }; - const findStub = sinon.stub(EventModel, 'find').callsFake((query, projection, callback) => { - expect(query).to.have.property('complete', true); - - setImmediate(() => callback(null, [mockEvent])); - return chain3; - }); - - sinon.stub(EventModel, 'populate').callsFake((docs, paths, cb) => { - setImmediate(() => cb(null, docs)); - }); + sinon.mock(EventModel) + .expects('populate') + .yields(null, [mockEvent]); request(app) .get('/api/events') @@ -285,11 +233,6 @@ describe("event read tests", function () { .set('Accept', 'application/json') .set('Authorization', 'Bearer 12345') .expect(200) - .expect(function (res) { - should.exist(res.body); - res.body.should.be.an('array'); - expect(findStub.calledOnce).to.be.true; - }) .end(done); }); @@ -301,18 +244,14 @@ describe("event read tests", function () { _id: eventId, name: 'Mock Event' }); + sinon.mock(EventModel) + .expects('find') + .withArgs({}) + .yields(null, [mockEvent]); - const chain4 = { sort: () => chain4, limit: () => chain4, skip: () => chain4 }; - const findStub = sinon.stub(EventModel, 'find').callsFake((query, projection, callback) => { - expect(query).to.not.have.property('complete'); - - setImmediate(() => callback(null, [mockEvent])); - return chain4; - }); - - sinon.stub(EventModel, 'populate').callsFake((docs, paths, cb) => { - setImmediate(() => cb(null, docs)); - }); + sinon.mock(EventModel) + .expects('populate') + .yields(null, [mockEvent]); request(app) .get('/api/events') @@ -320,11 +259,6 @@ describe("event read tests", function () { .set('Accept', 'application/json') .set('Authorization', 'Bearer 12345') .expect(200) - .expect(function (res) { - should.exist(res.body); - res.body.should.be.an('array'); - expect(findStub.calledOnce).to.be.true; - }) .end(done); }); @@ -386,12 +320,7 @@ describe("event read tests", function () { const eventId = 1; const mockEvent = new EventModel({ _id: eventId, - name: 'Mock Event', - teamIds: { - toObject: function () { - return [1]; - } - } + name: 'Mock Event' }); sinon.mock(EventModel).expects('findById').twice() @@ -403,16 +332,19 @@ describe("event read tests", function () { name: 'Mock Team' }); - const mockQuery = { - sort: sinon.stub().returnsThis(), - populate: sinon.stub().returnsThis(), - limit: sinon.stub().returnsThis(), - skip: sinon.stub().resolves([mockTeam]) + const mockCursor = { + toArray: function (callback) { + callback(null, [mockTeam]); + } }; - TeamModel.find.restore(); - sinon.stub(TeamModel, 'find').returns(mockQuery); - sinon.stub(TeamModel, 'countDocuments').resolves(1); + sinon.mock(TeamModel.collection) + .expects('find') + .yields(null, mockCursor); + + sinon.mock(TeamModel) + .expects('count') + .resolves(1); request(app) .get('/api/events/1/teams?page=0') @@ -504,24 +436,20 @@ describe("event read tests", function () { .end(done); }); - it("reads teams in event with team access", async function () { + it("reads teams in event with team access", async function() { mockTokenWithPermission(''); const eventId = 1; const mockTeam = new TeamModel({ _id: mongoose.Types.ObjectId(), - userIds: [userId], + userIds: [ userId ], acl: {} }); const mockEvent = new EventModel({ _id: eventId, name: 'Mock Event 123', - teamIds: { - toObject: function () { - return [mockTeam._id]; - } - }, + teamIds: [ mockTeam._id ], acl: { 1: 'NONE' } @@ -531,16 +459,19 @@ describe("event read tests", function () { .onFirstCall().yieldsAsync(null, mockEvent) .onSecondCall().resolves(mockEvent); - const mockQuery = { - sort: sinon.stub().returnsThis(), - populate: sinon.stub().returnsThis(), - limit: sinon.stub().returnsThis(), - skip: sinon.stub().resolves([mockTeam]) + const mockCursor = { + toArray: function (callback) { + callback(null, [mockTeam]); + } }; - TeamModel.find.restore(); - sinon.stub(TeamModel, 'find').returns(mockQuery); - sinon.stub(TeamModel, 'countDocuments').resolves(1); + sinon.mock(TeamModel.collection) + .expects('find') + .yields(null, mockCursor); + + sinon.mock(TeamModel) + .expects('count') + .resolves(1); sinon.mock(eventPermissions) .expects('authorizeEventAccess') @@ -551,7 +482,7 @@ describe("event read tests", function () { .get('/api/events/1/teams?page=0') .set('Accept', 'application/json') .set('Authorization', 'Bearer 12345') - .query({ populate: 'users' }); + .query({populate: 'users'}); expect(res.status).to.equal(200) }); diff --git a/web-app/admin/src/@types/dashboard/admin-dashboard.ts b/web-app/admin/src/@types/dashboard/admin-dashboard.ts deleted file mode 100644 index 95d2aa85c..000000000 --- a/web-app/admin/src/@types/dashboard/admin-dashboard.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { User } from "core-lib-src/user"; - -export type LoginPage = { - logins: Login[]; - next: string; - prev: string; -}; - -export type Login = { - device: Device; - id: string; - timestamp: Date; - user: User; -}; - -export type LoginSearchResults = { - active: boolean; - allPhones: string; - displayName: string; - enabled: boolean; - id: string; - username: string; -}; - -export type Device = { - appVersion: string; - id: string; - registered: boolean; - uid: number | string; - userAgent: string; - userId: string; - iconClass: string; -}; - -export type LoginFilter = { - user?: User | null; - deviceIds?: string | null; - startDate?: Date | null; - endDate?: Date | null; -}; - -export type Sort = { - displayName: number; - _id: number; -} - -export type UserFilter = { - pageSize: number; - pageIndex: number; - sort: Sort; - active?: boolean; - enabled?: boolean; -} - -export type PageLinks = { - next: string | null; - prev: string | null; -} - -export type PageInfo = { - totalCount: number; - pageSize: number; - pageIndex: number; - items: User[]; - links: PageLinks; -} - -export type Category = { - countFilter: Record; - userFilter: UserFilter; - searchFilter: string; - userCount: number; - pageInfo: PageInfo; -} - -export type UsersResponse = { - all: Category; - active: Category; - inactive: Category; - disabled: Category; -} -export type DeviceUser = { - displayName: string; - id: string; -}; - -export type DeviceSort = { - userAgent: number; - _id: number; -}; - -export type DeviceFilter = { - limit: number; - sort: DeviceSort; - registered?: boolean; -}; - -export type DevicePageLinks = { - base: string; - context: string; - next: string | null; - prev: string | null; - self: string; -}; - -export type DevicePageInfo = { - links: DevicePageLinks; - limit: number; - size: number; - start: number; - devices: Device[]; -}; - -export type DeviceCategory = { - countFilter: Record; - deviceFilter: DeviceFilter; - searchFilter: string; - deviceCount: number; - pageInfo: DevicePageInfo; -}; - -export type DevicesResponse = { - all: DeviceCategory; - registered: DeviceCategory; - unregistered: DeviceCategory; -}; diff --git a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-local/password-policy/password-policy.component.html b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-local/password-policy/password-policy.component.html index 92f8af70b..1e72c95f1 100644 --- a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-local/password-policy/password-policy.component.html +++ b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-local/password-policy/password-policy.component.html @@ -1,286 +1,132 @@
-
Password Policies
+
Password Policies
-
-
- Minimum Password Requirements for User Accounts -
- -
- - - - - - - Minimum Letters - info - -
- -
- - - - - - - Maximum Consecutive Letters - info - -
- -
- - - - - - - Lowercase Letters - info - -
- -
- - - - - - - Uppercase Letters - info - -
- -
- - - - - - - Numbers - info - -
- -
- - - - - - - Special Characters - info - -
+
Minimum Password Requirements for User Accounts
+
+ + + + + + Minimum Letters +
+
+ + + + + + Maximum Consecutive Letters +
+
+ + + + + + Lowercase Letters +
+
+ + + + + + Uppercase Letters +
+
+ + + + + + Numbers +
+
+ + + + + + Special Characters +
-
-
User Password Policies
- -
- - - - - - - Minimum Password Length - info - -
- -
- - - - - - - Previous Passwords Remembered - info - -
+
User Password Policies
+
+ + + + + + Minimum Password Length +
+
+ + + + + + Previous Passwords + Remembered +
-
-
User Password Policy Help
- -
- - - - Customize password help message - info - -
- -
- - - This is the help text that is displayed to the user during password - creation/update, when their password fails to meet the password - policy. - -
-
+
User Password Policy Help
+
+ + + Customize password help message +
+
+ + + This is the help + text that is displayed to the user during password + creation/update, when their password fails to meet the password + policy. + +
+ \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-local/password-policy/password-policy.component.scss b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-local/password-policy/password-policy.component.scss index 2220d2165..4fca487cd 100644 --- a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-local/password-policy/password-policy.component.scss +++ b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-local/password-policy/password-policy.component.scss @@ -18,13 +18,4 @@ mat-form-field { mat-checkbox { margin-right: 8px; -} - -.info-icon { - font-size: 16px; - vertical-align: middle; - margin-left: 4px; - cursor: pointer; - color: rgba(0, 0, 0, 0.54); - margin-top: 6px; -} +} \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-authentication/admin-authentication.component.html b/web-app/admin/src/app/admin/admin-authentication/admin-authentication.component.html index 82cef6622..642ae1482 100644 --- a/web-app/admin/src/app/admin/admin-authentication/admin-authentication.component.html +++ b/web-app/admin/src/app/admin/admin-authentication/admin-authentication.component.html @@ -1,93 +1,58 @@ - -
-
- -
+ +
+
+
+ +
- -
- - - - - security - - - - - {{ strategy.title }} - - -
Enabled
-
Disabled
-
-
-
- - - Enable Authentication -
- - -
- + +
+ + + + + security + + + + + {{strategy.title}} + + +
Enabled
+
Disabled
+
+
+
+ + + Enable Authentication +
+ + +
+ +
+
- -
- +
-
- -
-
+
+ +
+ \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-authentication/admin-authentication.component.scss b/web-app/admin/src/app/admin/admin-authentication/admin-authentication.component.scss index 625b5c202..3fd71f1ab 100644 --- a/web-app/admin/src/app/admin/admin-authentication/admin-authentication.component.scss +++ b/web-app/admin/src/app/admin/admin-authentication/admin-authentication.component.scss @@ -62,7 +62,6 @@ mat-icon { display: flex; flex-direction: column; align-items: flex-end; - margin-top: 10px; - margin-right: 25px; - margin-bottom: 15px; + margin-top: 4px; + margin-right: 8px; } \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.html b/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.html index bac365b73..26e5b2218 100644 --- a/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.html +++ b/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.html @@ -1,21 +1,8 @@
- {{ breadcrumb.icon }} - + {{breadcrumb.icon}}
- - {{ breadcrumb.title }} - + {{breadcrumb.title}}
/ diff --git a/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.scss b/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.scss index 251480d1e..24b48f4e5 100644 --- a/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.scss +++ b/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.scss @@ -1,57 +1,40 @@ @use '@angular/material' as mat; -@import 'variables.scss'; - -::ng-deep admin { - .admin-main-content { - &:has(mage-admin-plugin-tab-content) { - margin-top: 55px; - } - } - - .admin-breadcrumbs { - position: sticky; - top: 0; - display: flex; - flex-direction: row; - align-items: center; - padding: 16px 0px 16px 115px; - background-color: white; - z-index: 100; - height: 55px; - margin-bottom: 10px; - - .admin-breadcrumb { - color: mat.get-color-from-palette($app-primary); - cursor: pointer; - } +@import "variables.scss"; + +.admin-breadcrumbs { + position: sticky; + top: 0; + display: flex; + flex-direction: row; + align-items: center; + padding: 16px; + background-color: white; + z-index: 100; +} - .admin-breadcrumb:hover { - color: mat.get-color-from-palette($app-primary); - opacity: 0.6; - } +.admin-breadcrumb { + color: mat.get-color-from-palette($app-primary); + cursor: pointer; +} - .admin-breadcrumb--active, - .admin-breadcrumb--active:hover { - color: #000; - cursor: unset; - opacity: 1; - } +.admin-breadcrumb:hover { + color: mat.get-color-from-palette($app-primary); + opacity: .6; +} - .admin-breadcrumb__separator { - color: rgba(0, 0, 0, 0.4); - margin: 0 8px; - } +.admin-breadcrumb--active, +.admin-breadcrumb--active:hover { + color: rgba(0, 0, 0, .6); + cursor: unset; + opacity: 1; +} - mat-icon, - i { - color: mat.get-color-from-palette($app-primary); - margin-right: 7px; - margin-left: 7px; - line-height: 26px; - } +.admin-breadcrumb__separator { + color: rgba(0, 0, 0, .4); + margin: 0 8px; +} - .icon-fix { - font-size: 1.4em; - } - } +mat-icon { + color: mat.get-color-from-palette($app-primary); + margin-right: 4px; } diff --git a/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.spec.ts b/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.spec.ts index bb1ca8254..49eea5eda 100644 --- a/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.spec.ts @@ -110,31 +110,36 @@ describe('AdminBreadcrumbComponent', () => { }); it('should have one active and two inactive breadcrumb', () => { - component.breadcrumbs = [ - { - title: 'Title', - icon: 'map', - state: { name: 'name', params: { param1: 'toast' } }, - }, - { - title: 'Title2', - state: { name: 'name2', params: { param1: 'toast2' } }, - }, - { - title: 'Inactive', - icon: 'map', - }, - ]; + component.breadcrumbs = [{ + title: 'Title', + icon: 'map', + state: { + name: 'name', + params: { + param1: 'toast' + } + } + }, { + title: 'Title2', + state: { + name: 'name2', + params: { + param1: 'toast2' + } + } + }, { + title: 'Inactive', + icon: 'map' + }] fixture.detectChanges(); - const breadcrumbElements = element.querySelectorAll('.admin-breadcrumb'); expect(breadcrumbElements.length).toEqual(3); expect(element.querySelectorAll('.admin-breadcrumb__separator').length).toEqual(2); expect(element.querySelectorAll('.admin-breadcrumb--active').length).toEqual(1); expect(element.querySelectorAll('mat-icon').length).toEqual(2); - expect(breadcrumbElements.item(0).textContent.trim()).toEqual(component.breadcrumbs[0].title); - expect(breadcrumbElements.item(1).textContent.trim()).toEqual(component.breadcrumbs[1].title); - expect(breadcrumbElements.item(2).textContent.trim()).toEqual(component.breadcrumbs[2].title); + + expect(breadcrumbElements.item(0).innerHTML).toEqual(component.breadcrumbs[0].title); + expect(breadcrumbElements.item(1).innerHTML).toEqual(component.breadcrumbs[1].title); + expect(breadcrumbElements.item(2).innerHTML).toEqual(component.breadcrumbs[2].title); }); - }); diff --git a/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.ts b/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.ts index 4e5345703..92c9229a6 100644 --- a/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.ts +++ b/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.ts @@ -9,7 +9,6 @@ import { StateService } from '@uirouter/angular'; }) export class AdminBreadcrumbComponent { @Input() icon: string - @Input() iconClass: string @Input() breadcrumbs: AdminBreadcrumb[] constructor(private stateService: StateService) {} diff --git a/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.model.ts b/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.model.ts index 0c8cffd20..cde3790f7 100644 --- a/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.model.ts +++ b/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.model.ts @@ -3,7 +3,6 @@ import { RawParams, StateOrName } from '@uirouter/angular'; export interface AdminBreadcrumb { title: string icon?: string - iconClass?: string state?: AdminBreadcrumbState } diff --git a/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.html b/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.html deleted file mode 100644 index bc0d33711..000000000 --- a/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.html +++ /dev/null @@ -1,139 +0,0 @@ - - -
- -
-
-
- - - - Inactive Users - - - -
- - Search - - -
- - - person -
{{ user?.displayName || 'Unknown User' }}
- -
-
-
- - -
-
-
- -
- - - - Unregistered Devices - - - -
- - Search - - -
- - - -
- {{ d.user?.displayName || 'Unknown User' }} - ({{ d?.uid || 'Unknown UID' }}) -
- -
-
-
- - -
-
-
-
-
-
- -
-
- -
-
-
diff --git a/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.module.ts b/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.module.ts deleted file mode 100644 index 497aa31e4..000000000 --- a/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.module.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { AdminDashboardComponent } from './admin-dashboard'; -import { LoginsModule } from '../../logins/logins.module'; -import { MatToolbarModule } from '@angular/material/toolbar'; -import { MatIconModule } from '@angular/material/icon'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatListModule } from '@angular/material/list'; -import { MatBadgeModule } from '@angular/material/badge'; -import { MatSelectModule } from '@angular/material/select'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatNativeDateModule } from '@angular/material/core'; -import { AdminBreadcrumbModule } from '../admin-breadcrumb/admin-breadcrumb.module'; -import { MatTableModule } from '@angular/material/table'; - -@NgModule({ - declarations: [AdminDashboardComponent], - imports: [ - CommonModule, - FormsModule, - LoginsModule, - MatToolbarModule, - MatIconModule, - MatFormFieldModule, - MatInputModule, - MatButtonModule, - MatCardModule, - MatListModule, - MatBadgeModule, - MatSelectModule, - MatDatepickerModule, - MatAutocompleteModule, - MatNativeDateModule, - MatTableModule, - AdminBreadcrumbModule - ], - exports: [AdminDashboardComponent], -}) -export class AdminDashboardModule { } \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.scss b/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.scss deleted file mode 100644 index f29bf12ce..000000000 --- a/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.scss +++ /dev/null @@ -1,256 +0,0 @@ -::ng-deep .admin-main-content { - transition: margin-left 0.3s; - &:has(admin-dashboard) { - height: 92vh; - overflow-y: auto; - -webkit-overflow-scrolling: touch; - - @media (max-width: 959px) { - overflow: auto; - } - } - - width: 100%; -} - -.admin-content { - display: flex; - flex-direction: column; - gap: 10px; - padding: 10px; - overflow: hidden; - - .mat-card-title { - font-size: 15px; - } - - .top-card { - height: 31vh; - - @media (max-width: 959px) { - height: 800px; - } - - @media (max-height: 600px) { - height: 800px; - } - } - - .top-row { - display: flex; - gap: 24px; - height: 29vh; - - @media (max-width: 959px) { - height: 784px; - } - - @media (max-height: 600px) { - height: 784px; - } - - overflow: hidden; - - .inactive-users, - .unregistered-devices { - flex: 1; - min-width: 0; - display: flex; - flex-direction: column; - overflow: hidden; - - .search-wrapper { - background-color: #f0f0f0; - padding: 4px; - border: 1px solid black; - border-bottom: none; - } - - mat-card { - flex: 1; - display: flex; - flex-direction: column; - overflow: hidden; - padding: 4px 16px; - - mat-form-field { - margin-bottom: -21px; - } - - mat-list { - flex: 1; - overflow-y: auto; - max-height: 28vh; - border: 1px solid gray; - - :ng-deep .mat-list-base { - padding-top: 0; - } - - ::ng-deep mat-list-item .mat-list-item-content { - height: 20px; - } - - mat-list-item { - padding-top: 4px !important; - padding-bottom: 4px !important; - min-height: 48px; - - mat-icon { - font-size: 21px; - margin-right: 8px; - color: #666; - margin-top: 4px; - } - - div[matLine] { - font-size: 18px; - line-height: 1.2; - } - - button[mat-mini-button] { - font-size: 11px; - padding: 0 4px; - height: 24px; - line-height: 24px; - min-width: auto; - margin-left: auto; - display: inline-flex; - align-items: center; - - mat-icon { - font-size: 16px; - margin-right: 2px; - height: 18px; - width: 24px; - } - - span, - ::ng-deep .mat-button-wrapper { - line-height: 1; - display: flex; - align-items: center; - } - } - } - } - } - } - - @media (max-width: 959px) { - flex-direction: column; - max-height: none; - - .inactive-users, - .unregistered-devices { - height: 300px; - } - } - - @media (max-height: 600px) { - flex-direction: column; - max-height: none; - - .inactive-users, - .unregistered-devices { - height: 300px; - } - } - } - - .title-with-badge { - display: inline-flex; - align-items: center; - gap: 6px; - - .inline-badge { - position: absolute !important; - transform: none !important; - display: inline-flex; - vertical-align: middle; - right: 20px; - - ::ng-deep .mat-badge-content { - transform: none; - top: auto; - right: auto; - position: relative; - font-size: 11px; - height: 16px; - min-width: 16px; - line-height: 16px; - } - } - } - - .pagination-controls { - display: flex; - justify-content: space-between; - align-items: center; - margin-top: 24px; - - button { - min-width: 100px; - } - - @media (max-width: 480px) { - align-items: stretch; - gap: 12px; - - button { - width: 100%; - } - } - - @media (max-height: 600px) { - align-items: stretch; - gap: 12px; - - button { - width: 100%; - } - } - } - - .section-card { - background: white; - border-radius: 12px; - overflow: hidden; - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), - 0 2px 4px -1px rgba(0, 0, 0, 0.06); - border: 1px solid #e5e7eb; - margin-top: 8px; - margin-bottom: 24px; - } - - .table-wrapper { - --row-height: 73px; - --min-page-size: 5; - --base-table-height: calc(var(--row-height) * var(--min-page-size)); - - display: flex; - flex-direction: column; - position: relative; - } - - .table-scroll { - height: var(--base-table-height); - max-height: var(--base-table-height); - overflow-y: auto; - overflow-x: hidden; - -webkit-overflow-scrolling: touch; - overscroll-behavior: contain; - border-bottom: 1px solid #e5e7eb; - } - - .section-table-title { - font-size: 1rem; - font-weight: 600; - padding: 1rem 1.5rem 0.5rem 1.5rem; - color: #111827; - } -} - -.mt-5 { - margin-top: 3rem; -} diff --git a/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.spec.ts b/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.spec.ts deleted file mode 100644 index 6813c0cfd..000000000 --- a/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.spec.ts +++ /dev/null @@ -1,333 +0,0 @@ -import { - ComponentFixture, - TestBed, - fakeAsync, - tick, -} from "@angular/core/testing"; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { AdminDashboardComponent } from "./admin-dashboard"; -import { EventEmitter } from "@angular/core"; -import { - UserService, - DeviceService, - DevicePagingService, - EventService, - LayerService, - UserPagingService, -} from "admin/src/app/upgrade/ajs-upgraded-providers"; -import { User } from "core-lib-src/user"; -import { Device } from "admin/src/@types/dashboard/admin-dashboard"; -import { MatToolbarModule } from '@angular/material/toolbar'; -import { MatIconModule } from '@angular/material/icon'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatListModule } from '@angular/material/list'; -import { MatBadgeModule } from '@angular/material/badge'; -import { MatSelectModule } from '@angular/material/select'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatNativeDateModule } from '@angular/material/core'; -import { AdminBreadcrumbModule } from '../admin-breadcrumb/admin-breadcrumb.module'; -import { MatTableModule } from '@angular/material/table'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { StateService } from "@uirouter/angular"; - -const TEST_USERS: User[] = [ - { - id: "1", - username: "ranma77", - displayName: "Ranma Saotome", - active: true, - enabled: true, - authentication: "LOCAL", - createdAt: new Date().toDateString(), - lastUpdated: new Date().toDateString(), - recentEventIds: [], - role: "martial artist", - email: "ranma@example.com", - phones: [], - }, - { - id: "2", - username: "yusuke23", - displayName: "Yusuke Urameshi", - active: true, - enabled: true, - authentication: "LOCAL", - createdAt: new Date().toDateString(), - lastUpdated: new Date().toDateString(), - recentEventIds: [], - role: "spirit detective", - email: "yusuke@example.com", - phones: [], - }, - { - id: "3", - username: "goku_saiyan", - displayName: "Goku", - active: true, - enabled: true, - authentication: "LOCAL", - createdAt: new Date().toDateString(), - lastUpdated: new Date().toDateString(), - recentEventIds: [], - role: "saiyan warrior", - email: "goku@example.com", - phones: [], - }, -]; - -const TEST_DEVICES: Device[] = [ - { - id: "d1", - uid: "Ranma's Phone", - registered: true, - appVersion: "Web Client", - userAgent: "", - userId: "1", - iconClass: "", - }, - { - id: "d2", - uid: "Yusuke's Spirit Detector Device", - registered: true, - appVersion: "mobile", - userAgent: "iOS", - userId: "2", - iconClass: "", - }, - { - id: "d3", - uid: "Goku's Dragon Radar", - registered: false, - appVersion: "mobile", - userAgent: "android", - userId: "3", - iconClass: "", - }, -]; - -const mockState = { - go: jasmine.createSpy('go'), -}; - -const mockInjector = { - get: (token: string) => { - if (token === '$state') { - return mockState; - } - return null; - }, -}; - - -const mockUserService = { - myself: { role: { permissions: ["test.permission"] } }, - updateUser: jasmine.createSpy("updateUser"), -}; - -const mockDeviceService = { - updateDevice: jasmine - .createSpy("updateDevice") - .and.returnValue(Promise.resolve(TEST_DEVICES[0])), -}; - -const mockUserPagingService = { - constructDefault: () => ({}), - refresh: jasmine.createSpy("refresh").and.returnValue(Promise.resolve()), - users: jasmine.createSpy("users").and.callFake((state) => TEST_USERS), - count: jasmine.createSpy("count").and.returnValue(TEST_USERS.length), - hasNext: jasmine.createSpy("hasNext").and.returnValue(true), - hasPrevious: jasmine.createSpy("hasPrevious").and.returnValue(false), - next: jasmine - .createSpy("next") - .and.returnValue(Promise.resolve([TEST_USERS[1]])), - previous: jasmine - .createSpy("previous") - .and.returnValue(Promise.resolve([TEST_USERS[0]])), - search: jasmine.createSpy("search").and.callFake((state, term) => { - return Promise.resolve( - TEST_USERS.filter((u) => - u.displayName.toLowerCase().includes(term.toLowerCase()), - ), - ); - }), -}; - -const mockDevicePagingService = { - constructDefault: () => ({}), - refresh: jasmine.createSpy("refresh").and.returnValue(Promise.resolve()), - devices: jasmine.createSpy("devices").and.returnValue(TEST_DEVICES), - count: jasmine.createSpy("count").and.returnValue(TEST_DEVICES.length), - hasNext: jasmine.createSpy("hasNext").and.returnValue(true), - hasPrevious: jasmine.createSpy("hasPrevious").and.returnValue(false), - next: jasmine - .createSpy("next") - .and.returnValue(Promise.resolve([TEST_DEVICES[1]])), - previous: jasmine - .createSpy("previous") - .and.returnValue(Promise.resolve([TEST_DEVICES[0]])), - search: jasmine.createSpy("search").and.callFake((state, term) => { - return Promise.resolve( - TEST_DEVICES.filter((d) => - d.uid.toString().toLowerCase().includes(term.toLowerCase()), - ), - ); - }), -}; - -const mockEventService = {}; -const mockLayerService = {}; - -describe("AdminDashboardComponent", () => { - let component: AdminDashboardComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [AdminDashboardComponent], - imports: [ - CommonModule, - FormsModule, - MatToolbarModule, - MatIconModule, - MatFormFieldModule, - MatInputModule, - MatButtonModule, - MatCardModule, - MatListModule, - MatBadgeModule, - MatSelectModule, - MatDatepickerModule, - MatAutocompleteModule, - MatNativeDateModule, - MatTableModule, - AdminBreadcrumbModule, - BrowserAnimationsModule], - providers: [ - { provide: UserService, useValue: mockUserService }, - { provide: DeviceService, useValue: mockDeviceService }, - { provide: DevicePagingService, useValue: mockDevicePagingService }, - { provide: EventService, useValue: mockEventService }, - { provide: LayerService, useValue: mockLayerService }, - { provide: UserPagingService, useValue: mockUserPagingService }, - { provide: '$injector', useValue: mockInjector }, - { provide: StateService, useValue: mockState }, - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA], - }).compileComponents(); - - fixture = TestBed.createComponent(AdminDashboardComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it("should create", () => { - expect(component).toBeTruthy(); - }); - - it("should call services in ngOnInit", fakeAsync(() => { - tick(); - expect(mockUserPagingService.refresh).toHaveBeenCalled(); - expect(mockDevicePagingService.refresh).toHaveBeenCalled(); - expect(component.inactiveUsers.length).toBe(TEST_USERS.length); - expect(component.unregisteredDevices.length).toBe(TEST_DEVICES.length); - })); - - it("should navigate to user and device", () => { - component.gotoUser(TEST_USERS[0]); - expect(mockState.go).toHaveBeenCalledWith('admin.user', { userId: TEST_USERS[0].id }); - - - component.gotoDevice(TEST_DEVICES[0]); - expect(mockState.go).toHaveBeenCalledWith('admin.device', { deviceId: TEST_DEVICES[0].id }); - - }); - - it("should activate user and emit event", fakeAsync(() => { - const user = { ...TEST_USERS[0], active: false }; - component.onUserActivated = new EventEmitter(); - spyOn(component.onUserActivated, "emit"); - - mockUserService.updateUser.and.callFake((id, user, cb) => cb()); - - component.activateUser(new MouseEvent("click"), user); - tick(); - - expect(user.active).toBeTrue(); - expect(component.onUserActivated.emit).toHaveBeenCalledWith({ user }); - })); - - it("should register device and emit event", fakeAsync(() => { - const device = { ...TEST_DEVICES[0], registered: false }; - component.onDeviceEnabled = new EventEmitter(); - spyOn(component.onDeviceEnabled, "emit"); - - component.registerDevice(new MouseEvent("click"), device); - tick(); - - expect(device.registered).toBeTrue(); - expect(component.onDeviceEnabled.emit).toHaveBeenCalledWith({ - user: TEST_DEVICES[0], - }); - })); - - it("should return true if user has permission", () => { - expect(component.hasPermission("test.permission")).toBeTrue(); - expect(component.hasPermission("other.permission")).toBeFalse(); - }); - - it("should search users", fakeAsync(() => { - component.userSearch = "Ranma Saotome"; - component.search(); - tick(); - expect(component.inactiveUsers).toEqual([TEST_USERS[0]]); - })); - - it("should search devices", fakeAsync(() => { - component.deviceSearch = "Yusuke's Spirit Detector Device"; - component.searchDevices(); - tick(); - expect(component.unregisteredDevices).toEqual([TEST_DEVICES[1]]); - })); - - it("should handle previous and next user pages", fakeAsync(() => { - expect(component.hasNext()).toBeTrue(); - expect(component.hasPrevious()).toBeFalse(); - - component.next(); - tick(); - expect(component.inactiveUsers).toEqual([TEST_USERS[1]]); - - component.previous(); - tick(); - expect(component.inactiveUsers).toEqual([TEST_USERS[0]]); - })); - - it("should handle previous and next device pages", fakeAsync(() => { - expect(component.hasNextDevice()).toBeTrue(); - expect(component.hasPreviousDevice()).toBeFalse(); - - component.nextDevice(); - tick(); - expect(component.unregisteredDevices).toEqual([TEST_DEVICES[1]]); - - component.previousDevice(); - tick(); - expect(component.unregisteredDevices).toEqual([TEST_DEVICES[0]]); - })); - - it("should set icon classes correctly", () => { - expect(component.iconClass(TEST_DEVICES[0])).toContain( - "desktop", - ); - expect(component.iconClass(TEST_DEVICES[2])).toContain("android"); - expect(component.iconClass(TEST_DEVICES[1])).toContain("apple"); - expect(component.iconClass({ ...TEST_DEVICES[1], userAgent: "mobile" })).toContain("mobile"); - expect(component.iconClass(null)).toEqual(""); - }); -}); diff --git a/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.ts b/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.ts deleted file mode 100644 index 31cb85d63..000000000 --- a/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.ts +++ /dev/null @@ -1,286 +0,0 @@ -import { Component, Inject, OnInit, EventEmitter, Output } from "@angular/core"; -import * as angular from 'angular'; -import { Router } from "@angular/router"; -import * as _ from "underscore"; -import { - UserService, - DeviceService, - DevicePagingService, - UserPagingService, -} from "admin/src/app/upgrade/ajs-upgraded-providers"; -import { User } from "core-lib-src/user"; -import { - Device, - DevicesResponse, - UsersResponse, -} from "admin/src/@types/dashboard/admin-dashboard"; -import { AdminBreadcrumb } from "../admin-breadcrumb/admin-breadcrumb.model"; - -/** - * Admin dashboard component for managing users, devices, and logins. - */ -@Component({ - selector: "admin-dashboard", - templateUrl: "./admin-dashboard.html", - styleUrls: ["./admin-dashboard.scss"], -}) -export class AdminDashboardComponent implements OnInit { - @Output() onUserActivated = new EventEmitter(); - @Output() onDeviceEnabled = new EventEmitter(); - - users: User[] = []; - userSearch: string = ""; - userState: string = "inactive"; - inactiveUsers: User[] = []; - stateAndData: UsersResponse; - - devices: Device[] = []; - deviceSearch = ""; - deviceState = "unregistered"; - unregisteredDevices: Device[] = []; - deviceStateAndData: DevicesResponse; - - breadcrumbs: AdminBreadcrumb[] = [{ - title: 'Dashboard', - iconClass: 'fa fa-dashboard' - }] - - private $state: any; - - constructor( - private router: Router, - @Inject(UserService) private userService: any, - @Inject(DeviceService) private deviceService: any, - @Inject(DevicePagingService) private devicePagingService: any, - @Inject(UserPagingService) private userPagingService: any, - @Inject('$injector') private $injector: any, - ) { - this.$state = this.$injector.get('$state'); - } - - /** - * Initialize the component, loading users and devices data. - */ - ngOnInit(): void { - this.stateAndData = this.userPagingService.constructDefault(); - this.deviceStateAndData = this.devicePagingService.constructDefault(); - - this.devicePagingService.refresh(this.deviceStateAndData).then(() => { - this.unregisteredDevices = this.devicePagingService.devices( - this.deviceStateAndData[this.deviceState], - ); - }); - - this.userPagingService.refresh(this.stateAndData).then(() => { - this.inactiveUsers = this.userPagingService.users( - this.stateAndData[this.userState], - ); - }); - } - - /** - * Check the total count of users for the current state. - */ - count() { - return this.userPagingService.count(this.stateAndData[this.userState]); - } - - /** - * Check if there is a next page of users. - */ - hasNext() { - return this.userPagingService.hasNext(this.stateAndData[this.userState]); - } - - /** - * Load the next page of users. - */ - next() { - this.userPagingService - .next(this.stateAndData[this.userState]) - .then((users) => { - this.inactiveUsers = users; - }); - } - - /** - * Check if there is a previous page of users. - */ - hasPrevious() { - return this.userPagingService.hasPrevious( - this.stateAndData[this.userState], - ); - } - - /** - * Load the previous page of users. - */ - previous() { - this.userPagingService - .previous(this.stateAndData[this.userState]) - .then((users) => { - this.inactiveUsers = users; - }); - } - - /** - * Check the total count of devices for the current state. - */ - deviceCount() { - return this.devicePagingService.count( - this.deviceStateAndData[this.deviceState], - ); - } - - /** - * Check if there is a next page of devices. - */ - hasNextDevice() { - return this.devicePagingService.hasNext( - this.deviceStateAndData[this.deviceState], - ); - } - - /** - * Load the next page of devices. - */ - nextDevice() { - this.devicePagingService - .next(this.deviceStateAndData[this.deviceState]) - .then((devices) => { - this.unregisteredDevices = devices; - }); - } - - /** - * Check if there is a previous page of devices. - */ - hasPreviousDevice() { - return this.devicePagingService.hasPrevious( - this.deviceStateAndData[this.deviceState], - ); - } - - /** - * Load the previous page of devices. - */ - previousDevice() { - this.devicePagingService - .previous(this.deviceStateAndData[this.deviceState]) - .then((devices) => { - this.unregisteredDevices = devices; - }); - } - - /** - * Search users based on the `userSearch` string. - */ - search() { - this.userPagingService - .search(this.stateAndData[this.userState], this.userSearch) - .then((users) => { - this.inactiveUsers = users; - }); - } - - /** - * Search devices based on the `deviceSearch` string. - */ - searchDevices() { - this.devicePagingService - .search(this.deviceStateAndData[this.deviceState], this.deviceSearch) - .then((devices) => { - if (devices.length > 0) { - this.unregisteredDevices = devices; - } else { - this.devicePagingService - .search( - this.deviceStateAndData[this.deviceState], - this.deviceSearch, - this.deviceSearch, - ) - .then((devices) => { - this.unregisteredDevices = devices; - }); - } - }); - } - - /** - * Determine the icon class for a device based on its type or user agent. - * @param device The device to determine the icon for. - */ - iconClass(device: Device): string { - if (!device) return ""; - if (device.iconClass) return device.iconClass; - - const userAgent = (device.userAgent || "").toLowerCase(); - if (device.appVersion === "Web Client") - return "fa fa-desktop admin-desktop-icon-xs"; - if (userAgent.includes("android")) - return "fa fa-android admin-android-icon-xs"; - if (userAgent.includes("ios")) return "fa fa-apple admin-apple-icon-xs"; - return "fa fa-mobile admin-generic-icon-xs"; - } - - /** - * Navigate to the user details page. - * @param user The user to view. - */ - gotoUser(user: User) { - this.$state.go('admin.user', { userId: user.id }); - } - - /** - * Navigate to the device details page. - * @param device The device to view. - */ - gotoDevice(device: Device) { - this.$state.go('admin.device', { deviceId: device.id }); - } - - /** - * Check if the current user has a specific permission. - * @param permission The permission string to check. - */ - hasPermission(permission: string): boolean { - return _.contains(this.userService.myself.role.permissions, permission); - } - - /** - * Activate a user. - * @param event Mouse event to stop propagation. - * @param user The user to activate. - */ - activateUser(event: MouseEvent, user: User) { - event.stopPropagation(); - user.active = true; - this.userService.updateUser(user.id, user, () => { - this.userPagingService.refresh(this.stateAndData).then(() => { - this.inactiveUsers = this.userPagingService.users( - this.stateAndData[this.userState], - ); - }); - this.onUserActivated.emit({ user }); - }); - } - - /** - * Register a device. - * @param event Mouse event to stop propagation. - * @param device The device to register. - */ - registerDevice(event: MouseEvent, device: Device) { - event.stopPropagation(); - device.registered = true; - - this.deviceService.updateDevice(device).then((updated: User) => { - this.devicePagingService.refresh(this.deviceStateAndData).then(() => { - this.unregisteredDevices = this.devicePagingService.devices( - this.deviceStateAndData[this.deviceState], - ); - }); - this.onDeviceEnabled.emit({ user: updated }); - }); - } -} diff --git a/web-app/admin/src/app/admin/admin-event/admin-event-form/admin-event-form-preview/admin-event-form-preview.component.ts b/web-app/admin/src/app/admin/admin-event/admin-event-form/admin-event-form-preview/admin-event-form-preview.component.ts index 69863522f..d12f34c70 100644 --- a/web-app/admin/src/app/admin/admin-event/admin-event-form/admin-event-form-preview/admin-event-form-preview.component.ts +++ b/web-app/admin/src/app/admin/admin-event/admin-event-form/admin-event-form-preview/admin-event-form-preview.component.ts @@ -11,9 +11,9 @@ export class AdminEventFormPreviewComponent implements OnChanges { @Input() formDefinition: any[]; @Output() onClose = new EventEmitter(); - constructor(public dialog: MatDialog) { } + constructor(public dialog: MatDialog) {} - ngOnChanges(): void { + ngOnChanges(changes: SimpleChanges): void { if (this.formDefinition) { this.openDialog() } @@ -21,11 +21,11 @@ export class AdminEventFormPreviewComponent implements OnChanges { openDialog(): void { const dialog = this.dialog.open(AdminEventFormPreviewDialogComponent, { - data: this.formDefinition, - width: '600px', - maxWidth: '90vw' + data: this.formDefinition, + minWidth: 400, + autoFocus: false }) - + dialog.afterClosed().subscribe(() => { this.onClose.emit(); }); diff --git a/web-app/admin/src/app/admin/admin-event/admin-event-form/admin-event-form.module.ts b/web-app/admin/src/app/admin/admin-event/admin-event-form/admin-event-form.module.ts deleted file mode 100644 index 684585645..000000000 --- a/web-app/admin/src/app/admin/admin-event/admin-event-form/admin-event-form.module.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ReactiveFormsModule, FormsModule } from '@angular/forms'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatButtonModule } from '@angular/material/button'; - -import { AdminEventFormPreviewComponent } from './admin-event-form-preview/admin-event-form-preview.component'; -import { AdminEventFormPreviewDialogComponent } from './admin-event-form-preview/admin-event-form-preview-dialog.component'; -import { ObservationModule } from '../../../observation/observation.module'; - -@NgModule({ - declarations: [ - AdminEventFormPreviewComponent, - AdminEventFormPreviewDialogComponent - ], - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - MatDialogModule, - MatButtonModule, - ObservationModule - ], - exports: [ - AdminEventFormPreviewComponent, - AdminEventFormPreviewDialogComponent - ] -}) -export class AdminEventFormModule { } diff --git a/web-app/admin/src/app/admin/admin-event/admin-events.module.ts b/web-app/admin/src/app/admin/admin-event/admin-events.module.ts deleted file mode 100644 index f8d45026b..000000000 --- a/web-app/admin/src/app/admin/admin-event/admin-events.module.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { RouterModule } from '@angular/router'; - -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatChipsModule } from '@angular/material/chips'; -import { MatTableModule } from '@angular/material/table'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatSortModule } from '@angular/material/sort'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatSelectModule } from '@angular/material/select'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { DragDropModule } from '@angular/cdk/drag-drop'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatIconModule } from '@angular/material/icon'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; - -import { CoreModule } from '../../core/core.module'; -import { AdminBreadcrumbModule } from '../admin-breadcrumb/admin-breadcrumb.module'; -import { AdminEventFormModule } from './admin-event-form/admin-event-form.module'; - -import { EventDetailsComponent } from './event-details/event-details.component'; -import { DeleteEventComponent } from './delete-event/delete-event.component'; -import { CreateFormDialogComponent } from './create-form/create-form.component'; -import { EventDashboardComponent } from './dashboard/event-dashboard.component'; -import { MatOptionModule } from '@angular/material/core'; -import { EventService } from 'src/app/event/event.service'; -import { CreateEventDialogComponent } from './create-event/create-event.component'; - -@NgModule({ - declarations: [ - EventDashboardComponent, - CreateEventDialogComponent, - EventDetailsComponent, - DeleteEventComponent, - CreateFormDialogComponent - ], - imports: [ - CommonModule, - FormsModule, - CoreModule, - ReactiveFormsModule, - RouterModule, - CoreModule, - AdminBreadcrumbModule, - AdminEventFormModule, - MatButtonModule, - MatCardModule, - MatChipsModule, - MatTableModule, - MatPaginatorModule, - MatSortModule, - MatDialogModule, - MatFormFieldModule, - MatDividerModule, - MatIconModule, - MatInputModule, - MatButtonModule, - MatCheckboxModule, - MatIconModule, - MatProgressSpinnerModule, - AdminBreadcrumbModule, - MatSelectModule, - MatOptionModule, - MatTooltipModule, - MatTableModule, - MatPaginatorModule, - DragDropModule - ], - exports: [ - EventDashboardComponent, - EventDetailsComponent - ], - providers: [ - EventService - ] -}) -export class AdminEventsModule { } \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-event/create-event/create-event.component.html b/web-app/admin/src/app/admin/admin-event/create-event/create-event.component.html deleted file mode 100644 index e94cfbdba..000000000 --- a/web-app/admin/src/app/admin/admin-event/create-event/create-event.component.html +++ /dev/null @@ -1,57 +0,0 @@ -
-
-

Create a New Event

-
- -
-
- - {{ errorMessage }} -
- - -
- - -
- - Name is required - -
-
- -
- - -
- -
- -
- - -
-
diff --git a/web-app/admin/src/app/admin/admin-event/create-event/create-event.component.scss b/web-app/admin/src/app/admin/admin-event/create-event/create-event.component.scss deleted file mode 100644 index e3b352180..000000000 --- a/web-app/admin/src/app/admin/admin-event/create-event/create-event.component.scss +++ /dev/null @@ -1,138 +0,0 @@ -.error-alert { - display: flex; - align-items: center; - gap: 0.5rem; - padding: 1rem; - background-color: #fef2f2; - border: 1px solid #fecaca; - border-radius: 8px; - margin-bottom: 1.5rem; - color: #dc2626; - font-size: 0.875rem; - - i { - flex-shrink: 0; - font-size: 1rem; - } -} - -.event-form { - display: flex; - flex-direction: column; - gap: 1.5rem; -} - -.form-field { - display: flex; - flex-direction: column; - gap: 0.5rem; - - .field-label { - font-size: 0.875rem; - font-weight: 600; - color: #374151; - text-transform: uppercase; - letter-spacing: 0.05em; - } - - .form-input { - width: 100%; - padding: 0.75rem 1rem; - border: 1px solid #d1d5db; - border-radius: 8px; - font-size: 0.875rem; - background-color: #f9fafb; - transition: all 0.2s ease; - resize: vertical; - - &:focus { - outline: none; - border-color: #3b82f6; - background-color: white; - box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); - } - - &::placeholder { - color: #9ca3af; - } - - &:disabled { - background-color: #f3f4f6; - color: #9ca3af; - cursor: not-allowed; - } - } - - .field-error { - min-height: 1.2em; - display: flex; - align-items: center; - gap: 4px; - } - - .field-error .error-text { - opacity: 0; - transition: opacity 0.2s ease; - color: #d9534f; - } - - .field-error .error-text.visible { - opacity: 1; - } -} - -::ng-deep .mat-dialog-container { - padding: 0; - border-radius: 12px; - box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), - 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; -} - -::ng-deep mat-dialog-container { - height: 460px; - width: 700px; -} - -::ng-deep .mat-dialog-actions { - padding: 0; - margin: 0; -} - -::ng-deep .mat-dialog-content { - padding: 0; - margin: 0; -} - -::ng-deep .mat-dialog-title { - padding: 0; - margin: 0; -} - -.error-popover { - position: absolute; - top: 10px; - left: 50%; - transform: translateX(-50%); - background-color: #f8d7da; - color: #721c24; - padding: 10px 20px; - border-radius: 4px; - border: 1px solid #f5c6cb; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); - display: flex; - align-items: center; - gap: 8px; - z-index: 1000; - animation: slideDown 0.3s ease; -} - -@keyframes slideDown { - from { - opacity: 0; - transform: translate(-50%, -10px); - } - to { - opacity: 1; - transform: translate(-50%, 0); - } -} diff --git a/web-app/admin/src/app/admin/admin-event/create-event/create-event.component.ts b/web-app/admin/src/app/admin/admin-event/create-event/create-event.component.ts deleted file mode 100644 index 4c0705652..000000000 --- a/web-app/admin/src/app/admin/admin-event/create-event/create-event.component.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { Component, Inject } from '@angular/core'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; -import { EventsService } from '../events.service'; -import { Event } from 'src/app/filter/filter.types'; - -/** - * Dialog component for creating new events. - * Provides a form interface with validation for event name (required) and description (optional). - */ -@Component({ - selector: 'mage-admin-event-create', - templateUrl: './create-event.component.html', - styleUrls: ['./create-event.component.scss'] -}) -export class CreateEventDialogComponent { - eventForm: FormGroup; - errorMessage: string = ''; - - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: { event: Partial }, - private fb: FormBuilder, - private eventsService: EventsService - ) { - this.eventForm = this.fb.group({ - name: [data.event?.name ?? '', [Validators.required]], - description: [data.event?.description ?? ''] - }); - } - - /** - * Handles form submission for creating a new event. - * Validates the form, creates the event via the events service, and closes the dialog on success. - */ - save(): void { - if (this.eventForm.invalid) { - this.errorMessage = 'Please fill in all required fields.'; - return; - } - - this.errorMessage = ''; - const eventData = this.eventForm.value; - this.eventsService.createEvent(eventData).subscribe({ - next: (newEvent) => { - this.dialogRef.close(newEvent); - }, - error: (err) => { - if (err.status === 400 && err.error?.errors) { - const fieldErrors = err.error.errors; - if (fieldErrors.name?.type === 'unique') { - this.errorMessage = fieldErrors.name.message; - } else { - this.errorMessage = err.error.message ?? 'Validation failed'; - } - } else { - this.errorMessage = 'Failed to create event. Please try again.'; - } - } - }); - } - - /** - * Closes the dialog without saving any data or making any changes. - */ - cancel(): void { - this.dialogRef.close(); - } -} diff --git a/web-app/admin/src/app/admin/admin-event/create-form/create-form.component.html b/web-app/admin/src/app/admin/admin-event/create-form/create-form.component.html deleted file mode 100644 index efcf4000d..000000000 --- a/web-app/admin/src/app/admin/admin-event/create-form/create-form.component.html +++ /dev/null @@ -1,70 +0,0 @@ -
-
-

Create New Form For "{{ data.event.name }}"

-
- -
-
- - {{ errorMessage }} -
- -
-
- - -
- - Name is required -
-
- -
- - -
- -
- - - -
- - Color is required -
-
- - Color must be a valid hex color (e.g., #FF5733) -
-
- -
- -

- If you would like to create this form based on a previously archived MAGE form, please upload it - here. -

-
- - -
-
-
-
- -
- - -
-
\ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-event/create-form/create-form.component.scss b/web-app/admin/src/app/admin/admin-event/create-form/create-form.component.scss deleted file mode 100644 index 2fb26a3c6..000000000 --- a/web-app/admin/src/app/admin/admin-event/create-form/create-form.component.scss +++ /dev/null @@ -1,205 +0,0 @@ -.dialog-modal { - display: flex; - flex-direction: column; - height: 100%; - width: 100%; -} - -.dialog-header { - padding: 24px 24px 16px; - border-bottom: 1px solid #e0e0e0; - flex-shrink: 0; -} - -.dialog-title { - margin: 0; - font-size: 20px; - font-weight: 500; - color: #333; -} - -.dialog-content { - padding: 24px; - flex: 1; - overflow-y: auto; - min-height: 0; -} - -.error-alert { - display: flex; - align-items: center; - gap: 8px; - padding: 12px 16px; - margin-bottom: 20px; - background-color: #ffebee; - border-left: 4px solid #f44336; - border-radius: 4px; - color: #c62828; - font-size: 14px; - - i { - font-size: 18px; - } -} - -.form-create { - display: flex; - flex-direction: column; - gap: 20px; -} - -.form-field { - display: flex; - flex-direction: column; - gap: 8px; -} - -.field-label { - font-size: 14px; - font-weight: 500; - color: #555; - margin: 0; - - .required { - color: #f44336; - } -} - -.help-text { - font-size: 13px; - color: #757575; - margin: 0 0 8px 0; -} - -.form-input { - padding: 10px 12px; - font-size: 14px; - border: 1px solid #ccc; - border-radius: 4px; - transition: border-color 0.2s; - font-family: inherit; - - &:focus { - outline: none; - border-color: #1976d2; - } - - &.error { - border-color: #f44336; - } - - &::placeholder { - color: #999; - } -} - -textarea.form-input { - resize: vertical; - min-height: 80px; -} - -.color-input { - width: 60px; - height: 40px; - padding: 4px; - cursor: pointer; - margin-bottom: 8px; -} - -.color-text-input { - text-transform: uppercase; -} - -.field-error { - display: flex; - align-items: center; - gap: 6px; - font-size: 13px; - color: #f44336; - - i { - font-size: 14px; - } -} - -.file-input-container { - position: relative; -} - -.file-input { - position: absolute; - left: -9999px; - opacity: 0; -} - -.file-label { - display: inline-flex; - align-items: center; - gap: 8px; - padding: 10px 16px; - background-color: #f5f5f5; - border: 1px solid #ccc; - border-radius: 4px; - cursor: pointer; - transition: background-color 0.2s; - font-size: 14px; - color: #333; - - &:hover { - background-color: #eeeeee; - } - - i { - font-size: 16px; - } -} - -.dialog-actions { - display: flex; - justify-content: flex-end; - gap: 12px; - padding: 16px 24px; - border-top: 1px solid #e0e0e0; - flex-shrink: 0; - background-color: transparent; -} - -.action-button { - padding: 10px 20px; - font-size: 14px; - font-weight: 500; - border: none; - border-radius: 4px; - cursor: pointer; - transition: background-color 0.2s; - display: inline-flex; - align-items: center; - gap: 8px; - - &:hover:not(:disabled) { - opacity: 0.9; - } - - &:disabled { - opacity: 0.5; - cursor: not-allowed; - } - - &:not(.btn-primary) { - background-color: transparent; - color: #1976d2; - - &:hover:not(:disabled) { - background-color: rgba(25, 118, 210, 0.08); - } - } - - &.btn-primary { - background-color: #1976d2; - color: white; - - &:hover:not(:disabled) { - background-color: #1565c0; - } - } -} \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-event/create-form/create-form.component.spec.ts b/web-app/admin/src/app/admin/admin-event/create-form/create-form.component.spec.ts deleted file mode 100644 index ac431309d..000000000 --- a/web-app/admin/src/app/admin/admin-event/create-form/create-form.component.spec.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; -import { CreateFormDialogComponent } from './create-form.component'; -import { EventsService } from '../events.service'; -import { of, throwError } from 'rxjs'; - -describe('CreateFormDialogComponent', () => { - let component: CreateFormDialogComponent; - let fixture: ComponentFixture; - let mockDialogRef: jasmine.SpyObj>; - let mockEventsService: jasmine.SpyObj; - - const mockEvent = { - id: 1, - name: 'Test Event', - description: 'Test Description' - }; - - beforeEach(async () => { - mockDialogRef = jasmine.createSpyObj('MatDialogRef', ['close']); - mockEventsService = jasmine.createSpyObj('EventsService', ['createForm']); - - await TestBed.configureTestingModule({ - declarations: [CreateFormDialogComponent], - imports: [ReactiveFormsModule], - providers: [ - FormBuilder, - { provide: MatDialogRef, useValue: mockDialogRef }, - { provide: MAT_DIALOG_DATA, useValue: { event: mockEvent } }, - { provide: EventsService, useValue: mockEventsService } - ] - }).compileComponents(); - - fixture = TestBed.createComponent(CreateFormDialogComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should initialize form with random color', () => { - expect(component.formGroup.value.color).toMatch(/^#[0-9A-F]{6}$/i); - }); - - it('should validate required fields', () => { - component.formGroup.patchValue({ - name: '', - color: '' - }); - - expect(component.formGroup.valid).toBeFalse(); - expect(component.formGroup.get('name')?.hasError('required')).toBeTrue(); - expect(component.formGroup.get('color')?.hasError('required')).toBeTrue(); - }); - - it('should validate color format', () => { - component.formGroup.patchValue({ - color: 'invalid-color' - }); - - expect(component.formGroup.get('color')?.hasError('pattern')).toBeTrue(); - }); - - it('should close dialog on cancel', () => { - component.cancel(); - expect(mockDialogRef.close).toHaveBeenCalled(); - }); - - it('should show error when saving invalid form', () => { - component.formGroup.patchValue({ name: '' }); - component.save(); - - expect(component.errorMessage).toBe('Please fill in all required fields correctly.'); - }); - - it('should create form with file upload', () => { - const mockFile = new File(['form data'], 'test-form.json', { type: 'application/json' }); - const mockResponse = { id: 123, name: 'Test Form' }; - - component.selectedFile = mockFile; - component.formGroup.patchValue({ - name: 'Test Form', - description: 'Test Description', - color: '#FF5733' - }); - - mockEventsService.createForm.and.returnValue(of(mockResponse)); - - component.save(); - - expect(mockEventsService.createForm).toHaveBeenCalled(); - expect(mockDialogRef.close).toHaveBeenCalledWith(mockResponse); - }); - - it('should close with form data when no file selected', () => { - component.formGroup.patchValue({ - name: 'Test Form', - description: 'Test Description', - color: '#FF5733' - }); - - component.save(); - - expect(mockDialogRef.close).toHaveBeenCalledWith(component.formGroup.value); - }); - - it('should handle error during form creation', () => { - const mockFile = new File(['form data'], 'test-form.json', { type: 'application/json' }); - component.selectedFile = mockFile; - component.formGroup.patchValue({ - name: 'Test Form', - color: '#FF5733' - }); - - mockEventsService.createForm.and.returnValue(throwError(() => ({ error: 'Test error' }))); - - component.save(); - - expect(component.errorMessage).toBe('Test error'); - }); - - it('should update selected file on file input', () => { - const mockFile = new File(['test'], 'test.json', { type: 'application/json' }); - const event = { - target: { - files: [mockFile] - } - }; - - component.onFileSelected(event); - - expect(component.selectedFile).toBe(mockFile); - }); -}); diff --git a/web-app/admin/src/app/admin/admin-event/create-form/create-form.component.ts b/web-app/admin/src/app/admin/admin-event/create-form/create-form.component.ts deleted file mode 100644 index 46700bbc2..000000000 --- a/web-app/admin/src/app/admin/admin-event/create-form/create-form.component.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { Component, Inject } from '@angular/core'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; -import { EventsService } from '../events.service'; -import { Event } from 'src/app/filter/filter.types'; - -/** - * Dialog component for creating new forms for an event. - * Provides a form interface with validation for form name, description, color, and optional form archive upload. - */ -@Component({ - selector: 'mage-create-form', - templateUrl: './create-form.component.html', - styleUrls: ['./create-form.component.scss'] -}) -export class CreateFormDialogComponent { - formGroup: FormGroup; - errorMessage: string = ''; - selectedFile: File | null = null; - - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: { event: Event }, - private fb: FormBuilder, - private eventsService: EventsService - ) { - // Generate random color for the form - const randomColor = '#' + ('000000' + Math.floor(Math.random() * 0xFFFFFF).toString(16)).slice(-6); - - this.formGroup = this.fb.group({ - name: ['', [Validators.required]], - description: [''], - color: [randomColor, [Validators.required, Validators.pattern(/^#[0-9A-F]{6}$/i)]] - }); - } - - /** - * Handles file selection from the file input - */ - onFileSelected(event: any): void { - const target = event.target as HTMLInputElement; - if (target.files && target.files.length > 0) { - this.selectedFile = target.files[0]; - } - } - - /** - * Handles form submission for creating a new form. - * Validates the form, creates the form via the events service, and closes the dialog on success. - */ - save(): void { - if (this.formGroup.invalid) { - this.errorMessage = 'Please fill in all required fields correctly.'; - Object.keys(this.formGroup.controls).forEach(key => { - this.formGroup.get(key)?.markAsTouched(); - }); - return; - } - - this.errorMessage = ''; - - // If a file is selected, upload it with the form data - if (this.selectedFile) { - const formData = new FormData(); - formData.append('form', this.selectedFile); - formData.append('name', this.formGroup.value.name); - formData.append('description', this.formGroup.value.description || ''); - formData.append('color', this.formGroup.value.color); - - this.eventsService.createForm(String(this.data.event.id), formData).subscribe({ - next: (newForm) => { - this.dialogRef.close(newForm); - }, - error: (err) => { - this.errorMessage = err.error || 'Failed to create form. Please try again.'; - } - }); - } else { - // If no file, just close with the form data (to be handled by the parent component) - this.dialogRef.close(this.formGroup.value); - } - } - - /** - * Closes the dialog without saving any data or making any changes. - */ - cancel(): void { - this.dialogRef.close(); - } - - /** - * Checks if a form field has an error and has been touched - */ - hasError(fieldName: string, errorType: string): boolean { - const field = this.formGroup.get(fieldName); - return !!(field && field.hasError(errorType) && field.touched); - } -} diff --git a/web-app/admin/src/app/admin/admin-event/dashboard/event-dashboard.component.html b/web-app/admin/src/app/admin/admin-event/dashboard/event-dashboard.component.html deleted file mode 100644 index 3b6dff549..000000000 --- a/web-app/admin/src/app/admin/admin-event/dashboard/event-dashboard.component.html +++ /dev/null @@ -1,99 +0,0 @@ - - -
- - -
-
-
- - - - Status - - All - Active - Complete - - -
- -
- -
-
- -
- - - - - - - - -
Event -
- -
-
{{ event.name }}
-
-

{{ event.description }}

-
-
-
-
-
- - -
No events found.
-
- - -
-
diff --git a/web-app/admin/src/app/admin/admin-event/dashboard/event-dashboard.component.scss b/web-app/admin/src/app/admin/admin-event/dashboard/event-dashboard.component.scss deleted file mode 100644 index 5d0befa80..000000000 --- a/web-app/admin/src/app/admin/admin-event/dashboard/event-dashboard.component.scss +++ /dev/null @@ -1,458 +0,0 @@ -::ng-deep .admin-main-content { - min-width: 520px; - &:has(admin-users) { - height: 92vh; - overflow-y: hidden; - -webkit-overflow-scrolling: touch; - - @media (max-height: 500px) { - overflow-y: scroll; - } - } - admin-users { - .container { - height: 90vh; - } - } -} - -$min-height: 40.8vh; -$max-height: 72.8vh; - -.container.bottom-gap-l { - margin-bottom: 2rem; -} - -.admin-nav-gap { - margin-top: -15px; - margin-bottom: -15px; - - .breadcrumbs-toolbar { - min-height: 36px !important; - height: 36px; - background-color: #f0f0f0; - color: #555; - font-size: 13px; - padding: 0 16px; - border-radius: 4px; - - mat-icon { - font-size: 18px; - margin-right: 4px; - vertical-align: middle; - color: #777; - } - - span { - display: flex; - align-items: center; - gap: 4px; - } - } -} - -.page-header { - margin-bottom: 20px; - margin-top: 5px; - padding: 0; - - .page-title { - font-size: 2rem; - font-weight: 700; - color: #1a1a1a; - margin: 0 0 0.5rem; - line-height: 1.2; - letter-spacing: -0.025em; - } - - .page-subtitle { - font-size: 1rem; - color: #666; - margin: 0; - line-height: 1.5; - font-weight: 400; - } -} - -.btn-primary { - background-color: #1e88e5; - color: #fff; -} - -.integrated-navbar { - display: flex; - align-items: center; - justify-content: space-between; - flex-wrap: wrap; - padding: 1rem 1.5rem; - border-bottom: 2px solid #e5e7eb; - height: 85px; - - mage-card-navbar { - flex: 1; - margin-right: 1rem; - min-width: 200px; - background: transparent; - box-shadow: none; - border-radius: 0; - margin-bottom: 0; - } - - @media (max-width: 768px) { - flex-direction: column; - align-items: stretch; - margin: 0; - padding: 5px; - - .button-group { - width: auto; - margin: 0 auto; - } - } -} -.table-wrapper { - border-radius: 12px; - background: #fff; - border: 1px solid #e5e7eb; - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), - 0 2px 4px -1px rgba(0, 0, 0, 0.06); - height: 75vh; - overflow: hidden; - - @media (max-height: 1100px) { - height: 73vh; - } - - @media (max-height: 1000px) { - height: 71vh; - } - - @media (max-height: 900px) { - height: 69vh; - } - - @media (max-height: 800px) { - height: 64vh; - } - - @media (max-height: 700px) { - height: 57vh; - } - - @media (max-height: 600px) { - height: 285px; - } -} - -.table-scroll { - height: 62.2vh; - @media (max-width: 768px) { - height: 60.2vh; - } - overflow-y: auto; - max-height: 100%; - - @media (max-height: 1100px) { - height: 59vh; - } - - @media (max-height: 1000px) { - height: 55vh; - } - - @media (max-height: 900px) { - height: 52vh; - } - - @media (max-height: 800px) { - height: 44vh; - } - - @media (max-height: 700px) { - height: 34vh; - } - @media (max-height: 600px) { - height: 142.5px; - } - - table { - width: 100%; - border-collapse: collapse; - table-layout: fixed; - - th, - td { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - } - - .mat-header-row { - position: sticky; - top: 0; - z-index: 2; - background: #f9fafb; - } - - .mat-row, - .mat-cell, - .mat-header-cell { - height: 3.5rem; - padding: 0.5rem; - - @media (max-height: 768px) { - height: 3.2rem; - } - - @media (max-height: 600px) { - height: 3rem; - padding: 0.4rem; - } - - @media (max-height: 480px) { - height: 2.8rem; - padding: 0.3rem; - font-size: 0.85rem; - } - - @media (max-height: 400px) { - height: 2.5rem; - font-size: 0.75rem; - } - - @media (max-height: 350px) { - height: 2.3rem; - font-size: 0.7rem; - } - } -} - -.pagination { - display: contents; -} - -.mat-column-actions { - text-align: right; - - .mat-cell, - .mat-header-cell { - justify-content: flex-end; - text-align: right; - } - - .d-flex { - display: flex; - justify-content: flex-end; - gap: 0.5rem; - } -} - -.bulk-overlay { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(255, 255, 255, 0.9); - z-index: 10000; - display: flex; - align-items: center; - justify-content: center; - pointer-events: all; -} - -.bulk-progress-content { - width: 60%; - text-align: center; - - @media (max-width: 768px) { - width: 100%; - } -} - -.bulk-progress-bar { - position: relative; - width: 100%; - height: 24px; - background-color: #e0e0e0; - border-radius: 12px; - overflow: hidden; - display: flex; - box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2); -} - -.bulk-progress-success { - background-color: #4caf50; - height: 100%; - transition: width 0.3s ease; -} - -.bulk-progress-failure { - background-color: #f44336; - height: 100%; - transition: width 0.3s ease; -} - -.bulk-progress-text { - margin-top: 1rem; - font-size: 16px; - font-weight: 500; -} - -.bulk-progress-warning { - display: flex; - align-items: center; - justify-content: center; - background-color: #fff3cd; - color: #856404; - padding: 12px; - border-radius: 4px; - margin-bottom: 1rem; - font-weight: 500; - border: 1px solid #ffeeba; - font-size: 14px; - text-align: center; - - mat-icon { - margin-right: 8px; - } -} - -.bulk-error-summary { - margin-top: 2rem; - background-color: #fff3f3; - border: 1px solid #f5c2c7; - padding: 1rem; - border-radius: 4px; -} - -.bulk-error-summary { - margin-top: 2rem; - background-color: #fff3f3; - border: 1px solid #f5c2c7; - padding: 1rem; - border-radius: 4px; - max-width: 100%; - - .error-table-wrapper { - max-height: 300px; - overflow-y: auto; - width: 100%; - margin-top: 1rem; - border: 1px solid #ccc; - border-radius: 4px; - - table.error-table { - width: 100%; - border-collapse: collapse; - margin: 0; - - thead { - th { - background-color: #f8d7da; - position: sticky; - top: 0; - z-index: 1; - padding: 8px; - border: 1px solid #ccc; - font-size: 14px; - white-space: nowrap; - } - } - - tbody { - td { - padding: 8px; - border: 1px solid #ccc; - font-size: 14px; - white-space: nowrap; - } - } - } - } -} - -.finalizing-text { - margin-top: 1rem; - font-style: italic; - color: #666; -} - -.button-group { - margin-top: -20px; - button { - height: 43px; - white-space: nowrap; - } - - button:not(:last-child) { - margin-right: 40px; - } -} - -.filters { - margin-top: -10px; - align-items: center !important; - display: flex !important; -} - -:host { - .status-filter { - width: 150px; - margin-left: 1rem; - margin-top: 10px; - font-size: 14px; - - ::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix { - padding: 10px; - } - ::ng-deep .mat-form-field-infix { - padding: 10px; - } - - ::ng-deep .mat-form-field-label-wrapper { - top: -12px; - left: -1px; - } - } - ::ng-deep input.search-input.ng-untouched.ng-pristine.ng-valid, - ::ng-deep input.search-input.ng-valid.ng-dirty.ng-touched, - ::ng-deep input.search-input.ng-valid.ng-dirty.ng-untouched { - height: 43px; - margin-top: -10px; - } -} - -.d-flex { - display: flex; - gap: 25px; -} - -.align-items-center{ - align-items: center !important; -} - -.icon { - font-size: 25px; -} - -.ellipsis { - text-overflow: ellipsis; - overflow: hidden; -} - -::ng-deep .mat-tooltip-event-desc{ - position: relative; - left: 0 !important; - font-size: 20px; - min-width: 75vw; -} - -.w-100 { - width: 100% !important; -} - -.w-90 { - width: 90% !important; -} \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-event/dashboard/event-dashboard.component.spec.ts b/web-app/admin/src/app/admin/admin-event/dashboard/event-dashboard.component.spec.ts deleted file mode 100644 index 3c80a95e2..000000000 --- a/web-app/admin/src/app/admin/admin-event/dashboard/event-dashboard.component.spec.ts +++ /dev/null @@ -1,199 +0,0 @@ -import { - ComponentFixture, - TestBed, - fakeAsync, - tick -} from '@angular/core/testing'; -import { of } from 'rxjs'; -import { MatDialog, MatDialogModule } from '@angular/material/dialog'; -import { MatPaginatorModule, PageEvent } from '@angular/material/paginator'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatSelectModule } from '@angular/material/select'; -import { MatOptionModule } from '@angular/material/core'; -import { MatTableModule } from '@angular/material/table'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; - -import { EventDashboardComponent } from './event-dashboard.component'; -import { EventsService } from '../events.service'; -import { StateService } from '@uirouter/angular'; -import { - LocalStorageService, - UserService -} from 'admin/src/app/upgrade/ajs-upgraded-providers'; - -const mockEventsResponse = { - totalCount: 2, - items: [ - { - id: 1, - name: 'Event A', - description: 'Desc A', - feedIds: [], - forms: [], - layers: [], - style: { - fill: '#ffffff', - fillOpacity: 1, - stroke: '#000000', - strokeOpacity: 1, - strokeWidth: 2 - }, - teams: [] - }, - { - id: 2, - name: 'Event B', - description: 'Desc B', - feedIds: [], - forms: [], - layers: [], - style: { - fill: '#ffffff', - fillOpacity: 1, - stroke: '#000000', - strokeOpacity: 1, - strokeWidth: 2 - }, - teams: [] - } - ] -}; - -describe('EventDashboardComponent', () => { - let component: EventDashboardComponent; - let fixture: ComponentFixture; - let eventServiceSpy: jasmine.SpyObj; - let userServiceSpy: any; - let dialogSpy: jasmine.SpyObj; - let stateSpy: jasmine.SpyObj; - let localStorageSpy: jasmine.SpyObj; - - beforeEach(async () => { - eventServiceSpy = jasmine.createSpyObj('EventsService', ['getEvents']); - userServiceSpy = { myself: { role: { permissions: ['CREATE_USER'] } } }; - dialogSpy = jasmine.createSpyObj('MatDialog', ['open']); - stateSpy = jasmine.createSpyObj('StateService', ['go']); - localStorageSpy = jasmine.createSpyObj('LocalStorageService', ['getToken']); - localStorageSpy.getToken.and.returnValue('mockToken'); - - await TestBed.configureTestingModule({ - declarations: [EventDashboardComponent], - imports: [ - MatDialogModule, - MatPaginatorModule, - MatFormFieldModule, - MatSelectModule, - MatOptionModule, - MatTableModule, - MatTooltipModule, - NoopAnimationsModule - ], - providers: [ - { provide: EventsService, useValue: eventServiceSpy }, - { provide: UserService, useValue: userServiceSpy }, - { provide: MatDialog, useValue: dialogSpy }, - { provide: StateService, useValue: stateSpy }, - { provide: LocalStorageService, useValue: localStorageSpy } - ] - }).compileComponents(); - - fixture = TestBed.createComponent(EventDashboardComponent); - component = fixture.componentInstance; - }); - - it('should create component', () => { - expect(component).toBeTruthy(); - }); - - it('should initialize permissions properly', () => { - component['initPermissions'](); - expect(component.hasEventCreatePermission).toBeTrue(); - }); - - it('should fetch events and apply filters', fakeAsync(() => { - eventServiceSpy.getEvents.and.returnValue(of(mockEventsResponse)); - component.refreshEvents(); - tick(); - expect(eventServiceSpy.getEvents).toHaveBeenCalledWith( - component.searchOptions - ); - expect(component.filteredEvents.length).toBe(2); - expect(component.totalEvents).toBe(2); - })); - - it('should no longer filter events client-side', () => { - component.events = mockEventsResponse; - - component.eventSearch = 'event a'; - component['applyFilters'](); - - // Expect no filtering to occur - expect(component.filteredEvents.length).toBe(2); - expect(component.filteredEvents[0].name).toBe('Event A'); - expect(component.filteredEvents[1].name).toBe('Event B'); - }); - - it('should send search term to server when searching', fakeAsync(() => { - eventServiceSpy.getEvents.and.returnValue(of(mockEventsResponse)); - - component.onSearchTermChanged('event a'); - tick(); - - expect(component.searchOptions.term).toBe('event a'); - expect(eventServiceSpy.getEvents).toHaveBeenCalledWith( - jasmine.objectContaining({ term: 'event a' }) - ); - })); - - it('should clear search and refresh events', fakeAsync(() => { - eventServiceSpy.getEvents.and.returnValue(of(mockEventsResponse)); - component.onSearchCleared(); - tick(); - expect(component.eventSearch).toBe(''); - expect(eventServiceSpy.getEvents).toHaveBeenCalled(); - })); - - it('should handle page change', fakeAsync(() => { - const pageEvent: PageEvent = { length: 20, pageIndex: 1, pageSize: 25 }; - eventServiceSpy.getEvents.and.returnValue(of(mockEventsResponse)); - component.onPageChange(pageEvent); - tick(); - expect(component.searchOptions.page).toBe(1); - expect(component.searchOptions.page_size).toBe(25); - expect(eventServiceSpy.getEvents).toHaveBeenCalled(); - })); - - it('should navigate to event on click', () => { - const event = { id: 123 }; - component.gotoEvent(event as any); - expect(stateSpy.go).toHaveBeenCalledWith('admin.event', { eventId: 123 }); - }); - - it('should update status filter and refresh events', fakeAsync(() => { - eventServiceSpy.getEvents.and.returnValue(of(mockEventsResponse)); - component.onStatusFilterChange('active'); - tick(); - expect(component.searchOptions.state).toBe('active'); - expect(eventServiceSpy.getEvents).toHaveBeenCalled(); - })); - - it('should update status filter and refresh events', fakeAsync(() => { - eventServiceSpy.getEvents.and.returnValue(of(mockEventsResponse)); - - component.onStatusFilterChange('active'); - tick(); - fixture.detectChanges(); - - expect(component.searchOptions.state).toBe('active'); - expect(eventServiceSpy.getEvents).toHaveBeenCalled(); - })); - - - it('should handle window resize updating numChars and tooltip width', () => { - spyOnProperty(window, 'innerWidth', 'get').and.returnValue(1000); - component.onResize(); - expect(component.numChars).toBe(Math.ceil(1000 / 8.5)); - expect(component.toolTipWidth).toBe(1000 * 0.75 + 'px'); - }); -}); diff --git a/web-app/admin/src/app/admin/admin-event/dashboard/event-dashboard.component.ts b/web-app/admin/src/app/admin/admin-event/dashboard/event-dashboard.component.ts deleted file mode 100644 index 5bf45e7f2..000000000 --- a/web-app/admin/src/app/admin/admin-event/dashboard/event-dashboard.component.ts +++ /dev/null @@ -1,159 +0,0 @@ -import { Component, OnInit, Inject, HostListener } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; -import { PageEvent } from '@angular/material/paginator'; -import { StateService } from '@uirouter/angular'; -import { - LocalStorageService, - UserService -} from 'admin/src/app/upgrade/ajs-upgraded-providers'; -import { - EventsService, - SearchOptions, - EventsResponse -} from '../events.service'; -import { AdminBreadcrumb } from '../../admin-breadcrumb/admin-breadcrumb.model'; -import { Event } from 'src/app/filter/filter.types'; -import { CreateEventDialogComponent } from '../create-event/create-event.component'; - -@Component({ - selector: 'admin-events', - templateUrl: './event-dashboard.component.html', - styleUrls: ['./event-dashboard.component.scss'] -}) -export class EventDashboardComponent implements OnInit { - events: EventsResponse; - filteredEvents: Event[] = []; - displayedColumns: string[] = ['event']; - - numChars = 180; - toolTipWidth = '1000px'; - eventSearch = ''; - - searchOptions: SearchOptions = { - page: 0, - page_size: 10, - state: 'all' - }; - - totalEvents = 0; - pageSizeOptions = [5, 10, 25, 50]; - hasEventCreatePermission = false; - - eventStatusFilter: 'all' | 'active' | 'complete' = 'all'; - - breadcrumbs: AdminBreadcrumb[] = [ - { title: 'Events', iconClass: 'fa fa-calendar' } - ]; - - constructor( - private modal: MatDialog, - private localStorageService: LocalStorageService, - private stateService: StateService, - private eventService: EventsService, - @Inject(UserService) private userService - ) {} - - ngOnInit(): void { - this.initPermissions(); - this.refreshEvents(); - this.updateResponsiveLayout(); - } - - /** Initialize permission flags */ - private initPermissions(): void { - const permissions = this.userService.myself?.role?.permissions || []; - this.hasEventCreatePermission = permissions.includes('CREATE_USER'); - } - - /** Fetch and apply filters to the event list */ - refreshEvents(): void { - this.eventService.getEvents(this.searchOptions).subscribe({ - next: (events) => { - this.events = events; - this.filteredEvents = events.items; - this.totalEvents = events.totalCount ?? 0; - } - , - error: (err) => console.error('Error fetching events:', err) - }); - } - - /** Apply search term filter */ - private applyFilters(): void { - this.filteredEvents = this.events.items; - this.totalEvents = this.events.totalCount ?? 0; - } - - /** Handle search term change */ - onSearchTermChanged(term: string): void { - this.eventSearch = term; - this.searchOptions = { - ...this.searchOptions, - term, - page: 0 - }; - this.refreshEvents(); - } - - /** Clear search */ - onSearchCleared(): void { - this.eventSearch = ''; - this.searchOptions = { - ...this.searchOptions, - term: '', - page: 0 - }; - this.refreshEvents(); - } - - /** Reset all filters and pagination */ - reset(): void { - this.eventSearch = ''; - this.searchOptions = { ...this.searchOptions, page: 0, state: 'all' }; - this.refreshEvents(); - } - - /** Handle pagination change */ - onPageChange(event: PageEvent): void { - this.searchOptions = { - ...this.searchOptions, - page: event.pageIndex, - page_size: event.pageSize - }; - this.refreshEvents(); - } - - /** Navigate to event detail */ - gotoEvent(event: Event): void { - this.stateService.go('admin.event', { eventId: event.id }); - } - - /** Handle status filter change */ - onStatusFilterChange(value: 'all' | 'active' | 'complete'): void { - this.searchOptions = { ...this.searchOptions, state: value, page: 0 }; - this.refreshEvents(); - } - - /** Open create event dialog */ - createEvent(): void { - const dialogRef = this.modal.open(CreateEventDialogComponent, { - data: { team: {} } - }); - - dialogRef.afterClosed().subscribe((newEvent) => { - if (newEvent) this.refreshEvents(); - }); - } - - /** Update layout-related values on resize */ - @HostListener('window:resize') - onResize(): void { - this.updateResponsiveLayout(); - } - - /** Calculates responsive values */ - private updateResponsiveLayout(): void { - this.numChars = Math.ceil(window.innerWidth / 8.5); - this.toolTipWidth = `${window.innerWidth * 0.75}px`; - } -} diff --git a/web-app/admin/src/app/admin/admin-event/delete-event/delete-event.component.html b/web-app/admin/src/app/admin/admin-event/delete-event/delete-event.component.html deleted file mode 100644 index bd9cffc76..000000000 --- a/web-app/admin/src/app/admin/admin-event/delete-event/delete-event.component.html +++ /dev/null @@ -1,43 +0,0 @@ -
-
-
- -
-
-

Delete Event

-

This action cannot be undone

-
-
- -
-
-

Event "{{event.name}}" will be permanently deleted.

-
- -
-
- -

Are you ABSOLUTELY sure?

-
-
-

Deleting this event will remove all event information including observation and - location data.

-

This action CANNOT be undone, and all event data will be unrecoverable.

-
- - -
-
-
-
- -
- - -
-
\ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-event/delete-event/delete-event.component.scss b/web-app/admin/src/app/admin/admin-event/delete-event/delete-event.component.scss deleted file mode 100644 index 748138e05..000000000 --- a/web-app/admin/src/app/admin/admin-event/delete-event/delete-event.component.scss +++ /dev/null @@ -1,168 +0,0 @@ -.dialog-modal { - padding: 20px; - max-width: 600px; -} - -.dialog-header { - display: flex; - align-items: center; - margin-bottom: 24px; - gap: 16px; -} - -.warning-icon { - font-size: 48px; - color: #f44336; -} - -.header-content { - flex: 1; -} - -.dialog-title { - margin: 0 0 4px 0; - font-size: 24px; - font-weight: 600; - color: #333; -} - -.dialog-subtitle { - margin: 0; - font-size: 14px; - color: #666; -} - -.dialog-content { - margin-bottom: 24px; -} - -.warning-message { - padding: 16px; - background-color: #fff3e0; - border-left: 4px solid #ff9800; - border-radius: 4px; - margin-bottom: 20px; -} - -.warning-message p { - margin: 0; - color: #333; -} - -.danger-zone { - background-color: #ffebee; - border: 2px solid #f44336; - border-radius: 4px; - padding: 16px; -} - -.danger-zone-header { - display: flex; - align-items: center; - gap: 8px; - margin-bottom: 12px; -} - -.danger-zone-header i { - color: #f44336; - font-size: 20px; -} - -.danger-zone-header h3 { - margin: 0; - font-size: 18px; - font-weight: 600; - color: #d32f2f; -} - -.danger-zone-content p { - margin: 0 0 12px 0; - color: #333; -} - -.danger-zone-content p:last-of-type { - margin-bottom: 16px; -} - -.confirmation-field { - margin-top: 16px; -} - -.field-label { - display: block; - margin-bottom: 8px; - font-weight: 500; - color: #333; -} - -.form-input { - width: 100%; - padding: 8px 12px; - border: 2px solid #ccc; - border-radius: 4px; - font-size: 14px; - box-sizing: border-box; -} - -.form-input:focus { - outline: none; - border-color: #f44336; -} - -.dialog-actions { - display: flex; - justify-content: flex-end; - gap: 12px; - padding-top: 16px; - border-top: 1px solid #e0e0e0; -} - -.action-button { - padding: 10px 20px; - border: none; - border-radius: 4px; - font-size: 14px; - font-weight: 500; - cursor: pointer; - transition: all 0.3s ease; - display: flex; - align-items: center; - gap: 8px; -} - -.action-button:not(.btn-danger) { - background-color: #f5f5f5; - color: #333; -} - -.action-button:not(.btn-danger):hover { - background-color: #e0e0e0; -} - -.action-button.btn-danger { - background-color: #f44336; - color: white; -} - -.action-button.btn-danger:hover:not(:disabled) { - background-color: #d32f2f; -} - -.action-button:disabled { - opacity: 0.5; - cursor: not-allowed; -} - -.fa-spinner { - animation: spin 1s linear infinite; -} - -@keyframes spin { - 0% { - transform: rotate(0deg); - } - - 100% { - transform: rotate(360deg); - } -} \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-event/delete-event/delete-event.component.ts b/web-app/admin/src/app/admin/admin-event/delete-event/delete-event.component.ts deleted file mode 100644 index 408b7e6fa..000000000 --- a/web-app/admin/src/app/admin/admin-event/delete-event/delete-event.component.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Component, Inject } from '@angular/core'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { EventsService } from '../events.service'; -import { Event as MageEvent } from 'src/app/filter/filter.types'; - -/** - * Modal component for confirming event deletion. - * Provides a confirmation dialog before permanently deleting an event. - */ -@Component({ - selector: 'mage-delete-event', - templateUrl: './delete-event.component.html', - styleUrls: ['./delete-event.component.scss'] -}) -export class DeleteEventComponent { - event: MageEvent; - deleting = false; - confirm: { text?: string } = {}; - - /** - * Constructor - initializes the component with injected services and event data. - * @param dialogRef - Reference to the dialog for closing and returning results - * @param data - Injected data containing the event to delete - * @param eventsService - Service for event operations - */ - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: { event: MageEvent }, - private eventsService: EventsService - ) { - this.event = data.event; - } - - /** - * Deletes the event after confirmation. - */ - deleteEvent(): void { - this.deleting = true; - - this.eventsService.deleteEvent(this.event.id.toString()).subscribe({ - next: () => { - this.dialogRef.close(this.event); - }, - error: (error) => { - console.error('Error deleting event:', error); - this.deleting = false; - } - }); - } - - /** - * Cancels the deletion and closes the dialog without any action. - */ - cancel(): void { - this.dialogRef.close(); - } -} diff --git a/web-app/admin/src/app/admin/admin-event/event-details/event-details.component.html b/web-app/admin/src/app/admin/admin-event/event-details/event-details.component.html deleted file mode 100644 index 8d3847ae7..000000000 --- a/web-app/admin/src/app/admin/admin-event/event-details/event-details.component.html +++ /dev/null @@ -1,439 +0,0 @@ - - -
- - - -
-
-
- -
-
-
-
- -
- {{event.name}} - -
-
- -
- -
- {{event.description}} - -
-
- -
- - -
-
-
- -
- -
-

Complete Event

-

Marking an event as complete will remove it as a - selectable - event. The event is not destroyed and can be changed back to an active state at any - time.

- -
- - -
-

Activate Event

-

Marking an event as active will show it as a selectable - event on - clients. At that point users can contribute observations and locations to the event.

- -
- - -
-

Delete Event

-

Deleting an event will remove all event information - including - observation and location data. This cannot be undone, and all event data will be - unrecoverable.

- -
-
-
- -
- - -
- -
-
-
Team Members
-
- - -
-
- - - - - - - -
-
-
- -
-
-
{{ user.displayName }}
-
{{ user.username }}
-
-
- - {{ getUserRole(user) }} - - - - - {{ getUserRole(user) }} - - -
-
Guest
-
Can view and - contribute observations
-
-
- -
-
Manager
-
Can edit event - settings and manage members
-
-
- -
-
Owner
-
Full control including - deletion
-
-
-
-
-
-
- -
-
-
- -
-
- -
No members for {{ event?.name }}
-
-
-
- - - -
-
-
Loading
- -
-
-
-
- - -
-
-
Teams
-
- - -
-
- - - - - - - -
-
-
- -
-
-
{{ team.name }}
-
{{ team.description }}
-
-
- -
-
-
- -
-
- -
No teams for {{ event?.name }}
-
-
-
- - - -
-
-
Loading
- -
-
-
-
-
- - -
-
-
-
Layers
-
- - -
- -
- - - - - - - -
-
-
- -
-
-
{{ layer.name }}
-
{{ - layer.description }}
-
-
- -
-
-
- -
-
- -
No layers for {{ event?.name }}
-
-
-
- - - -
-
-
Loading
- -
-
-
-
-
- -
- - - - - Forms - - -
-
- drag_indicator - description -
-
- {{form.name}} (Archived) -
-
-
- - - -
-
-
- -
- - -
-
-
- - - - - Form Restrictions - - -
- - Min Forms Per Observation - - Minimum number of forms that must be present in an observation for this - event - - - - Max Forms Per Observation - - Limit the total number of forms that can be added to an observation for this - event - - -
-

Add restrictions to individual forms that include the minimum number times a form - must be present in an observation, and/or the maximum number times this form can be - present in an observation.

-
- -
-
- description -
-
{{form.name}}
-
- - Min - - - - Max - - -
-
-
-
- -
- Form Restriction Error -

{{restrictionsError.message}}

-
    -
  • - {{error.value.message}}
  • -
-
- -
- -
-
-
-
- -
-
-
-
- - \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-event/event-details/event-details.component.scss b/web-app/admin/src/app/admin/admin-event/event-details/event-details.component.scss deleted file mode 100644 index c97328c1e..000000000 --- a/web-app/admin/src/app/admin/admin-event/event-details/event-details.component.scss +++ /dev/null @@ -1,985 +0,0 @@ -.container { - padding: 16px; -} - -.page-header { - margin-bottom: 2rem; - padding-bottom: 1rem; - display: flex; - justify-content: space-between; - align-items: flex-start; - gap: 2rem; - - @media (max-width: 768px) { - flex-direction: column; - align-items: stretch; - gap: 1rem; - } - - .page-title { - flex: 1; - font-size: 2rem; - font-weight: 700; - color: #1a1a1a; - margin: 0; - line-height: 1.2; - letter-spacing: -0.025em; - } -} - -.header-title-section { - flex: 1; - - .page-title { - font-size: 2rem; - font-weight: 700; - color: #1a1a1a; - margin: 0 0 0.5rem 0; - line-height: 1.2; - letter-spacing: -0.025em; - } -} - -.header-actions { - display: flex; - gap: 0.75rem; - flex-shrink: 0; - - @media (max-width: 768px) { - justify-content: center; - } -} - -.details-section { - display: grid; - grid-template-columns: 2fr 1fr; - gap: 2rem; - margin-bottom: 3rem; - - @media (max-width: 768px) { - grid-template-columns: 1fr; - gap: 1.5rem; - } -} - -.details-card { - background: white; - border-radius: 12px; - border: 1px solid #e5e7eb; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - padding: 2rem; -} - -.details-form { - .form-field { - margin-bottom: 1.5rem; - - .field-label { - display: block; - font-size: 0.875rem; - font-weight: 600; - color: #374151; - margin-bottom: 0.5rem; - text-transform: uppercase; - letter-spacing: 0.05em; - } - - .field-content { - .field-value { - font-size: 1rem; - color: #111827; - line-height: 1.5; - } - - .form-input { - width: 100%; - padding: 0.75rem 1rem; - border: 1px solid #d1d5db; - border-radius: 8px; - font-size: 0.875rem; - background-color: #f9fafb; - transition: all 0.2s ease; - - &:focus { - outline: none; - border-color: #3b82f6; - background-color: white; - box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); - } - } - } - } - - .form-actions { - display: flex; - gap: 0.75rem; - margin-top: 2rem; - } -} - -.action-card { - background: #eff6ff; - border: 1px solid #bfdbfe; - border-radius: 12px; - padding: 2rem; - display: flex; - flex-direction: column; - min-height: 200px; - margin-bottom: 1rem; - - .action-card-title { - font-size: 1.125rem; - font-weight: 600; - color: #1e40af; - margin: 0 0 1rem 0; - } - - .action-card-description { - font-size: 0.875rem; - color: #1e3a8a; - margin: 0 0 1.5rem 0; - line-height: 1.5; - flex: 1; - } - - .action-button { - align-self: flex-end; - margin-top: auto; - } -} - -.danger-zone-card { - background: #fef2f2; - border: 1px solid #fecaca; - border-radius: 12px; - padding: 2rem; - display: flex; - flex-direction: column; - min-height: 200px; - - .danger-zone-title { - font-size: 1.125rem; - font-weight: 600; - color: #dc2626; - margin: 0 0 1rem 0; - } - - .danger-zone-description { - font-size: 0.875rem; - color: #7f1d1d; - margin: 0 0 1.5rem 0; - line-height: 1.5; - flex: 1; - } - - .action-button.btn-danger { - align-self: flex-end; - margin-top: auto; - } -} - -.sections-container { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 2rem; - - @media (max-width: 1200px) { - grid-template-columns: 1fr; - gap: 1.5rem; - } -} - -.layers-container { - margin-top: 2rem; - display: grid; - grid-template-columns: 1fr; - gap: 2rem; -} - -.section-card { - background: white; - border-radius: 12px; - overflow: hidden; - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); - border: 1px solid #e5e7eb; -} - -.integrated-navbar { - background-color: #f9fafb; - border-bottom: 2px solid #e5e7eb; - - mage-card-navbar { - background: transparent; - box-shadow: none; - border-radius: 0; - } -} - -.section-table-title { - font-size: 1rem; - font-weight: 600; - padding: 1rem 1.5rem 0.5rem 1.5rem; - color: #111827; -} - -.table-wrapper { - --row-height: 73px; - --min-page-size: 5; - --base-table-height: calc(var(--row-height) * var(--min-page-size)); - - display: flex; - flex-direction: column; - position: relative; -} - -.table-scroll { - height: var(--base-table-height); - max-height: var(--base-table-height); - overflow-y: auto; - overflow-x: hidden; - -webkit-overflow-scrolling: touch; - overscroll-behavior: contain; - border-bottom: 1px solid #e5e7eb; -} - -.table-wrapper .mat-table { - display: table; - width: 100%; - height: auto; - overflow: visible; -} - -.table-wrapper mat-paginator { - flex-shrink: 0; - border-top: 1px solid #e5e7eb; - background: #f9fafb; -} - -.mat-table-no-header { - .mat-header-row { - display: none; - } -} - -.table-row-content { - padding: 0; - border-bottom: 1px solid #f1f5f9; - - &:last-child { - border-bottom: none; - } -} - -.row-item { - display: flex; - align-items: center; - gap: 1rem; - padding: 1rem 0rem; - transition: background-color 0.2s ease; - cursor: pointer; - - &:hover { - background-color: #f8fafc; - } -} - -.row-icon { - flex-shrink: 0; - width: 2.5rem; - height: 2.5rem; - display: flex; - align-items: center; - justify-content: center; - background-color: #f3f4f6; - border-radius: 8px; - color: #6b7280; - - i { - font-size: 1.25rem; - } -} - -.row-info { - flex: 1; - min-width: 0; - - .row-primary { - font-size: 0.875rem; - font-weight: 600; - color: #111827; - margin-bottom: 0.25rem; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - max-width: 12rem; - } - - .row-secondary { - font-size: 0.75rem; - color: #6b7280; - line-height: 1.4; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - max-width: 12rem; - } -} - -.row-actions { - flex: 0 0 auto; - min-width: fit-content; -} - -.row-role { - flex-shrink: 0; - display: flex; - align-items: center; - margin-left: auto; - margin-right: 0.5rem; - - .user-role-badge { - display: inline-block; - padding: 0.2rem 0.5rem; - border-radius: 0.25rem; - font-size: 0.75rem; - font-weight: 600; - text-transform: uppercase; - letter-spacing: 0.025em; - - background-color: #f3f4f6; - color: #6b7280; - - &.role-owner { - background-color: #fef3c7; - color: #d97706; - } - - &.role-manager { - background-color: #dbeafe; - color: #2563eb; - } - - &.role-guest { - background-color: #f3f4f6; - color: #6b7280; - } - } - - .role-select { - padding: 0.25rem 0.5rem; - border: 1px solid #d1d5db; - border-radius: 0.375rem; - background-color: #ffffff; - font-size: 0.875rem; - color: #374151; - cursor: pointer; - min-width: 120px; - - &:focus { - outline: none; - border-color: #3b82f6; - box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); - } - - &:hover { - border-color: #9ca3af; - } - } - - .role-select-field { - width: 120px; - min-width: 120px; - max-width: 120px; - font-size: 0.875rem; - - ::ng-deep .mat-form-field-wrapper { - padding-bottom: 0; - margin: 0; - } - - ::ng-deep .mat-form-field-underline { - display: none; - } - - ::ng-deep .mat-form-field-outline { - display: none; - } - - ::ng-deep .mat-form-field-flex { - padding: 0; - border: 1px solid #d1d5db; - border-radius: 8px; - background-color: #ffffff; - transition: all 0.2s ease; - } - - ::ng-deep .mat-form-field-infix { - padding: 0.5rem 0.75rem; - border: 0; - width: 100%; - } - - ::ng-deep .mat-select-value { - font-size: 0.875rem; - color: #374151; - } - - ::ng-deep .mat-select-trigger { - min-height: auto; - } - - ::ng-deep .mat-select-arrow-wrapper { - transform: translateY(0); - padding-right: 0.5rem; - } - - &.mat-focused ::ng-deep .mat-form-field-flex { - border-color: #3b82f6; - box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); - } - - &:hover:not(.mat-focused) ::ng-deep .mat-form-field-flex { - border-color: #9ca3af; - } - } -} - -.empty-state { - display: flex; - align-items: center; - justify-content: center; - padding: 3rem 2rem; - min-height: 200px; - - .empty-state-content { - text-align: center; - - .empty-state-icon { - font-size: 3rem; - color: #9ca3af; - margin-bottom: 1rem; - display: block; - } - - .empty-state-text { - font-size: 1.1rem; - color: #6b7280; - font-weight: 500; - } - } -} - -.loading-overlay { - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - background-color: rgba(255, 255, 255, 0.9); - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - border-radius: 12px; -} - -.loading-content { - text-align: center; - - .loading-text { - font-size: 1.125rem; - font-weight: 600; - color: #374151; - margin-bottom: 1rem; - } - - .loading-spinner { - font-size: 2rem; - color: #3b82f6; - } -} - -.action-button { - padding: 0.75rem 1.5rem; - border: 1px solid #d1d5db; - border-radius: 8px; - background: white; - color: #374151; - font-size: 0.875rem; - font-weight: 500; - cursor: pointer; - transition: all 0.2s ease; - white-space: nowrap; - display: inline-flex; - align-items: center; - gap: 0.5rem; - - &:hover:not(:disabled) { - background-color: #f9fafb; - border-color: #9ca3af; - } - - &:focus { - outline: none; - box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); - border-color: #3b82f6; - } - - &:disabled { - opacity: 0.5; - cursor: not-allowed; - } - - &.btn-sm { - padding: 0.5rem 1rem; - font-size: 0.75rem; - } - - &.btn-primary { - background-color: #3b82f6; - border-color: #3b82f6; - color: white; - - &:hover:not(:disabled) { - background-color: #2563eb; - border-color: #2563eb; - } - } - - &.btn-danger { - background-color: #ef4444; - border-color: #ef4444; - color: white; - - &:hover:not(:disabled) { - background-color: #dc2626; - border-color: #dc2626; - } - } -} - -.pointer { - cursor: pointer; -} - -.muted { - opacity: 0.7; -} - -.text-primary { - color: #1976d2; -} - -.text-danger { - color: #f44336; -} - -.top-gap { - margin-top: 16px; -} - -.top-gap-s { - margin-top: 8px; -} - -.top-gap-l { - margin-top: 24px; -} - -.bottom-gap { - margin-bottom: 16px; -} - -.bottom-gap-l { - margin-bottom: 24px; -} - -.right-gap { - margin-right: 8px; -} - -.full-width { - width: 100%; -} - -mat-card { - margin-bottom: 1.5rem; - border-radius: 12px; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); -} - -mat-card-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 1rem; -} - -mat-card-title { - font-size: 1.125rem; - font-weight: 600; - color: #111827; -} - -mat-card-content { - padding-top: 1rem; -} - -.forms-list { - margin: 16px 0; - position: relative; - overflow: hidden; -} - -.form-item { - display: flex; - align-items: center; - padding: 16px; - border: 1px solid #e0e0e0; - border-radius: 8px; - margin-bottom: 12px; - cursor: pointer; - transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), - box-shadow 0.2s ease, - background-color 0.2s ease; - - &:hover { - background-color: #f5f5f5; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); - } - - mat-icon { - display: flex; - align-items: center; - justify-content: center; - } - - mat-icon:not(.drag-handle):not(:last-child) { - margin-right: 16px; - color: #757575; - } - - .drag-handle { - cursor: move; - color: #9e9e9e; - margin-right: 8px; - - &:hover { - color: #616161; - } - } - - &.form-moving { - background-color: #e3f2fd; - box-shadow: 0 4px 12px rgba(33, 150, 243, 0.25); - z-index: 1; - } -} - -.cdk-drag-preview { - box-sizing: border-box; - border-radius: 8px; - box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2), - 0 8px 10px 1px rgba(0, 0, 0, 0.14), - 0 3px 14px 2px rgba(0, 0, 0, 0.12); - opacity: 0.9; - background-color: white; -} - -.cdk-drag-placeholder { - opacity: 0.4; - background-color: #e3f2fd; - border: 2px dashed #2196f3; -} - -.cdk-drag-animating { - transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); -} - -.forms-list.cdk-drop-list-dragging .form-item:not(.cdk-drag-placeholder) { - transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); -} - -.form-info { - flex: 1; - display: flex; - align-items: center; -} - -.form-name { - font-weight: 500; - line-height: 24px; -} - -.form-actions { - display: flex; - gap: 8px; - align-items: center; - - button { - display: flex; - align-items: center; - justify-content: center; - - mat-icon { - display: flex; - align-items: center; - justify-content: center; - margin: 0; - } - } -} - -.restrictions-help { - padding: 16px; - background-color: #e3f2fd; - border-radius: 8px; - margin: 16px 0; - - p { - margin: 0; - color: #0d47a1; - } -} - -.form-restrictions-list { - margin: 16px 0; -} - -.form-restriction-item { - display: flex; - align-items: center; - padding: 12px; - border-bottom: 1px solid #e0e0e0; - - mat-icon { - margin-right: 12px; - color: #757575; - } -} - -.form-restriction-info { - flex: 1; -} - -.form-restriction-name { - font-weight: 500; - margin-bottom: 8px; -} - -.form-restriction-controls { - display: flex; - gap: 16px; - - mat-form-field { - width: 120px; - } -} - -mat-form-field { - &.full-width { - width: 100%; - } -} - -.forms-list { - margin: 16px 0; -} - -.form-item { - display: flex; - align-items: center; - padding: 16px; - border: 1px solid #e0e0e0; - border-radius: 4px; - margin-bottom: 12px; - cursor: pointer; - transition: all 0.2s; - - &:hover { - background-color: #f5f5f5; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); - } - - mat-icon:first-child { - margin-right: 16px; - color: #757575; - } -} - -.form-info { - flex: 1; -} - -.form-name { - font-weight: 500; -} - -.form-description { - font-size: 0.875rem; -} - -.form-actions { - display: flex; - gap: 8px; -} - -.restrictions-help { - padding: 16px; - background-color: #e3f2fd; - border-radius: 4px; - margin: 16px 0; - - p { - margin: 0; - color: #0d47a1; - } -} - -.form-restrictions-list { - margin: 16px 0; -} - -.form-restriction-item { - display: flex; - align-items: flex-start; - padding: 16px; - border: 1px solid #e0e0e0; - border-radius: 4px; - margin-bottom: 12px; - - mat-icon { - margin-right: 16px; - margin-top: 8px; - color: #757575; - } -} - -.form-restriction-info { - flex: 1; -} - -.form-restriction-name { - font-weight: 500; - margin-bottom: 12px; -} - -.form-restriction-controls { - display: flex; - gap: 16px; - - mat-form-field { - flex: 1; - max-width: 200px; - } -} - -.alert { - padding: 16px; - border-radius: 4px; - margin: 16px 0; - - &-danger { - background-color: #ffebee; - color: #c62828; - border: 1px solid #ef9a9a; - } - - strong { - display: block; - margin-bottom: 8px; - } - - p { - margin: 8px 0; - } - - ul { - margin: 8px 0; - padding-left: 24px; - } -} - -mat-card { - margin-bottom: 16px; -} - -mat-card-header { - display: flex; - justify-content: space-between; - align-items: center; -} - -mat-card-title { - display: flex; - align-items: center; - gap: 8px; -} - -mat-card-actions { - margin: 0; - padding: 0; -} - -mat-spinner { - margin: 20px auto; -} - -.role-option { - display: flex; - flex-direction: column; - gap: 0.125rem; - padding: 0; - - .role-name { - font-weight: 500; - font-size: 0.875rem; - color: #111827; - white-space: normal; - line-height: 1.3; - } - - .role-description { - font-size: 0.7rem; - color: #6b7280; - line-height: 1.2; - white-space: normal; - word-wrap: break-word; - font-style: italic; - } -} - -::ng-deep .role-select-panel { - min-width: 240px !important; - max-width: 320px !important; - border-radius: 4px; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15) !important; - transform-origin: top !important; - margin-top: 24px !important; - margin-left: 6px !important; - - .mat-option { - height: auto !important; - min-height: 40px !important; - padding: 8px 12px !important; - line-height: normal !important; - font-size: 0.875rem; - border-bottom: 1px solid #f3f4f6; - - &:last-child { - border-bottom: none; - } - - &:hover { - background-color: #f9fafb !important; - } - - &.mat-selected { - background-color: #eff6ff !important; - - &:hover { - background-color: #dbeafe !important; - } - } - } -} \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-event/event-details/event-details.component.spec.ts b/web-app/admin/src/app/admin/admin-event/event-details/event-details.component.spec.ts deleted file mode 100644 index ee63e6693..000000000 --- a/web-app/admin/src/app/admin/admin-event/event-details/event-details.component.spec.ts +++ /dev/null @@ -1,1028 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatDialog } from '@angular/material/dialog'; -import { MatTableDataSource } from '@angular/material/table'; -import { MatSelectChange } from '@angular/material/select'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { of, throwError } from 'rxjs'; -import { StateService } from '@uirouter/angular'; - -import { EventDetailsComponent } from './event-details.component'; -import { EventsService } from '../../admin-event/events.service'; -import { TeamsService } from '../../admin-teams/teams-service'; - -describe('EventDetailsComponent', () => { - let component: EventDetailsComponent; - let fixture: ComponentFixture; - let eventsService: jasmine.SpyObj; - let teamsService: jasmine.SpyObj; - let dialog: jasmine.SpyObj; - let stateService: jasmine.SpyObj; - - beforeEach(async () => { - const eventsServiceSpy = jasmine.createSpyObj('EventsService', [ - 'getEventById', - 'updateEvent', - 'getMembers', - 'getNonMembers', - 'getTeamsInEvent', - 'getTeamsNotInEvent', - 'addTeamToEvent', - 'removeEventFromTeam', - 'getAllLayers', - 'getLayersForEvent', - 'addLayerToEvent', - 'removeLayerFromEvent' - ]); - - const teamsServiceSpy = jasmine.createSpyObj('TeamsService', [ - 'addUserToTeam', - 'removeMember', - 'updateUserRole' - ]); - - const dialogSpy = jasmine.createSpyObj('MatDialog', ['open']); - const stateServiceSpy = jasmine.createSpyObj('StateService', ['go']); - stateServiceSpy.params = { eventId: '1' }; - - await TestBed.configureTestingModule({ - declarations: [EventDetailsComponent], - imports: [NoopAnimationsModule], - providers: [ - { provide: EventsService, useValue: eventsServiceSpy }, - { provide: TeamsService, useValue: teamsServiceSpy }, - { provide: MatDialog, useValue: dialogSpy }, - { provide: StateService, useValue: stateServiceSpy } - ] - }) - .compileComponents(); - - eventsService = TestBed.inject(EventsService) as jasmine.SpyObj; - teamsService = TestBed.inject(TeamsService) as jasmine.SpyObj; - dialog = TestBed.inject(MatDialog) as jasmine.SpyObj; - stateService = TestBed.inject(StateService) as jasmine.SpyObj; - - eventsService.getEventById.and.returnValue(of({ - id: 1, - name: 'Test Event', - description: 'Test Description', - forms: [] - } as any)); - eventsService.getTeamsInEvent.and.returnValue(of({ items: [], totalCount: 0 })); - eventsService.getMembers.and.returnValue(of({ items: [], totalCount: 0 })); - eventsService.getNonMembers.and.returnValue(of({ items: [], totalCount: 0 })); - eventsService.getTeamsNotInEvent.and.returnValue(of({ items: [], totalCount: 0 })); - eventsService.getAllLayers.and.returnValue(of([])); - eventsService.getLayersForEvent.and.returnValue(of([])); - - fixture = TestBed.createComponent(EventDetailsComponent); - component = fixture.componentInstance; - }); - - describe('Basic Component Tests', () => { - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should initialize with default values', () => { - expect(component.event).toBeNull(); - expect(component.eventTeam).toBeNull(); - expect(component.editingDetails).toBe(false); - expect(component.editMembers).toBe(false); - expect(component.editTeams).toBe(false); - expect(component.editLayers).toBe(false); - }); - - it('should initialize data sources', () => { - expect(component.membersDataSource).toBeInstanceOf(MatTableDataSource); - expect(component.teamsDataSource).toBeInstanceOf(MatTableDataSource); - expect(component.layersDataSource).toBeInstanceOf(MatTableDataSource); - }); - - it('should initialize pagination defaults', () => { - expect(component.membersPageIndex).toBe(0); - expect(component.membersPageSize).toBe(5); - expect(component.teamsPageIndex).toBe(0); - expect(component.teamsPageSize).toBe(5); - expect(component.layersPageIndex).toBe(0); - expect(component.layersPageSize).toBe(5); - }); - }); - - describe('Lifecycle Hooks', () => { - it('should load event data on init', () => { - component.ngOnInit(); - - expect(eventsService.getEventById).toHaveBeenCalledWith('1'); - expect(eventsService.getTeamsInEvent).toHaveBeenCalled(); - }); - - it('should set permissions on init', () => { - component.ngOnInit(); - - expect(component.hasReadPermission).toBe(true); - expect(component.hasUpdatePermission).toBe(true); - expect(component.hasDeletePermission).toBe(true); - }); - - it('should clean up on destroy', () => { - const destroySpy = spyOn(component['destroy$'], 'next'); - const completeSpy = spyOn(component['destroy$'], 'complete'); - - component.ngOnDestroy(); - - expect(destroySpy).toHaveBeenCalled(); - expect(completeSpy).toHaveBeenCalled(); - }); - }); - - describe('Simple Getters', () => { - it('should return non-archived forms', () => { - component.event = { - id: 1, - name: 'Test', - forms: [ - { id: 1, archived: false } as any, - { id: 2, archived: true } as any, - { id: 3, archived: false } as any - ] - } as any; - - const result = component.nonArchivedForms; - - expect(result.length).toBe(2); - expect(result[0].id).toBe(1); - expect(result[1].id).toBe(3); - }); - - it('should return empty array when event has no forms', () => { - component.event = { id: 1, name: 'Test' } as any; - - expect(component.nonArchivedForms).toEqual([]); - }); - - it('should return empty array when event is null', () => { - component.event = null; - - expect(component.nonArchivedForms).toEqual([]); - }); - - it('should filter forms based on showArchivedForms flag', () => { - component.event = { - id: 1, - name: 'Test', - forms: [ - { id: 1, archived: false } as any, - { id: 2, archived: true } as any - ] - } as any; - - component.showArchivedForms = false; - expect(component.filteredForms.length).toBe(1); - - component.showArchivedForms = true; - expect(component.filteredForms.length).toBe(2); - }); - }); - - describe('Toggle Methods', () => { - it('should toggle edit details mode', () => { - component.event = { - id: 1, - name: 'Test Event', - description: 'Test Description' - } as any; - - expect(component.editingDetails).toBe(false); - - component.toggleEditDetails(); - expect(component.editingDetails).toBe(true); - expect(component.eventEditForm.name).toBe('Test Event'); - expect(component.eventEditForm.description).toBe('Test Description'); - - component.toggleEditDetails(); - expect(component.editingDetails).toBe(false); - }); - - it('should toggle edit members mode', () => { - expect(component.editMembers).toBe(false); - component.toggleEditMembers(); - expect(component.editMembers).toBe(true); - component.toggleEditMembers(); - expect(component.editMembers).toBe(false); - }); - - it('should toggle edit teams mode', () => { - expect(component.editTeams).toBe(false); - component.toggleEditTeams(); - expect(component.editTeams).toBe(true); - component.toggleEditTeams(); - expect(component.editTeams).toBe(false); - }); - - it('should toggle edit layers mode', () => { - expect(component.editLayers).toBe(false); - component.toggleEditLayers(); - expect(component.editLayers).toBe(true); - component.toggleEditLayers(); - expect(component.editLayers).toBe(false); - }); - }); - - describe('Form Preview', () => { - it('should preview form', () => { - const form = { id: 1, name: 'Test Form' }; - const event = new MouseEvent('click'); - spyOn(event, 'stopPropagation'); - - component.preview(event, form); - - expect(event.stopPropagation).toHaveBeenCalled(); - expect(component.previewForm).toBe(form); - }); - - it('should close preview', () => { - component.previewForm = { id: 1, name: 'Test Form' }; - - component.closePreview(); - - expect(component.previewForm).toBeNull(); - }); - }); - - describe('Track By Functions', () => { - it('should track forms by id', () => { - const form = { id: 123, name: 'Test' }; - - const result = component.trackByFormId(0, form); - - expect(result).toBe(123); - }); - }); - - describe('Cancel Actions', () => { - it('should cancel edit details', () => { - component.event = { - id: 1, - name: 'Original Name', - description: 'Original Description' - } as any; - component.editingDetails = true; - component.eventEditForm.name = 'Changed Name'; - component.eventEditForm.description = 'Changed Description'; - - component.cancelEditDetails(); - - expect(component.editingDetails).toBe(false); - expect(component.eventEditForm.name).toBe('Original Name'); - expect(component.eventEditForm.description).toBe('Original Description'); - }); - }); - - describe('User Role Management', () => { - beforeEach(() => { - component.eventTeam = { - id: '1', - name: 'Test Team', - acl: { - 'user1': { role: 'OWNER' }, - 'user2': { role: 'MANAGER' } - } - } as any; - }); - - it('should get user role from ACL', () => { - const user = { id: 'user1' } as any; - - const role = component.getUserRole(user); - - expect(role).toBe('OWNER'); - }); - - it('should return GUEST when user not in ACL', () => { - const user = { id: 'unknown' } as any; - - const role = component.getUserRole(user); - - expect(role).toBe('GUEST'); - }); - - it('should return GUEST when no event team', () => { - component.eventTeam = null; - const user = { id: 'user1' } as any; - - const role = component.getUserRole(user); - - expect(role).toBe('GUEST'); - }); - - it('should generate role class', () => { - const user = { id: 'user1' } as any; - - const roleClass = component.getRoleClass(user); - - expect(roleClass).toBe('user-role-badge role-owner'); - }); - }); - - describe('Search Methods', () => { - beforeEach(() => { - component.event = { id: 1, name: 'Test' } as any; - }); - - it('should search members and reset page', () => { - component.membersPageIndex = 2; - component.memberSearchTerm = 'test'; - - component.searchMembers(); - - expect(component.membersPageIndex).toBe(0); - expect(eventsService.getMembers).toHaveBeenCalled(); - }); - - it('should search teams and reset page', () => { - component.teamsPageIndex = 2; - component.teamSearchTerm = 'test'; - - component.searchTeams(); - - expect(component.teamsPageIndex).toBe(0); - expect(eventsService.getTeamsInEvent).toHaveBeenCalled(); - }); - }); - - describe('Member Management', () => { - beforeEach(() => { - component.event = { id: 1, name: 'Test' } as any; - component.eventTeam = { id: '1', name: 'Test Team' } as any; - }); - - it('should open dialog to add member to event', () => { - const dialogRef = jasmine.createSpyObj('MatDialogRef', ['afterClosed']); - dialogRef.afterClosed.and.returnValue(of(null)); - dialog.open.and.returnValue(dialogRef); - - component.addMemberToEvent(); - - expect(dialog.open).toHaveBeenCalledWith(jasmine.anything(), jasmine.objectContaining({ - panelClass: 'search-modal-dialog', - data: jasmine.objectContaining({ - title: 'Add Members to Event', - type: 'members' - }) - })); - }); - - it('should add member when dialog returns selection', () => { - const selectedUser = { id: '2', username: 'newuser' } as any; - const dialogRef = jasmine.createSpyObj('MatDialogRef', ['afterClosed']); - dialogRef.afterClosed.and.returnValue(of({ selectedItem: selectedUser })); - dialog.open.and.returnValue(dialogRef); - teamsService.addUserToTeam.and.returnValue(of({} as any)); - spyOn(component, 'getMembersPage'); - - component.addMemberToEvent(); - - expect(teamsService.addUserToTeam).toHaveBeenCalledWith('1', selectedUser); - expect(component.getMembersPage).toHaveBeenCalled(); - }); - - it('should handle error when adding member fails', () => { - const selectedUser = { id: '2', username: 'newuser' } as any; - const dialogRef = jasmine.createSpyObj('MatDialogRef', ['afterClosed']); - dialogRef.afterClosed.and.returnValue(of({ selectedItem: selectedUser })); - dialog.open.and.returnValue(dialogRef); - teamsService.addUserToTeam.and.returnValue(throwError(() => new Error('Add failed'))); - spyOn(console, 'error'); - - component.addMemberToEvent(); - - expect(console.error).toHaveBeenCalledWith('Error adding member:', jasmine.any(Error)); - }); - - it('should not add member when dialog is cancelled', () => { - const dialogRef = jasmine.createSpyObj('MatDialogRef', ['afterClosed']); - dialogRef.afterClosed.and.returnValue(of(null)); - dialog.open.and.returnValue(dialogRef); - - component.addMemberToEvent(); - - expect(teamsService.addUserToTeam).not.toHaveBeenCalled(); - }); - - it('should not open dialog when event team not found', () => { - component.eventTeam = null; - spyOn(console, 'error'); - - component.addMemberToEvent(); - - expect(console.error).toHaveBeenCalledWith('Event team not found'); - expect(dialog.open).not.toHaveBeenCalled(); - }); - - it('should remove member from team', () => { - const user = { id: '1', username: 'user1' } as any; - const event = new MouseEvent('click'); - teamsService.removeMember.and.returnValue(of({} as any)); - - component.removeMember(event, user); - - expect(teamsService.removeMember).toHaveBeenCalledWith('1', '1'); - }); - - it('should handle remove member error', () => { - const user = { id: '1', username: 'user1' } as any; - const event = new MouseEvent('click'); - spyOn(console, 'error'); - teamsService.removeMember.and.returnValue(throwError(() => new Error('Remove failed'))); - - component.removeMember(event, user); - - expect(console.error).toHaveBeenCalledWith('Error removing member:', jasmine.any(Error)); - }); - - it('should not remove member without event team', () => { - component.eventTeam = null; - const user = { id: '1', username: 'user1' } as any; - const event = new MouseEvent('click'); - spyOn(console, 'error'); - - component.removeMember(event, user); - - expect(console.error).toHaveBeenCalledWith('Event team not found'); - expect(teamsService.removeMember).not.toHaveBeenCalled(); - }); - - it('should update user role', () => { - const user = { id: '1', username: 'user1', displayName: 'User One' } as any; - const roleEvent = { source: null, value: 'MANAGER' } as MatSelectChange; - teamsService.updateUserRole.and.returnValue(of({ id: '1' } as any)); - - component.updateUserRole(user, roleEvent); - - expect(teamsService.updateUserRole).toHaveBeenCalledWith('1', '1', 'MANAGER'); - }); - - it('should handle update role error', () => { - component.eventTeam = null; - const user = { id: '1', username: 'user1' } as any; - const roleEvent = { source: null, value: 'MANAGER' } as MatSelectChange; - spyOn(console, 'error'); - - component.updateUserRole(user, roleEvent); - - expect(console.error).toHaveBeenCalledWith('Event team not found'); - }); - }); - - describe('Team Management', () => { - beforeEach(() => { - component.event = { id: 1, name: 'Test' } as any; - }); - - it('should open dialog to add team to event', () => { - const dialogRef = jasmine.createSpyObj('MatDialogRef', ['afterClosed']); - dialogRef.afterClosed.and.returnValue(of(null)); - dialog.open.and.returnValue(dialogRef); - - component.addTeamToEvent(); - - expect(dialog.open).toHaveBeenCalledWith(jasmine.anything(), jasmine.objectContaining({ - panelClass: 'search-modal-dialog', - data: jasmine.objectContaining({ - title: 'Add Teams to Event', - type: 'teams' - }) - })); - }); - - it('should add team when dialog returns selection', () => { - const selectedTeam = { id: '2', name: 'New Team' } as any; - const dialogRef = jasmine.createSpyObj('MatDialogRef', ['afterClosed']); - dialogRef.afterClosed.and.returnValue(of({ selectedItem: selectedTeam })); - dialog.open.and.returnValue(dialogRef); - eventsService.addTeamToEvent.and.returnValue(of(undefined)); - spyOn(component, 'getTeamsPage'); - - component.addTeamToEvent(); - - expect(eventsService.addTeamToEvent).toHaveBeenCalledWith('1', selectedTeam); - expect(component.getTeamsPage).toHaveBeenCalled(); - }); - - it('should handle error when adding team fails', () => { - const selectedTeam = { id: '2', name: 'New Team' } as any; - const dialogRef = jasmine.createSpyObj('MatDialogRef', ['afterClosed']); - dialogRef.afterClosed.and.returnValue(of({ selectedItem: selectedTeam })); - dialog.open.and.returnValue(dialogRef); - eventsService.addTeamToEvent.and.returnValue(throwError(() => new Error('Add failed'))); - spyOn(console, 'error'); - - component.addTeamToEvent(); - - expect(console.error).toHaveBeenCalledWith('Error adding team:', jasmine.any(Error)); - }); - - it('should not add team when dialog is cancelled', () => { - const dialogRef = jasmine.createSpyObj('MatDialogRef', ['afterClosed']); - dialogRef.afterClosed.and.returnValue(of(null)); - dialog.open.and.returnValue(dialogRef); - - component.addTeamToEvent(); - - expect(eventsService.addTeamToEvent).not.toHaveBeenCalled(); - }); - - it('should not open dialog when event not found', () => { - component.event = null; - - component.addTeamToEvent(); - - expect(dialog.open).not.toHaveBeenCalled(); - }); - - it('should remove team from event', () => { - const team = { id: '1', name: 'Team 1' } as any; - const event = new MouseEvent('click'); - eventsService.removeEventFromTeam.and.returnValue(of(undefined as void)); - - component.removeTeam(event, team); - - expect(eventsService.removeEventFromTeam).toHaveBeenCalledWith('1', '1'); - }); - - it('should not remove team without event', () => { - component.event = null; - const team = { id: '1', name: 'Team 1' } as any; - const event = new MouseEvent('click'); - - component.removeTeam(event, team); - - expect(eventsService.removeEventFromTeam).not.toHaveBeenCalled(); - }); - - it('should load teams page', () => { - const mockTeams = [ - { id: '1', name: 'Team 1' } as any, - { id: '2', name: 'Team 2' } as any - ]; - eventsService.getTeamsInEvent.and.returnValue(of({ - items: mockTeams, - totalCount: 2, - pageSize: 5, - pageIndex: 0 - })); - - component.getTeamsPage(); - - expect(eventsService.getTeamsInEvent).toHaveBeenCalledWith('1', { - page: 0, - page_size: 5, - term: '', - total: true, - omit_event_teams: true - }); - }); - - it('should not load teams without event', () => { - component.event = null; - - component.getTeamsPage(); - - expect(eventsService.getTeamsInEvent).not.toHaveBeenCalled(); - }); - }); - - describe('Layer Management', () => { - beforeEach(() => { - component.event = { id: 1, name: 'Test' } as any; - }); - - it('should open dialog to add layer to event', () => { - const dialogRef = jasmine.createSpyObj('MatDialogRef', ['afterClosed']); - dialogRef.afterClosed.and.returnValue(of(null)); - dialog.open.and.returnValue(dialogRef); - - component.addLayerToEvent(); - - expect(dialog.open).toHaveBeenCalledWith(jasmine.anything(), jasmine.objectContaining({ - panelClass: 'search-modal-dialog', - data: jasmine.objectContaining({ - title: 'Add Layers to Event', - type: 'layers' - }) - })); - }); - - it('should add layer when dialog returns selection', () => { - const selectedLayer = { id: 2, name: 'New Layer' } as any; - const dialogRef = jasmine.createSpyObj('MatDialogRef', ['afterClosed']); - dialogRef.afterClosed.and.returnValue(of({ selectedItem: selectedLayer })); - dialog.open.and.returnValue(dialogRef); - eventsService.addLayerToEvent.and.returnValue(of(undefined)); - spyOn(component, 'loadLayers'); - - component.addLayerToEvent(); - - expect(eventsService.addLayerToEvent).toHaveBeenCalledWith('1', { id: 2 }); - expect(component.loadLayers).toHaveBeenCalled(); - }); - - it('should handle error when adding layer fails', () => { - const selectedLayer = { id: 2, name: 'New Layer' } as any; - const dialogRef = jasmine.createSpyObj('MatDialogRef', ['afterClosed']); - dialogRef.afterClosed.and.returnValue(of({ selectedItem: selectedLayer })); - dialog.open.and.returnValue(dialogRef); - eventsService.addLayerToEvent.and.returnValue(throwError(() => new Error('Add failed'))); - spyOn(console, 'error'); - - component.addLayerToEvent(); - - expect(console.error).toHaveBeenCalledWith('Error adding layer:', jasmine.any(Error)); - }); - - it('should not add layer when dialog is cancelled', () => { - const dialogRef = jasmine.createSpyObj('MatDialogRef', ['afterClosed']); - dialogRef.afterClosed.and.returnValue(of(null)); - dialog.open.and.returnValue(dialogRef); - - component.addLayerToEvent(); - - expect(eventsService.addLayerToEvent).not.toHaveBeenCalled(); - }); - - it('should not open dialog when event not found', () => { - component.event = null; - - component.addLayerToEvent(); - - expect(dialog.open).not.toHaveBeenCalled(); - }); - - it('should load layers successfully', () => { - const eventLayers = [{ id: 1, name: 'Layer 1' } as any]; - eventsService.getLayersForEvent.and.returnValue(of(eventLayers)); - - component.loadLayers(); - - expect(eventsService.getLayersForEvent).toHaveBeenCalledWith('1'); - }); - - it('should not load layers without event', () => { - component.event = null; - - component.loadLayers(); - - expect(eventsService.getLayersForEvent).not.toHaveBeenCalled(); - }); - - it('should add layer to event', () => { - const layer = { id: 2, name: 'Layer 2' } as any; - const event = new MouseEvent('click'); - eventsService.addLayerToEvent.and.returnValue(of({} as any)); - - component.addLayer(event, layer); - - expect(eventsService.addLayerToEvent).toHaveBeenCalledWith('1', { id: 2 }); - }); - - it('should not add layer without event', () => { - component.event = null; - const layer = { id: 2, name: 'Layer 2' } as any; - const event = new MouseEvent('click'); - - component.addLayer(event, layer); - - expect(eventsService.addLayerToEvent).not.toHaveBeenCalled(); - }); - - it('should remove layer from event', () => { - const layer = { id: 1, name: 'Layer 1' } as any; - const event = new MouseEvent('click'); - eventsService.removeLayerFromEvent.and.returnValue(of({} as any)); - - component.removeLayer(event, layer); - - expect(eventsService.removeLayerFromEvent).toHaveBeenCalledWith('1', 1); - }); - - it('should not remove layer without event', () => { - component.event = null; - const layer = { id: 1, name: 'Layer 1' } as any; - const event = new MouseEvent('click'); - - component.removeLayer(event, layer); - - expect(eventsService.removeLayerFromEvent).not.toHaveBeenCalled(); - }); - - it('should navigate to layer', () => { - const layer = { id: 1, name: 'Layer 1' } as any; - - component.gotoLayer(layer); - - expect(stateService.go).toHaveBeenCalledWith('admin.layer', { layerId: 1 }); - }); - }); - - describe('Form Restrictions', () => { - beforeEach(() => { - component.event = { - id: 1, - name: 'Test', - minObservationForms: 0, - maxObservationForms: 10, - forms: [{ id: 1, min: 0, max: 5 }] - } as any; - }); - - it('should save form restrictions', () => { - eventsService.updateEvent.and.returnValue(of(component.event as any)); - - component.saveFormRestrictions(); - - expect(eventsService.updateEvent).toHaveBeenCalledWith('1', jasmine.objectContaining({ - minObservationForms: 0, - maxObservationForms: 10 - })); - }); - - it('should handle save restrictions error', () => { - const error = { error: { message: 'Validation error' } }; - eventsService.updateEvent.and.returnValue(throwError(() => error)); - spyOn(console, 'error'); - - component.saveFormRestrictions(); - - expect(console.error).toHaveBeenCalledWith('Error saving form restrictions:', error); - expect(component.restrictionsError).toEqual({ message: 'Validation error' }); - }); - - it('should not save without event', () => { - component.event = null; - - component.saveFormRestrictions(); - - expect(eventsService.updateEvent).not.toHaveBeenCalled(); - }); - }); - - describe('Event Details Editing', () => { - beforeEach(() => { - component.event = { - id: 1, - name: 'Test Event', - description: 'Test Description' - } as any; - }); - - it('should save event details', () => { - const updatedEvent = { ...component.event, name: 'Updated' } as any; - eventsService.updateEvent.and.returnValue(of(updatedEvent)); - component.eventEditForm.name = 'Updated'; - - component.saveEventDetails(); - - expect(eventsService.updateEvent).toHaveBeenCalled(); - expect(component.editingDetails).toBe(false); - }); - - it('should handle save error', () => { - eventsService.updateEvent.and.returnValue(throwError(() => new Error('Save failed'))); - spyOn(console, 'error'); - - component.saveEventDetails(); - - expect(console.error).toHaveBeenCalledWith('Error updating event:', jasmine.any(Error)); - }); - - it('should not save without event', () => { - component.event = null; - - component.saveEventDetails(); - - expect(eventsService.updateEvent).not.toHaveBeenCalled(); - }); - }); - - describe('Event Actions', () => { - beforeEach(() => { - component.event = { id: 1, name: 'Test Event' } as any; - }); - - it('should navigate to edit event', () => { - component.editEvent(component.event as any); - - expect(stateService.go).toHaveBeenCalledWith('admin.eventEdit', { eventId: 1 }); - }); - - it('should navigate to edit access', () => { - component.editAccess(component.event as any); - - expect(stateService.go).toHaveBeenCalledWith('admin.eventAccess', { eventId: 1 }); - }); - - it('should navigate to edit form', () => { - const form = { id: 1, name: 'Form 1' }; - - component.editForm(component.event as any, form); - - expect(stateService.go).toHaveBeenCalledWith('admin.formEdit', { eventId: 1, formId: 1 }); - }); - - it('should navigate to member (user)', () => { - const user = { id: '1', username: 'user1' } as any; - - component.gotoMember(user); - - expect(stateService.go).toHaveBeenCalledWith('admin.user', { userId: '1' }); - }); - - it('should navigate to member (team)', () => { - const team = { id: '1', name: 'Team 1' } as any; - - component.gotoMember(team); - - expect(stateService.go).toHaveBeenCalledWith('admin.team', { teamId: '1' }); - }); - - it('should navigate to team', () => { - const team = { id: '1', name: 'Team 1' } as any; - - component.gotoTeam(team); - - expect(stateService.go).toHaveBeenCalledWith('admin.team', { teamId: '1' }); - }); - - it('should complete event', () => { - const completedEvent = { ...component.event, complete: true } as any; - eventsService.updateEvent.and.returnValue(of(completedEvent)); - - component.completeEvent(component.event as any); - - expect(eventsService.updateEvent).toHaveBeenCalledWith('1', jasmine.objectContaining({ - complete: true - })); - }); - - it('should not complete without event', () => { - component.completeEvent(null as any); - - expect(eventsService.updateEvent).not.toHaveBeenCalled(); - }); - - it('should activate event', () => { - const activeEvent = { ...component.event, complete: false } as any; - eventsService.updateEvent.and.returnValue(of(activeEvent)); - - component.activateEvent(component.event as any); - - expect(eventsService.updateEvent).toHaveBeenCalledWith('1', jasmine.objectContaining({ - complete: false - })); - }); - - it('should not activate without event', () => { - component.activateEvent(null as any); - - expect(eventsService.updateEvent).not.toHaveBeenCalled(); - }); - - it('should delete event and navigate', () => { - const dialogRef = jasmine.createSpyObj('MatDialogRef', ['afterClosed']); - dialogRef.afterClosed.and.returnValue(of(true)); - dialog.open.and.returnValue(dialogRef); - - component.deleteEvent(); - - expect(dialog.open).toHaveBeenCalled(); - }); - - it('should not delete without event', () => { - component.event = null; - - component.deleteEvent(); - - expect(dialog.open).not.toHaveBeenCalled(); - }); - }); - - describe('Page Change Handlers', () => { - beforeEach(() => { - component.event = { id: 1, name: 'Test' } as any; - }); - - it('should handle member search change', () => { - component.onMemberSearchChange('search'); - - expect(component.memberSearchTerm).toBe('search'); - expect(component.membersPageIndex).toBe(0); - }); - - it('should handle members page change', () => { - component.onMembersPageChange({ pageIndex: 1, pageSize: 10, length: 50 }); - - expect(component.membersPageIndex).toBe(1); - expect(component.membersPageSize).toBe(10); - }); - - it('should handle team search change', () => { - component.onTeamSearchChange('team'); - - expect(component.teamSearchTerm).toBe('team'); - expect(component.teamsPageIndex).toBe(0); - }); - - it('should handle teams page change', () => { - component.onTeamsPageChange({ pageIndex: 2, pageSize: 5, length: 25 }); - - expect(component.teamsPageIndex).toBe(2); - expect(component.teamsPageSize).toBe(5); - }); - }); - - describe('Form Operations', () => { - beforeEach(() => { - component.event = { - id: 1, - name: 'Test', - forms: [ - { id: 1, name: 'Form 1', archived: false }, - { id: 2, name: 'Form 2', archived: false } - ] - } as any; - }); - - it('should create form dialog', () => { - const dialogRef = jasmine.createSpyObj('MatDialogRef', ['afterClosed']); - dialogRef.afterClosed.and.returnValue(of(null)); - dialog.open.and.returnValue(dialogRef); - - component.createForm(); - - expect(dialog.open).toHaveBeenCalled(); - }); - - it('should move form up', () => { - eventsService.updateEvent.and.returnValue(of(component.event as any)); - const form = component.event!.forms![1]; - const event = new MouseEvent('click'); - - component.moveFormUp(event, form); - - expect(eventsService.updateEvent).toHaveBeenCalled(); - expect(component.animatingFormId).toBe(form.id); - }); - - it('should move form down', () => { - eventsService.updateEvent.and.returnValue(of(component.event as any)); - const form = component.event!.forms![0]; - const event = new MouseEvent('click'); - - component.moveFormDown(event, form); - - expect(eventsService.updateEvent).toHaveBeenCalled(); - expect(component.animatingFormId).toBe(form.id); - }); - - it('should handle form drop', () => { - eventsService.updateEvent.and.returnValue(of(component.event as any)); - const dropEvent = { - previousIndex: 0, - currentIndex: 1 - } as any; - - component.onFormDrop(dropEvent); - - expect(eventsService.updateEvent).toHaveBeenCalled(); - }); - - it('should not perform operations without forms', () => { - component.event!.forms = undefined; - const event = new MouseEvent('click'); - - component.moveFormUp(event, { id: 1 }); - component.moveFormDown(event, { id: 1 }); - component.onFormDrop({ previousIndex: 0, currentIndex: 1 } as any); - - expect(eventsService.updateEvent).not.toHaveBeenCalled(); - }); - }); - - describe('Get non-archived forms', () => { - it('should return non-archived forms getter', () => { - component.event = { - id: 1, - name: 'Test', - forms: [ - { id: 1, archived: false }, - { id: 2, archived: true }, - { id: 3, archived: false } - ] - } as any; - - const forms = component.nonArchivedForms; - - expect(forms.length).toBe(2); - }); - }); -}); diff --git a/web-app/admin/src/app/admin/admin-event/event-details/event-details.component.ts b/web-app/admin/src/app/admin/admin-event/event-details/event-details.component.ts deleted file mode 100644 index 51354f6fc..000000000 --- a/web-app/admin/src/app/admin/admin-event/event-details/event-details.component.ts +++ /dev/null @@ -1,1160 +0,0 @@ -import { Component, OnInit, OnDestroy, Inject, ViewChild } from '@angular/core'; -import { trigger, transition, style, animate, query } from '@angular/animations'; -import { StateService } from '@uirouter/angular'; -import { MatDialog } from '@angular/material/dialog'; -import { PageEvent } from '@angular/material/paginator'; -import { MatSelectChange } from '@angular/material/select'; -import { MatTableDataSource } from '@angular/material/table'; -import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; -import { Subject, forkJoin, takeUntil, Observable } from 'rxjs'; -import { NgForm } from '@angular/forms'; -import { Event as MageEvent, Layer } from 'src/app/filter/filter.types'; -import { AdminBreadcrumb } from '../../admin-breadcrumb/admin-breadcrumb.model'; -import { CardActionButton } from '../../../core/card-navbar/card-navbar.component'; -import { EventsService } from '../../admin-event/events.service'; -import { User as MageUser } from '@ngageoint/mage.web-core-lib/user'; -import { Team } from '../../admin-teams/team'; -import { TeamsService } from '../../admin-teams/teams-service'; -import { SearchModalComponent, SearchModalData, SearchModalResult, SearchModalColumn } from '../../../core/search-modal/search-modal.component'; -import { DeleteEventComponent } from '../delete-event/delete-event.component'; -import { CreateFormDialogComponent } from '../create-form/create-form.component'; - -interface ExtendedEvent extends MageEvent { - complete?: boolean; - minObservationForms?: number; - maxObservationForms?: number; - teamIds?: string[]; - layerIds?: string[]; -} - -interface PagedResult { - items: T[]; - totalCount?: number; - pageSize?: number; - pageIndex?: number; -} - -@Component({ - selector: 'mage-event-details', - templateUrl: './event-details.component.html', - styleUrls: ['./event-details.component.scss'] -}) -/** - * Manages event details including members, teams, layers, and forms. - */ -export class EventDetailsComponent implements OnInit, OnDestroy { - private destroy$ = new Subject(); - - @ViewChild('restrictions', { static: false }) restrictionsForm?: NgForm; - - event: ExtendedEvent | null = null; - eventTeam: Team | null = null; - - breadcrumbs: AdminBreadcrumb[] = [{ - title: 'Events', - iconClass: 'fa fa-calendar', - state: { name: "admin.events" } - }]; - - hasReadPermission = false; - hasUpdatePermission = false; - hasDeletePermission = false; - - editingDetails = false; - eventEditForm = { - name: '', - description: '' - }; - - showArchivedForms = false; - formCreateOpen = false; - previewForm: any = null; - restrictionsError: any = null; - animatingFormId: number | null = null; - formsAnimationState = 0; - - loadingMembers = true; - membersPageIndex = 0; - membersPageSize = 5; - membersPage: PagedResult = { items: [], totalCount: 0 }; - memberSearchTerm = ''; - editMembers = false; - membersDataSource = new MatTableDataSource(); - membersDisplayedColumns = ['content']; - pageSizeOptions = [5, 10, 25]; - - loadingTeams = true; - teamsPageIndex = 0; - teamsPageSize = 5; - teamsPage: PagedResult = { items: [], totalCount: 0 }; - teamSearchTerm = ''; - editTeams = false; - teamsDataSource = new MatTableDataSource(); - teamsDisplayedColumns = ['content']; - - loadingLayers = true; - layersPageIndex = 0; - layersPageSize = 5; - layersPage: PagedResult = { items: [], totalCount: 0 }; - layerSearchTerm = ''; - editLayers = false; - eventLayers: Layer[] = []; - layersDataSource = new MatTableDataSource(); - layersDisplayedColumns = ['content']; - - memberActionButtons: CardActionButton[] = []; - teamActionButtons: CardActionButton[] = []; - layerActionButtons: CardActionButton[] = []; - - layers: Layer[] = []; - - constructor( - @Inject(EventsService) private eventsService: EventsService, - private teamsService: TeamsService, - private stateService: StateService, - private dialog: MatDialog - ) { } - - /** - * Configures action buttons for members, teams, and layers sections. - */ - private updateActionButtons(): void { - this.memberActionButtons = []; - this.teamActionButtons = []; - this.layerActionButtons = []; - - if (this.hasUpdatePermission) { - this.memberActionButtons.push({ - label: this.editMembers ? 'Done' : 'Edit Members', - action: () => this.toggleEditMembers(), - type: this.editMembers ? 'btn-primary' : 'btn-secondary' - }); - - this.memberActionButtons.push({ - label: 'Add Member', - action: () => this.addMemberToEvent(), - type: 'btn-secondary' - }); - - this.teamActionButtons.push({ - label: this.editTeams ? 'Done' : 'Edit Teams', - action: () => this.toggleEditTeams(), - type: this.editTeams ? 'btn-primary' : 'btn-secondary' - }); - - this.teamActionButtons.push({ - label: 'Add Team', - action: () => this.addTeamToEvent(), - type: 'btn-secondary' - }); - - this.layerActionButtons.push({ - label: this.editLayers ? 'Done' : 'Edit Layers', - action: () => this.toggleEditLayers(), - type: this.editLayers ? 'btn-primary' : 'btn-secondary' - }); - - this.layerActionButtons.push({ - label: 'Add Layer', - action: () => this.addLayerToEvent(), - type: 'btn-secondary' - }); - } - } - - ngOnInit(): void { - const eventId = this.stateService.params.eventId; - - forkJoin({ - event: this.eventsService.getEventById(eventId), - teams: this.eventsService.getTeamsInEvent(String(eventId), { - page: 0, - page_size: 100, - total: false - }) - }).pipe(takeUntil(this.destroy$)) - .subscribe({ - next: ({ event, teams }) => { - this.event = event; - - this.eventTeam = teams.items.find(team => - team.teamEventId === event.id - ) || null; - - this.getMembersPage(); - this.getTeamsPage(); - this.loadLayers(); - this.breadcrumbs.push({ title: this.event.name }) - }, - error: (error) => { - console.error('Error loading event:', error); - } - }); - - this.hasReadPermission = true; - this.hasUpdatePermission = true; - this.hasDeletePermission = true; - - this.updateActionButtons(); - } - - ngOnDestroy(): void { - this.destroy$.next(); - this.destroy$.complete(); - } - - /** - * Loads paginated members for the current event. - */ - getMembersPage(): void { - if (!this.event?.id) { - return; - } - - this.eventsService.getMembers(String(this.event.id), { - page: this.membersPageIndex, - page_size: this.membersPageSize, - term: this.memberSearchTerm, - total: true - }).pipe(takeUntil(this.destroy$)) - .subscribe({ - next: (page) => { - this.loadingMembers = false; - this.membersPage = { - items: page.items, - totalCount: page.totalCount || 0, - pageSize: page.pageSize, - pageIndex: page.pageIndex - }; - this.membersDataSource.data = page.items; - }, - error: (error) => { - this.loadingMembers = false; - console.error('Error loading members:', error); - } - }); - } - - /** - * Removes a user from the event team. - */ - removeMember($event: MouseEvent, user: MageUser): void { - $event.stopPropagation(); - - if (!this.eventTeam?.id) { - console.error('Event team not found'); - return; - } - - this.teamsService.removeMember(String(this.eventTeam.id), String(user.id)) - .pipe(takeUntil(this.destroy$)) - .subscribe({ - next: () => { - this.getMembersPage(); - }, - error: (error) => { - console.error('Error removing member:', error); - } - }); - } - - /** - * Searches members and resets to first page. - */ - searchMembers(): void { - this.membersPageIndex = 0; - this.getMembersPage(); - } - - /** - * Loads paginated teams for the current event. - */ - getTeamsPage(): void { - if (!this.event?.id) { - return; - } - - this.eventsService.getTeamsInEvent(String(this.event.id), { - page: this.teamsPageIndex, - page_size: this.teamsPageSize, - term: this.teamSearchTerm, - total: true, - omit_event_teams: true - }).pipe(takeUntil(this.destroy$)) - .subscribe({ - next: (page) => { - this.loadingTeams = false; - this.teamsPage = { - items: page.items, - totalCount: page.totalCount || 0, - pageSize: page.pageSize, - pageIndex: page.pageIndex - }; - this.teamsDataSource.data = page.items; - }, - error: (error) => { - this.loadingTeams = false; - console.error('Error loading teams:', error); - } - }); - } - - /** - * Removes a team from the event. - */ - removeTeam($event: MouseEvent, team: Team): void { - $event.stopPropagation(); - - if (!this.event?.id) { - return; - } - - this.eventsService.removeEventFromTeam(String(this.event.id), String(team.id)) - .pipe(takeUntil(this.destroy$)) - .subscribe({ - next: () => { - this.getTeamsPage(); - }, - error: (error) => { - console.error('Error removing team:', error); - } - }); - } - - /** - * Searches teams and resets to first page. - */ - searchTeams(): void { - this.teamsPageIndex = 0; - this.getTeamsPage(); - } - - /** - * Loads all layers for the current event and applies client-side pagination. - */ - loadLayers(): void { - if (!this.event?.id) { - return; - } - - this.eventsService.getLayersForEvent(String(this.event.id)) - .pipe(takeUntil(this.destroy$)) - .subscribe({ - next: (layers) => { - this.loadingLayers = false; - this.eventLayers = layers; - this.filterAndPaginateLayers(); - }, - error: (error) => { - this.loadingLayers = false; - console.error('Error loading layers:', error); - } - }); - } - - /** - * Filters and paginates layers on the client side. - */ - filterAndPaginateLayers(): void { - let filteredLayers = this.eventLayers; - if (this.layerSearchTerm) { - filteredLayers = this.eventLayers.filter(layer => - layer.name.toLowerCase().includes(this.layerSearchTerm.toLowerCase()) - ); - } - - const startIndex = this.layersPageIndex * this.layersPageSize; - const endIndex = startIndex + this.layersPageSize; - const paginatedLayers = filteredLayers.slice(startIndex, endIndex); - - this.layersPage = { - items: paginatedLayers, - totalCount: filteredLayers.length, - pageSize: this.layersPageSize, - pageIndex: this.layersPageIndex - }; - this.layersDataSource.data = paginatedLayers; - } - - /** - * Searches layers and resets to first page. - */ - searchLayers(): void { - this.layersPageIndex = 0; - this.filterAndPaginateLayers(); - } - - /** - * Adds a layer to the event. - */ - addLayer($event: MouseEvent, layer: Layer): void { - $event.stopPropagation(); - - if (!this.event?.id) { - return; - } - - this.eventsService.addLayerToEvent(String(this.event.id), { id: layer.id }) - .pipe(takeUntil(this.destroy$)) - .subscribe({ - next: () => { - this.loadLayers(); - }, - error: (error) => { - console.error('Error adding layer:', error); - } - }); - } - - /** - * Removes a layer from the event. - */ - removeLayer($event: MouseEvent, layer: Layer): void { - $event.stopPropagation(); - - if (!this.event?.id) { - return; - } - - this.eventsService.removeLayerFromEvent(String(this.event.id), layer.id) - .pipe(takeUntil(this.destroy$)) - .subscribe({ - next: () => { - this.loadLayers(); - }, - error: (error) => { - console.error('Error removing layer:', error); - } - }); - } - - /** - * Navigates to layer details page. - */ - gotoLayer(layer: Layer): void { - this.stateService.go('admin.layer', { layerId: layer.id }); - } - - /** - * Returns non-archived forms for display. - */ - get nonArchivedForms(): any[] { - if (!this.event?.forms) { - return []; - } - return this.event.forms.filter(form => !form.archived); - } - - /** - * Saves form restrictions (min/max) to the server. - */ - saveFormRestrictions(): void { - if (!this.event?.id) { - return; - } - - this.restrictionsError = null; - const eventUpdate: any = { - minObservationForms: this.event.minObservationForms, - maxObservationForms: this.event.maxObservationForms, - forms: this.event.forms.map(form => ({ - ...form, - min: form.min, - max: form.max - })) - }; - - this.eventsService.updateEvent(String(this.event.id), eventUpdate) - .pipe(takeUntil(this.destroy$)) - .subscribe({ - next: (updatedEvent: any) => { - if (this.event) { - this.event.minObservationForms = updatedEvent.minObservationForms; - this.event.maxObservationForms = updatedEvent.maxObservationForms; - - updatedEvent.forms?.forEach((updatedForm: any) => { - const localForm = this.event?.forms?.find(f => f.id === updatedForm.id); - if (localForm) { - localForm.min = updatedForm.min; - localForm.max = updatedForm.max; - } - }); - } - - if (this.restrictionsForm) { - this.restrictionsForm.form.markAsPristine(); - } - - console.log('Form restrictions saved successfully'); - }, - error: (error) => { - console.error('Error saving form restrictions:', error); - this.restrictionsError = error.error || { - message: 'Failed to save form restrictions. Please try again.' - }; - } - }); - } - - /** - * Opens dialog to create a new form for the event. - */ - createForm(): void { - if (!this.event) { - return; - } - - const dialogRef = this.dialog.open(CreateFormDialogComponent, { - width: '900px', - height: '800px', - maxWidth: '95vw', - maxHeight: '95vh', - data: { event: this.event } - }); - - dialogRef.afterClosed().subscribe(result => { - if (result?.id) { - this.stateService.go('admin.formEdit', { eventId: this.event?.id, formId: result.id }); - } else if (result) { - this.stateService.go('admin.fieldsCreate', { eventId: this.event?.id, form: result }); - } - }); - } - - /** - * Checks if a form can be moved up in the filtered list. - */ - canMoveFormUp(form: any): boolean { - if (!this.event?.forms) return false; - const filtered = this.filteredForms; - const filteredIndex = filtered.indexOf(form); - return filteredIndex > 0; - } - - /** - * Checks if a form can be moved down in the filtered list. - */ - canMoveFormDown(form: any): boolean { - if (!this.event?.forms) return false; - const filtered = this.filteredForms; - const filteredIndex = filtered.indexOf(form); - return filteredIndex >= 0 && filteredIndex < filtered.length - 1; - } - - /** - * Moves form up in display order with animation. - */ - moveFormUp($event: MouseEvent, form: any): void { - $event.stopPropagation(); - if (!this.event?.forms) return; - - const filtered = this.filteredForms; - const filteredIndex = filtered.indexOf(form); - - if (filteredIndex > 0) { - const previousForm = filtered[filteredIndex - 1]; - - const forms = [...this.event.forms]; - const currentIndex = forms.indexOf(form); - const targetIndex = forms.indexOf(previousForm); - - this.animatingFormId = form.id; - - [forms[targetIndex], forms[currentIndex]] = [forms[currentIndex], forms[targetIndex]]; - this.updateFormsOrder(forms); - - setTimeout(() => { - this.animatingFormId = null; - }, 400); - } - } - - /** - * Moves form down in display order with animation. - */ - moveFormDown($event: MouseEvent, form: any): void { - $event.stopPropagation(); - if (!this.event?.forms) return; - - const filtered = this.filteredForms; - const filteredIndex = filtered.indexOf(form); - - if (filteredIndex >= 0 && filteredIndex < filtered.length - 1) { - const nextForm = filtered[filteredIndex + 1]; - - const forms = [...this.event.forms]; - const currentIndex = forms.indexOf(form); - const targetIndex = forms.indexOf(nextForm); - - this.animatingFormId = form.id; - - [forms[currentIndex], forms[targetIndex]] = [forms[targetIndex], forms[currentIndex]]; - this.updateFormsOrder(forms); - - setTimeout(() => { - this.animatingFormId = null; - }, 400); - } - } - - /** - * Handles drag-and-drop form reordering. - */ - onFormDrop(event: CdkDragDrop): void { - if (!this.event?.forms) return; - - const filtered = this.filteredForms; - - const movedForm = filtered[event.previousIndex]; - const targetForm = filtered[event.currentIndex]; - - const forms = [...this.event.forms]; - const currentIndex = forms.indexOf(movedForm); - const newIndex = forms.indexOf(targetForm); - - moveItemInArray(forms, currentIndex, newIndex); - this.updateFormsOrder(forms); - } - - /** - * Updates form order on server and handles errors. - */ - private updateFormsOrder(forms: any[]): void { - if (!this.event?.id) return; - - this.event.forms = forms; - this.formsAnimationState++; - - this.eventsService.updateEvent(String(this.event.id), { forms }) - .pipe(takeUntil(this.destroy$)) - .subscribe({ - next: (updatedEvent) => { - this.event = updatedEvent; - }, - error: (error) => { - console.error('Error updating forms order:', error); - this.eventsService.getEventById(String(this.event!.id)) - .pipe(takeUntil(this.destroy$)) - .subscribe({ - next: (event) => { - this.event = event; - } - }); - } - }); - } - - /** - * Opens form preview dialog. - */ - preview($event: MouseEvent, form: any): void { - $event.stopPropagation(); - this.previewForm = form; - } - - /** - * Closes form preview dialog. - */ - closePreview(): void { - this.previewForm = null; - } - - /** - * TrackBy function for form list performance. - */ - trackByFormId(index: number, form: any): any { - return form.id; - } - - /** - * Returns filtered forms based on archived flag. - */ - get filteredForms(): any[] { - if (!this.event?.forms) { - return []; - } - if (this.showArchivedForms) { - return this.event.forms; - } - return this.event.forms.filter(form => !form.archived); - } - - /** - * Gets user's role in the event team. - */ - getUserRole(user: MageUser): string { - if (!this.eventTeam?.acl) { - return 'GUEST'; - } - const userAcl = this.eventTeam.acl[user.id]; - return userAcl?.role || 'GUEST'; - } - - /** - * Returns CSS class for user role badge. - */ - getRoleClass(user: MageUser): string { - const role = this.getUserRole(user); - return `user-role-badge role-${role.toLowerCase()}`; - } - - /** - * Updates a user's role in the event team. - */ - updateUserRole(user: MageUser, event: MatSelectChange): void { - if (!this.eventTeam?.id) { - console.error('Event team not found'); - return; - } - - const newRole = event.value; - - this.teamsService.updateUserRole(String(this.eventTeam.id), String(user.id), newRole) - .pipe(takeUntil(this.destroy$)) - .subscribe({ - next: (updatedTeam: Team) => { - this.eventTeam = updatedTeam; - const userIndex = this.membersPage.items.findIndex(u => u.id === user.id); - if (userIndex !== -1) { - const updatedUser = { ...this.membersPage.items[userIndex] }; - this.membersPage.items[userIndex] = updatedUser; - this.membersDataSource.data = [...this.membersPage.items]; - } - }, - error: (error) => { - console.error('Error updating user role:', error); - } - }); - } - - /** - * Toggles event details edit mode. - */ - toggleEditDetails(): void { - if (!this.editingDetails) { - this.eventEditForm.name = this.event?.name || ''; - this.eventEditForm.description = this.event?.description || ''; - } - this.editingDetails = !this.editingDetails; - } - - /** - * Saves edited event details to server. - */ - saveEventDetails(): void { - if (!this.event?.id) { - return; - } - - const updatedEvent = { - ...this.event, - name: this.eventEditForm.name, - description: this.eventEditForm.description - }; - - this.eventsService.updateEvent(String(this.event.id), updatedEvent) - .pipe(takeUntil(this.destroy$)) - .subscribe({ - next: (updated) => { - this.event = updated; - this.editingDetails = false; - }, - error: (error) => { - console.error('Error updating event:', error); - } - }); - } - - /** - * Cancels event details editing and reverts changes. - */ - cancelEditDetails(): void { - this.editingDetails = false; - this.eventEditForm.name = this.event?.name || ''; - this.eventEditForm.description = this.event?.description || ''; - } - - /** - * Navigates to event edit page. - */ - editEvent(mageEvent: ExtendedEvent): void { - this.stateService.go('admin.eventEdit', { eventId: mageEvent.id }); - } - - /** - * Navigates to event access page. - */ - editAccess(mageEvent: ExtendedEvent): void { - this.stateService.go('admin.eventAccess', { eventId: mageEvent.id }); - } - - /** - * Navigates to form edit page. - */ - editForm(mageEvent: ExtendedEvent, form: any): void { - this.stateService.go('admin.formEdit', { eventId: mageEvent.id, formId: form.id }); - } - - /** - * Navigates to member or team details page. - */ - gotoMember(member: MageUser | Team): void { - if ('username' in member) { - this.stateService.go('admin.user', { userId: member.id }); - } else { - this.stateService.go('admin.team', { teamId: member.id }); - } - } - - /** - * Marks event as complete. - */ - completeEvent(mageEvent: ExtendedEvent): void { - if (!mageEvent?.id) { - return; - } - - const updatedEvent = { - ...mageEvent, - complete: true - }; - - this.eventsService.updateEvent(String(mageEvent.id), updatedEvent) - .pipe(takeUntil(this.destroy$)) - .subscribe({ - next: (updated) => { - this.event = updated; - console.log('Event marked as complete:', updated); - }, - error: (error) => { - console.error('Error completing event:', error); - } - }); - } - - /** - * Reactivates a completed event. - */ - activateEvent(mageEvent: ExtendedEvent): void { - if (!mageEvent?.id) { - return; - } - - const updatedEvent = { - ...mageEvent, - complete: false - }; - - this.eventsService.updateEvent(String(mageEvent.id), updatedEvent) - .pipe(takeUntil(this.destroy$)) - .subscribe({ - next: (updated) => { - this.event = updated; - console.log('Event marked as active:', updated); - }, - error: (error) => { - console.error('Error activating event:', error); - } - }); - } - - /** - * Opens delete event confirmation dialog. - */ - deleteEvent(): void { - if (!this.event) { - return; - } - - const dialogRef = this.dialog.open(DeleteEventComponent, { - data: { event: this.event } - }); - - dialogRef.afterClosed().subscribe(result => { - if (result) { - this.stateService.go('admin.events'); - } - }); - } - - /** - * Handles member search input changes. - */ - onMemberSearchChange(searchTerm?: string): void { - this.memberSearchTerm = searchTerm || ''; - this.membersPageIndex = 0; - this.getMembersPage(); - } - - /** - * Handles member pagination changes. - */ - onMembersPageChange(event: PageEvent): void { - this.membersPageIndex = event.pageIndex; - this.membersPageSize = event.pageSize; - this.getMembersPage(); - } - - /** - * Handles team search input changes. - */ - onTeamSearchChange(searchTerm?: string): void { - this.teamSearchTerm = searchTerm || ''; - this.teamsPageIndex = 0; - this.getTeamsPage(); - } - - /** - * Handles team pagination changes. - */ - onTeamsPageChange(event: PageEvent): void { - this.teamsPageIndex = event.pageIndex; - this.teamsPageSize = event.pageSize; - this.getTeamsPage(); - } - - /** - * Handles layer search input changes. - */ - onLayerSearchChange(searchTerm?: string): void { - this.layerSearchTerm = searchTerm || ''; - this.layersPageIndex = 0; - this.filterAndPaginateLayers(); - } - - /** - * Handles layer pagination changes. - */ - onLayersPageChange(event: PageEvent): void { - this.layersPageIndex = event.pageIndex; - this.layersPageSize = event.pageSize; - this.filterAndPaginateLayers(); - } - - /** - * Navigates to team details page. - */ - gotoTeam(team: Team): void { - this.stateService.go('admin.team', { teamId: team.id }); - } - - /** - * Toggles member edit mode and updates action buttons. - */ - toggleEditMembers(): void { - this.editMembers = !this.editMembers; - this.updateActionButtons(); - } - - /** - * Toggles team edit mode and updates action buttons. - */ - toggleEditTeams(): void { - this.editTeams = !this.editTeams; - this.updateActionButtons(); - } - - /** - * Toggles layer edit mode and updates action buttons. - */ - toggleEditLayers(): void { - this.editLayers = !this.editLayers; - this.updateActionButtons(); - } - - /** - * Opens search dialog to add members to event. - */ - addMemberToEvent(): void { - if (!this.eventTeam?.id) { - console.error('Event team not found'); - return; - } - - const dialogRef = this.dialog.open(SearchModalComponent, { - panelClass: 'search-modal-dialog', - data: { - title: 'Add Members to Event', - searchPlaceholder: 'Search for users to add...', - type: 'members', - searchFunction: (searchTerm: string, page: number, pageSize: number): Observable => { - return this.eventsService.getNonMembers(String(this.event?.id), { - term: searchTerm, - page: page, - page_size: pageSize, - total: true - }); - }, - columns: [ - { - key: 'name', - label: 'Name', - displayFunction: (user: MageUser) => user.username || 'Unknown', - width: '40%' - }, - { - key: 'displayName', - label: 'Display Name', - displayFunction: (user: MageUser) => user.displayName || 'Unknown', - width: '35%' - }, - { - key: 'email', - label: 'Email', - displayFunction: (user: MageUser) => user.email || 'No email provided', - width: '35%' - } - ] as SearchModalColumn[] - } as SearchModalData - }); - - dialogRef.afterClosed().subscribe((result: SearchModalResult) => { - if (result && result.selectedItem && this.eventTeam?.id) { - this.teamsService.addUserToTeam(String(this.eventTeam.id), result.selectedItem).subscribe({ - next: () => { - this.getMembersPage(); - }, - error: (error) => { - console.error('Error adding member:', error); - } - }); - } - }); - } - - /** - * Opens search dialog to add teams to event. - */ - addTeamToEvent(): void { - if (!this.event?.id) { - return; - } - - const dialogRef = this.dialog.open(SearchModalComponent, { - panelClass: 'search-modal-dialog', - data: { - title: 'Add Teams to Event', - searchPlaceholder: 'Search for teams to add...', - type: 'teams', - searchFunction: (searchTerm: string, page: number, pageSize: number): Observable => { - return this.eventsService.getTeamsNotInEvent(String(this.event?.id), { - term: searchTerm, - page: page, - page_size: pageSize, - total: true, - omit_event_teams: true - }); - }, - columns: [ - { - key: 'name', - label: 'Team Name', - displayFunction: (team: Team) => team.name || 'Unnamed Team', - width: '50%' - }, - { - key: 'description', - label: 'Description', - displayFunction: (team: Team) => team.description || 'No description', - width: '50%' - } - ] as SearchModalColumn[] - } as SearchModalData - }); - - dialogRef.afterClosed().subscribe((result: SearchModalResult) => { - if (result && result.selectedItem && this.event?.id) { - this.eventsService.addTeamToEvent(String(this.event.id), result.selectedItem).subscribe({ - next: () => { - this.getTeamsPage(); - }, - error: (error) => { - console.error('Error adding team:', error); - } - }); - } - }); - } - - /** - * Opens search dialog to add layers to event. - */ - addLayerToEvent(): void { - if (!this.event?.id) { - return; - } - - const dialogRef = this.dialog.open(SearchModalComponent, { - panelClass: 'search-modal-dialog', - data: { - title: 'Add Layers to Event', - searchPlaceholder: 'Search for layers to add...', - type: 'layers', - searchFunction: (searchTerm: string, page: number, pageSize: number): Observable => { - return new Observable(observer => { - this.eventsService.getAllLayers().subscribe({ - next: (allLayers) => { - this.eventsService.getLayersForEvent(String(this.event?.id)).subscribe({ - next: (eventLayers) => { - const eventLayerIds = eventLayers.map(l => l.id); - let filteredLayers = allLayers.filter(layer => !eventLayerIds.includes(layer.id)); if (searchTerm) { - filteredLayers = filteredLayers.filter(layer => - layer.name.toLowerCase().includes(searchTerm.toLowerCase()) - ); - } - - const start = page * pageSize; - const paginatedLayers = filteredLayers.slice(start, start + pageSize); - - observer.next({ - items: paginatedLayers, - totalCount: filteredLayers.length, - pageSize: pageSize, - pageIndex: page - }); - observer.complete(); - }, - error: (error) => observer.error(error) - }); - }, - error: (error) => observer.error(error) - }); - }); - }, - columns: [ - { - key: 'name', - label: 'Layer Name', - displayFunction: (layer: Layer) => layer.name || 'Unnamed Layer', - width: '40%' - }, - { - key: 'type', - label: 'Type', - displayFunction: (layer: Layer) => layer.type || 'Unknown', - width: '30%' - }, - { - key: 'state', - label: 'State', - displayFunction: (layer: Layer) => layer.state || 'Unknown', - width: '30%' - } - ] as SearchModalColumn[] - } as SearchModalData - }); - - dialogRef.afterClosed().subscribe((result: SearchModalResult) => { - if (result && result.selectedItem && this.event?.id) { - this.eventsService.addLayerToEvent(String(this.event.id), { id: result.selectedItem.id }).subscribe({ - next: () => { - this.loadLayers(); - }, - error: (error) => { - console.error('Error adding layer:', error); - } - }); - } - }); - } -} diff --git a/web-app/admin/src/app/admin/admin-event/event-form-create/event-form-create.component.ts b/web-app/admin/src/app/admin/admin-event/event-form-create/event-form-create.component.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/web-app/admin/src/app/admin/admin-event/events.service.ts b/web-app/admin/src/app/admin/admin-event/events.service.ts deleted file mode 100644 index 9b845dfe3..000000000 --- a/web-app/admin/src/app/admin/admin-event/events.service.ts +++ /dev/null @@ -1,177 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient, HttpParams } from '@angular/common/http'; -import { Observable } from 'rxjs'; -import { Event, Layer } from 'src/app/filter/filter.types'; -import { Team } from '../admin-teams/team'; -import { User } from '@ngageoint/mage.web-core-lib/user'; - -export interface SearchOptions { - term?: string; - teamId?: string; - excludeTeamId?: string; - feedId?: string; - excludeFeedId?: string; - id?: string; - page?: number; - page_size?: number; - userId?: string; - state?: string; -} - -export interface PagedResponse { - pageSize?: number; - pageIndex?: number; - items: T[]; - totalCount?: number; -} - -export interface EventsResponse extends PagedResponse { } - -const setParams = (options: any): HttpParams => { - let params = new HttpParams(); - for (const key of Object.keys(options)) { - if (options[key] !== undefined && options[key] !== null) { - params = params.set(key, String(options[key])); - } - } - return params; -}; - -@Injectable({ - providedIn: 'root' -}) -export class EventsService { - constructor(private http: HttpClient) { } - - getEvents(options: SearchOptions): Observable { - const page = options.page ?? 0; - const pageSize = options.page_size ?? 10; - - const query: any = { - term: options.term, - teamId: options.teamId, - excludeTeamId: options.excludeTeamId, - userId: options.userId, - state: options.state, - - limit: pageSize, - start: page, - - includePagination: true - }; - - const params = setParams(query); - - return this.http.get('/api/events', { params }); - } - - - getEventById(eventId: string): Observable { - return this.http.get(`/api/events/${eventId}`); - } - - updateEvent(eventId: string, event: Partial): Observable { - return this.http.put(`/api/events/${eventId}`, event); - } - - deleteEvent(eventId: string): Observable { - return this.http.delete(`/api/events/${eventId}`); - } - - createEvent(eventData: Partial): Observable { - return this.http.post('/api/events', eventData); - } - - addTeamToEvent(eventId: string, team: Team): Observable { - return this.http.post(`/api/events/${eventId}/teams`, team); - } - - removeEventFromTeam(eventId: string, teamId: string): Observable { - return this.http.delete(`/api/events/${eventId}/teams/${teamId}`); - } - - getMembers( - eventId: string, - options: { - page?: number; - page_size?: number; - term?: string; - total?: boolean; - } - ): Observable> { - const params = setParams(options); - return this.http.get>( - `/api/events/${eventId}/members`, - { params } - ); - } - - getNonMembers( - eventId: string, - options: { - page?: number; - page_size?: number; - term?: string; - total?: boolean; - } - ): Observable> { - const params = setParams(options); - return this.http.get>( - `/api/events/${eventId}/nonMembers`, - { params } - ); - } - - getTeamsInEvent( - eventId: string, - options: { - page?: number; - page_size?: number; - term?: string; - total?: boolean; - omit_event_teams?: boolean; - } - ): Observable> { - const params = setParams(options); - return this.http.get>(`/api/events/${eventId}/teams`, { - params - }); - } - - getTeamsNotInEvent( - eventId: string, - options: { - page?: number; - page_size?: number; - term?: string; - total?: boolean; - omit_event_teams?: boolean; - } - ): Observable> { - const params = setParams(options); - return this.http.get>( - `/api/events/${eventId}/nonTeams`, - { params } - ); - } - - getAllLayers(): Observable { - return this.http.get('/api/layers'); - } - - getLayersForEvent(eventId: string): Observable { - return this.http.get(`/api/events/${eventId}/layers`); - } - - addLayerToEvent(eventId: string, layer: { id: number }): Observable { - return this.http.post(`/api/events/${eventId}/layers`, layer); - } - - removeLayerFromEvent(eventId: string, layerId: number): Observable { - return this.http.delete(`/api/events/${eventId}/layers/${layerId}`); - } - - createForm(eventId: string, formData: FormData): Observable { - return this.http.post(`/api/events/${eventId}/forms`, formData); - } -} diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed.component.html b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed.component.html index 8e0e94d81..a6a5de1f8 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed.component.html +++ b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed.component.html @@ -88,8 +88,7 @@ - + {{event.name}} @@ -99,7 +98,8 @@
- + event
{{event.name}}
@@ -113,8 +113,7 @@
- +
@@ -129,4 +128,4 @@
Loading
- \ No newline at end of file + diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed.component.ts b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed.component.ts index 5381971d9..c1b6bbfa1 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed.component.ts +++ b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed.component.ts @@ -2,7 +2,7 @@ import _ from 'underscore' import { Component, OnInit, Inject, ElementRef, ViewChild } from '@angular/core' import { UntypedFormControl } from '@angular/forms' import { Observable } from 'rxjs' -import { map, startWith, debounceTime, switchMap } from 'rxjs/operators' +import { map, startWith } from 'rxjs/operators' import { StateService } from '@uirouter/angular' import { UserService, Event } from '../../../upgrade/ajs-upgraded-providers' import { ServiceType, FeedTopic, Service, FeedExpanded, FeedService } from '@ngageoint/mage.web-core-lib/feed' @@ -12,7 +12,6 @@ import { MatSnackBar } from '@angular/material/snack-bar' import { trigger, state, transition, style, animate } from '@angular/animations' import { AdminBreadcrumb } from '../../admin-breadcrumb/admin-breadcrumb.model' import { AdminFeedDeleteComponent } from './admin-feed-delete/admin-feed-delete.component' -import { EventsService } from '../../admin-event/events.service' @Component({ selector: 'app-admin-feed', @@ -52,7 +51,6 @@ export class AdminFeedComponent implements OnInit { eventsPerPage = 10 eventsPage = 0 - totalFeedEvents = 0 editEvent = false addEvent = false selectedEvent: string @@ -63,7 +61,6 @@ export class AdminFeedComponent implements OnInit { events = [] nonFeedEvents: Array = [] feedEvents = [] as any[] - loadingEvents = false service: Service feedServiceType: ServiceType @@ -76,15 +73,14 @@ export class AdminFeedComponent implements OnInit { private stateService: StateService, public dialog: MatDialog, private snackBar: MatSnackBar, - private eventsService: EventsService, - @Inject(UserService) private userService: { myself: { id: string, role: { permissions: Array } } }, + @Inject(UserService) private userService: { myself: { id: string, role: {permissions: Array}}}, @Inject(Event) private eventResource: any - ) { - this.hasFeedCreatePermission = _.contains(userService.myself.role.permissions, 'FEEDS_CREATE_FEED') - this.hasFeedEditPermission = _.contains(userService.myself.role.permissions, 'FEEDS_CREATE_FEED') - this.hasFeedDeletePermission = _.contains(userService.myself.role.permissions, 'FEEDS_CREATE_FEED') - this.hasUpdateEventPermission = _.contains(userService.myself.role.permissions, 'UPDATE_EVENT') - } + ) { + this.hasFeedCreatePermission = _.contains(userService.myself.role.permissions, 'FEEDS_CREATE_FEED') + this.hasFeedEditPermission = _.contains(userService.myself.role.permissions, 'FEEDS_CREATE_FEED') + this.hasFeedDeletePermission = _.contains(userService.myself.role.permissions, 'FEEDS_CREATE_FEED') + this.hasUpdateEventPermission = _.contains(userService.myself.role.permissions, 'UPDATE_EVENT') + } ngOnInit(): void { if (this.stateService.params.feedId) { @@ -102,59 +98,56 @@ export class AdminFeedComponent implements OnInit { this.feedService.fetchServiceType(this.service.serviceType as string).subscribe(serviceType => { this.feedServiceType = serviceType }); - - this.loadAllEvents(); - this.filteredChoices = this.searchControl.valueChanges.pipe( - startWith(''), - debounceTime(300), - switchMap(value => { - const searchTerm = !value || typeof value === 'string' ? value : value.name; - return this.loadAvailableEvents(searchTerm || ''); - }) - ); }); - } } - loadAllEvents(): void { - this.loadingEvents = true; - this.eventsService.getEvents({ - feedId: this.feed.id, - page: this.eventsPage, - page_size: this.eventsPerPage - }).subscribe({ - next: (response) => { - this.feedEvents = response.items || []; - this.totalFeedEvents = response.totalCount || 0; - this.loadingEvents = false; - }, - error: (err) => { - console.error('Error loading feed events:', err); - this.loadingEvents = false; + this.eventResource.query(events => { + this.events = events.sort((a: {name: string}, b: {name: string}) => { + if (a.name < b.name) { return -1; } + if (a.name > b.name) { return 1; } + return 0; + }); + + this.feedEvents = _.filter(events, event => { + return _.some(event.feedIds, feedId => { + return this.feed.id === feedId; + }); + }); + + let chain = _.chain(events); + if (!this.hasUpdateEventPermission) { + // filter teams based on acl + chain = chain.filter(event => { + const permissions = event.acl[this.userService.myself.id] + ? event.acl[this.userService.myself.id].permissions + : []; + return _.contains(permissions, 'update'); + }); } + + this.nonFeedEvents = chain.reject(event => { + return _.some(event.feedIds, (feedId: string) => { + return this.feed.id === feedId + }); + }) + .value() + .sort((a: any, b:any) => a.name < b.name ? -1 : 1) + + this.filteredChoices = this.searchControl.valueChanges.pipe( + startWith(''), + map(value => { + return !value || typeof value === 'string' ? value : value.title + }), + map(title => { + return title ? this.filter(title) : this.nonFeedEvents.slice() + }) + ); }); } - loadAvailableEvents(searchTerm: string): Observable { - return this.eventsService.getEvents({ - term: searchTerm, - excludeFeedId: this.feed.id, - page: 0, - page_size: 20 - }).pipe( - map(response => { - let events = response.items || []; - - if (!this.hasUpdateEventPermission) { - events = events.filter(event => { - const permissions = event.acl?.[this.userService.myself.id]?.permissions || []; - return permissions.includes('update'); - }); - } - - return events; - }) - ); + private filter(title: string): Event[] { + const filterValue = title.toLowerCase() + return this.nonFeedEvents.filter((event: any) => event.name.toLowerCase().indexOf(filterValue) === 0) } toggleNewEvent(): void { @@ -169,12 +162,15 @@ export class AdminFeedComponent implements OnInit { addFeedToEvent($event: MatAutocompleteSelectedEvent): void { this.eventResource.addFeed({ id: $event.option.id }, `"${this.feed.id}"`, event => { + this.feedEvents.push(event); + this.nonFeedEvents = _.reject(this.nonFeedEvents, e => { + return e.id === event.id + }) this.searchControl.reset() + this.eventModel = null this.addEvent = false - this.loadAllEvents(); - this.snackBar.open(`Feed added to event ${event.name}`, undefined, { duration: 5 * 1000, }); @@ -185,22 +181,19 @@ export class AdminFeedComponent implements OnInit { $event.stopPropagation(); this.eventResource.removeFeed({ id: event.id, feedId: this.feed.id }, removed => { + this.feedEvents = _.reject(this.feedEvents, e => { + return e.id === event.id + }); + this.nonFeedEvents.push(event) + this.nonFeedEvents = this.nonFeedEvents.sort((a: any, b: any) => a.name < b.name ? -1 : 1) this.searchControl.reset() - this.loadAllEvents(); - this.snackBar.open(`Feed removed from event ${event.name}`, undefined, { duration: 5 * 1000, }); }); } - onEventsPageChange(event: any): void { - this.eventsPage = event.pageIndex; - this.eventsPerPage = event.pageSize; - this.loadAllEvents(); - } - editFeed(): void { this.stateService.go('admin.feedEdit', { feedId: this.feed.id }) } diff --git a/web-app/admin/src/app/admin/admin-layers/admin-layers.module.ts b/web-app/admin/src/app/admin/admin-layers/admin-layers.module.ts deleted file mode 100644 index ca95b3952..000000000 --- a/web-app/admin/src/app/admin/admin-layers/admin-layers.module.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatButtonModule } from '@angular/material/button'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatTableModule } from '@angular/material/table'; -import { MatIconModule } from '@angular/material/icon'; -import { MatSelectModule } from '@angular/material/select'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { CoreModule } from '../../core/core.module'; -import { LayerDashboardComponent } from './dashboard/layer-dashboard.component'; -import { CreateLayerDialogComponent } from './create-layer/create-layer.component'; -import { LayersService } from './layers.service'; -import { AdminBreadcrumbModule } from '../admin-breadcrumb/admin-breadcrumb.module'; - -@NgModule({ - declarations: [ - LayerDashboardComponent, - CreateLayerDialogComponent - ], - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - MatDialogModule, - MatButtonModule, - MatPaginatorModule, - MatTableModule, - MatIconModule, - MatSelectModule, - MatFormFieldModule, - MatTooltipModule, - CoreModule, - AdminBreadcrumbModule - ], - providers: [ - LayersService - ], - exports: [ - LayerDashboardComponent - ] -}) -export class AdminLayersModule { } diff --git a/web-app/admin/src/app/admin/admin-layers/create-layer/create-layer.component.html b/web-app/admin/src/app/admin/admin-layers/create-layer/create-layer.component.html deleted file mode 100644 index cc593947a..000000000 --- a/web-app/admin/src/app/admin/admin-layers/create-layer/create-layer.component.html +++ /dev/null @@ -1,139 +0,0 @@ -
-
-

Create a New Layer

-
- -
-
- - {{ errorMessage }} -
- -
-
- - -
- - Name is required - - - A layer with this name already exists - -
-
- -
- - -
- - - WMS, XYZ or TMS Layers - - - - Static layers (KML/KMZ) - - - - Downloadable GeoPackage layers - -
-
- - Type is required - -
-
- -
-
- - -
- - URL is required for Imagery layers - -
-
- -
- -
- - - -
-
- -
- -
-
- -
-
- -
- - -
-
- - Select a .gpkg file to upload -
-
-
- -
- - -
-
-
- -
- - -
-
\ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-layers/create-layer/create-layer.component.scss b/web-app/admin/src/app/admin/admin-layers/create-layer/create-layer.component.scss deleted file mode 100644 index 182a9eba0..000000000 --- a/web-app/admin/src/app/admin/admin-layers/create-layer/create-layer.component.scss +++ /dev/null @@ -1,341 +0,0 @@ -.dialog-modal { - display: flex; - flex-direction: column; - height: 100%; - width: 100%; -} - -.dialog-header { - padding: 24px 24px 16px; - border-bottom: 1px solid #e0e0e0; - flex-shrink: 0; -} - -.dialog-title { - margin: 0; - font-size: 20px; - font-weight: 500; - color: #333; -} - -.dialog-content { - padding: 24px; - flex: 1; - overflow-y: auto; - min-height: 0; - position: relative; -} - -.error-popover { - position: absolute; - top: 10px; - left: 50%; - transform: translateX(-50%); - background-color: #f8d7da; - color: #721c24; - padding: 10px 20px; - border-radius: 4px; - border: 1px solid #f5c6cb; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); - display: flex; - align-items: center; - gap: 8px; - z-index: 1000; - animation: slideDown 0.3s ease; -} - -@keyframes slideDown { - from { - opacity: 0; - transform: translate(-50%, -10px); - } - - to { - opacity: 1; - transform: translate(-50%, 0); - } -} - -.layer-form { - display: flex; - flex-direction: column; - gap: 1.5rem; -} - -.form-field { - display: flex; - flex-direction: column; - gap: 0.5rem; - - .field-label { - font-size: 0.875rem; - font-weight: 600; - color: #374151; - text-transform: uppercase; - letter-spacing: 0.05em; - } - - .form-input { - width: 100%; - padding: 0.75rem 1rem; - border: 1px solid #d1d5db; - border-radius: 8px; - font-size: 0.875rem; - background-color: #f9fafb; - transition: all 0.2s ease; - resize: vertical; - font-family: inherit; - - &:focus { - outline: none; - border-color: #3b82f6; - background-color: white; - box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); - } - - &::placeholder { - color: #9ca3af; - } - - &:disabled { - background-color: #f3f4f6; - color: #9ca3af; - cursor: not-allowed; - } - } - - // Select-specific styles - select.form-input { - cursor: pointer; - appearance: none; - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%236b7280' d='M6 9L1 4h10z'/%3E%3C/svg%3E"); - background-repeat: no-repeat; - background-position: right 1rem center; - padding-right: 2.5rem; - } - - .field-error { - min-height: 1.2em; - display: flex; - align-items: center; - gap: 4px; - } - - .field-error .error-text { - opacity: 0; - transition: opacity 0.2s ease; - color: #d9534f; - font-size: 0.875rem; - } - - .field-error .error-text.visible { - opacity: 1; - } - - .type-description { - margin-top: 0.25rem; - min-height: 0; - } - - .description-text { - display: flex; - align-items: center; - gap: 0.5rem; - font-size: 0.875rem; - color: #6b7280; - font-style: italic; - - i { - color: #3b82f6; - font-size: 0.875rem; - } - } -} - -.conditional-fields { - display: flex; - flex-direction: column; - gap: 1rem; - padding: 0.75rem; - background-color: #f9fafb; - border-radius: 8px; - border: 1px solid #e5e7eb; -} - -.radio-group { - display: flex; - gap: 1.5rem; - flex-wrap: wrap; -} - -.radio-label { - display: flex; - align-items: center; - gap: 0.5rem; - cursor: pointer; - font-size: 0.875rem; - color: #374151; - - input[type="radio"] { - width: 1rem; - height: 1rem; - cursor: pointer; - } - - &:hover { - color: #1976d2; - } -} - -.checkbox-label { - display: flex; - align-items: center; - gap: 0.5rem; - cursor: pointer; - font-size: 0.875rem; - color: #374151; - font-weight: 500; - - input[type="checkbox"] { - width: 1.125rem; - height: 1.125rem; - cursor: pointer; - } - - &:hover { - color: #1976d2; - } -} - -.file-upload-container { - display: flex; - flex-direction: column; -} - -.file-input { - display: none; -} - -.file-label { - display: inline-flex; - align-items: center; - justify-content: center; - gap: 0.75rem; - padding: 0.875rem 1.5rem; - background-color: white; - border: 2px dashed #d1d5db; - border-radius: 8px; - cursor: pointer; - transition: all 0.2s ease; - font-size: 0.875rem; - color: #6b7280; - font-weight: 500; - - i { - font-size: 1rem; - color: #3b82f6; - } - - .file-name { - color: #374151; - font-weight: 600; - } - - &:hover { - border-color: #3b82f6; - background-color: #f0f9ff; - } -} - -.field-hint { - display: flex; - align-items: center; - gap: 0.5rem; - margin-top: 0.5rem; - font-size: 0.8125rem; - color: #6b7280; - font-style: italic; - - i { - color: #3b82f6; - font-size: 0.8125rem; - } -} - -.dialog-actions { - display: flex; - justify-content: flex-end; - gap: 12px; - padding: 16px 24px; - border-top: 1px solid #e0e0e0; - flex-shrink: 0; - background-color: transparent; -} - -.action-button { - padding: 10px 20px; - font-size: 14px; - font-weight: 500; - border: none; - border-radius: 4px; - cursor: pointer; - transition: background-color 0.2s; - display: inline-flex; - align-items: center; - gap: 8px; - - &:hover:not(:disabled) { - opacity: 0.9; - } - - &:disabled { - opacity: 0.5; - cursor: not-allowed; - } - - &:not(.btn-primary) { - background-color: transparent; - color: #1976d2; - - &:hover:not(:disabled) { - background-color: rgba(25, 118, 210, 0.08); - } - } - - &.btn-primary { - background-color: #1976d2; - color: white; - - &:hover:not(:disabled) { - background-color: #1565c0; - } - } -} - -::ng-deep .mat-dialog-container { - padding: 0; - border-radius: 12px; - box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), - 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; -} - -::ng-deep mat-dialog-container { - min-height: 460px; - max-height: 90vh; - width: 700px; -} - -::ng-deep .mat-dialog-actions { - padding: 0; - margin: 0; -} - -::ng-deep .mat-dialog-content { - padding: 0; - margin: 0; -} - -::ng-deep .mat-dialog-title { - padding: 0; - margin: 0; -} \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-layers/create-layer/create-layer.component.ts b/web-app/admin/src/app/admin/admin-layers/create-layer/create-layer.component.ts deleted file mode 100644 index 42d16c420..000000000 --- a/web-app/admin/src/app/admin/admin-layers/create-layer/create-layer.component.ts +++ /dev/null @@ -1,188 +0,0 @@ -import { Component, Inject } from '@angular/core'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { FormBuilder, FormGroup, Validators, AbstractControl, ValidationErrors, AsyncValidatorFn } from '@angular/forms'; -import { LayersService, Layer } from '../layers.service'; -import { Observable, of } from 'rxjs'; -import { map, catchError, debounceTime, first } from 'rxjs/operators'; - -/** - * Dialog component for creating new layers. - * Provides a form interface with validation for layer name (required) and description (optional). - */ -@Component({ - selector: 'mage-admin-layer-create', - templateUrl: './create-layer.component.html', - styleUrls: ['./create-layer.component.scss'] -}) -export class CreateLayerDialogComponent { - layerForm: FormGroup; - errorMessage: string = ''; - geopackageFile: File | null = null; - geopackageFileName: string = ''; - - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: { layer: Partial }, - private fb: FormBuilder, - private layersService: LayersService - ) { - this.layerForm = this.fb.group({ - name: [ - data.layer?.name ?? '', - [Validators.required], - [this.duplicateLayerNameValidator()] - ], - type: [data.layer?.type ?? '', [Validators.required]], - description: [data.layer?.description ?? ''], - url: [''], - format: ['XYZ'], - base: [false] - }); - } - - /** - * Async validator to check if a layer name already exists - */ - private duplicateLayerNameValidator(): AsyncValidatorFn { - return (control: AbstractControl): Observable => { - if (!control.value) { - return of(null); - } - - return this.layersService.getLayers().pipe( - debounceTime(300), - map(layers => { - const nameExists = layers.some( - layer => layer.name?.toLowerCase() === control.value.toLowerCase() - ); - return nameExists ? { duplicateName: true } : null; - }), - catchError(() => of(null)), - first() - ); - }; - } - - /** - * Handles layer type change to add/remove validators and reset fields - */ - onTypeChange(): void { - const type = this.layerForm.get('type')?.value; - const urlControl = this.layerForm.get('url'); - const formatControl = this.layerForm.get('format'); - const baseControl = this.layerForm.get('base'); - - urlControl?.clearValidators(); - urlControl?.setValue(''); - formatControl?.setValue('XYZ'); - baseControl?.setValue(false); - this.geopackageFile = null; - this.geopackageFileName = ''; - - if (type === 'Imagery') { - urlControl?.setValidators([Validators.required]); - } - - urlControl?.updateValueAndValidity(); - } - - /** - * Handles GeoPackage file selection - */ - onGeoPackageFileSelected(event: Event): void { - const input = event.target as HTMLInputElement; - if (input.files?.length > 0) { - this.geopackageFile = input.files[0]; - this.geopackageFileName = this.geopackageFile.name; - } - } - - /** - * Handles form submission for creating a new layer. - * Validates the form, creates the layer via the layers service, and closes the dialog on success. - */ - save(): void { - if (this.layerForm.invalid) { - this.errorMessage = 'Please fill in all required fields.'; - return; - } - - if (this.layerForm.get('type')?.value === 'GeoPackage' && !this.geopackageFile) { - this.errorMessage = 'Please select a GeoPackage file.'; - return; - } - - this.errorMessage = ''; - const formValue = this.layerForm.value; - - let layerData: any; - - if (formValue.type === 'GeoPackage' && this.geopackageFile) { - const formData = new FormData(); - formData.append('name', formValue.name); - formData.append('type', formValue.type); - if (formValue.description) { - formData.append('description', formValue.description); - } - formData.append('geopackage', this.geopackageFile); - layerData = formData; - } else { - // Use regular JSON for other layer types - layerData = { - name: formValue.name, - type: formValue.type, - description: formValue.description - }; - - if (formValue.type === 'Imagery') { - layerData.url = formValue.url; - layerData.format = formValue.format; - layerData.base = formValue.base; - } - } - - this.layersService.createLayer(layerData).subscribe({ - next: (newLayer) => { - this.dialogRef.close(newLayer); - }, - error: ({ status, error }) => { - if (status === 400 && error?.errors) { - const fieldErrors = error.errors; - if (fieldErrors.name?.type === 'unique') { - this.errorMessage = fieldErrors.name.message; - } else { - this.errorMessage = error.message ?? 'Validation failed'; - } - } else if (status === 409) { - this.errorMessage = error; - } else { - this.errorMessage = 'Failed to create layer. Please try again.'; - } - } - }); - } - - /** - * Checks if the save button should be disabled - */ - get canSave(): boolean { - const nameControl = this.layerForm.get('name'); - const typeControl = this.layerForm.get('type'); - - if (!nameControl?.value || !typeControl?.value) { - return true; - } - if (typeControl.value === 'GeoPackage' && !this.geopackageFile) { - return true; - } - - return this.layerForm.invalid; - } - - /** - * Closes the dialog without saving any data or making any changes. - */ - cancel(): void { - this.dialogRef.close(); - } -} diff --git a/web-app/admin/src/app/admin/admin-layers/dashboard/layer-dashboard.component.html b/web-app/admin/src/app/admin/admin-layers/dashboard/layer-dashboard.component.html deleted file mode 100644 index 9e1bcdbf7..000000000 --- a/web-app/admin/src/app/admin/admin-layers/dashboard/layer-dashboard.component.html +++ /dev/null @@ -1,70 +0,0 @@ - - -
- - -
-
-
- - - - Type - - All Layers - Online Layers - Downloadable Layers - - -
- -
- -
-
- -
- - - - - - - - - -
Layer -
- -
-
{{ layer.name }}
-
-

- {{ layer.description || 'No description' }} -

- {{ layer.type }} -
-
-
-
-
- - -
No layers found.
-
- - -
-
\ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-layers/dashboard/layer-dashboard.component.scss b/web-app/admin/src/app/admin/admin-layers/dashboard/layer-dashboard.component.scss deleted file mode 100644 index d43eb3db2..000000000 --- a/web-app/admin/src/app/admin/admin-layers/dashboard/layer-dashboard.component.scss +++ /dev/null @@ -1,341 +0,0 @@ -::ng-deep .admin-main-content { - min-width: 520px; - - &:has(admin-users) { - height: 92vh; - overflow-y: hidden; - -webkit-overflow-scrolling: touch; - - @media (max-height: 500px) { - overflow-y: scroll; - } - } - - admin-users { - .container { - height: 90vh; - } - } -} - -$min-height: 40.8vh; -$max-height: 72.8vh; - -.container.bottom-gap-l { - margin-bottom: 2rem; -} - -.admin-nav-gap { - margin-top: -15px; - margin-bottom: -15px; - - .breadcrumbs-toolbar { - min-height: 36px !important; - height: 36px; - background-color: #f0f0f0; - color: #555; - font-size: 13px; - padding: 0 16px; - border-radius: 4px; - - mat-icon { - font-size: 18px; - margin-right: 4px; - vertical-align: middle; - color: #777; - } - - span { - display: flex; - align-items: center; - gap: 4px; - } - } -} - -.page-header { - margin-bottom: 20px; - margin-top: 5px; - padding: 0; - - .page-title { - font-size: 2rem; - font-weight: 700; - color: #1a1a1a; - margin: 0 0 0.5rem; - line-height: 1.2; - letter-spacing: -0.025em; - } - - .page-subtitle { - font-size: 1rem; - color: #666; - margin: 0; - line-height: 1.5; - font-weight: 400; - } -} - -.btn-primary { - background-color: #1e88e5; - color: #fff; -} - -.integrated-navbar { - display: flex; - align-items: center; - justify-content: space-between; - flex-wrap: wrap; - padding: 1rem 1.5rem; - border-bottom: 2px solid #e5e7eb; - height: 85px; - - mage-card-navbar { - flex: 1; - margin-right: 1rem; - min-width: 200px; - background: transparent; - box-shadow: none; - border-radius: 0; - margin-bottom: 0; - } - - @media (max-width: 768px) { - flex-direction: column; - align-items: stretch; - margin: 0; - padding: 5px; - - .button-group { - width: auto; - margin: 0 auto; - } - } -} - -.table-wrapper { - border-radius: 12px; - background: #fff; - border: 1px solid #e5e7eb; - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), - 0 2px 4px -1px rgba(0, 0, 0, 0.06); - height: 75vh; - overflow: hidden; - - @media (max-height: 1100px) { - height: 73vh; - } - - @media (max-height: 1000px) { - height: 71vh; - } - - @media (max-height: 900px) { - height: 69vh; - } - - @media (max-height: 800px) { - height: 64vh; - } - - @media (max-height: 700px) { - height: 57vh; - } - - @media (max-height: 600px) { - height: 285px; - } -} - -.table-scroll { - height: 62.2vh; - - @media (max-width: 768px) { - height: 60.2vh; - } - - overflow-y: auto; - max-height: 100%; - - @media (max-height: 1100px) { - height: 59vh; - } - - @media (max-height: 1000px) { - height: 55vh; - } - - @media (max-height: 900px) { - height: 52vh; - } - - @media (max-height: 800px) { - height: 44vh; - } - - @media (max-height: 700px) { - height: 34vh; - } - - @media (max-height: 600px) { - height: 142.5px; - } - - table { - width: 100%; - border-collapse: collapse; - table-layout: fixed; - - th, - td { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - } - - .mat-header-row { - position: sticky; - top: 0; - z-index: 2; - background: #f9fafb; - } - - .mat-row, - .mat-cell, - .mat-header-cell { - height: 3.5rem; - padding: 0.5rem; - - @media (max-height: 768px) { - height: 3.2rem; - } - - @media (max-height: 600px) { - height: 3rem; - padding: 0.4rem; - } - - @media (max-height: 480px) { - height: 2.8rem; - padding: 0.3rem; - font-size: 0.85rem; - } - - @media (max-height: 400px) { - height: 2.5rem; - font-size: 0.75rem; - } - - @media (max-height: 350px) { - height: 2.3rem; - font-size: 0.7rem; - } - } -} - -.pagination { - display: contents; -} - -.mat-column-actions { - text-align: right; - - .mat-cell, - .mat-header-cell { - justify-content: flex-end; - text-align: right; - } - - .d-flex { - display: flex; - justify-content: flex-end; - gap: 0.5rem; - } -} - -.button-group { - margin-top: -20px; - - button { - height: 43px; - white-space: nowrap; - } - - button:not(:last-child) { - margin-right: 40px; - } -} - -.filters { - margin-top: -10px; - align-items: center !important; - display: flex !important; -} - -:host { - .type-filter { - width: 150px; - margin-left: 1rem; - margin-top: 10px; - font-size: 14px; - - ::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix { - padding: 10px; - } - - ::ng-deep .mat-form-field-infix { - padding: 10px; - } - - ::ng-deep .mat-form-field-label-wrapper { - top: -12px; - left: -1px; - } - } - - ::ng-deep input.search-input.ng-untouched.ng-pristine.ng-valid, - ::ng-deep input.search-input.ng-valid.ng-dirty.ng-touched, - ::ng-deep input.search-input.ng-valid.ng-dirty.ng-untouched { - height: 43px; - margin-top: -10px; - } -} - -.d-flex { - display: flex; - gap: 25px; -} - -.align-items-center { - align-items: center !important; -} - -.icon { - font-size: 25px; -} - -.ellipsis { - text-overflow: ellipsis; - overflow: hidden; -} - -::ng-deep .mat-tooltip-event-desc { - position: relative; - left: 0 !important; - font-size: 20px; - min-width: 75vw; -} - -.w-100 { - width: 100% !important; -} - -.w-90 { - width: 90% !important; -} - -.description-text { - max-width: 40%; - margin-bottom: 0; -} \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-layers/dashboard/layer-dashboard.component.spec.ts b/web-app/admin/src/app/admin/admin-layers/dashboard/layer-dashboard.component.spec.ts deleted file mode 100644 index a6454bb89..000000000 --- a/web-app/admin/src/app/admin/admin-layers/dashboard/layer-dashboard.component.spec.ts +++ /dev/null @@ -1,407 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatDialog } from '@angular/material/dialog'; -import { StateService } from '@uirouter/angular'; -import { of, throwError } from 'rxjs'; - -import { LayerDashboardComponent } from './layer-dashboard.component'; -import { LayersService, Layer } from '../layers.service'; -import { UserService } from 'admin/src/app/upgrade/ajs-upgraded-providers'; -import { PageEvent } from '@angular/material/paginator'; - -describe('LayerDashboardComponent', () => { - let component: LayerDashboardComponent; - let fixture: ComponentFixture; - let mockLayersService: jasmine.SpyObj; - let mockDialog: jasmine.SpyObj; - let mockStateService: jasmine.SpyObj; - let mockUserService: any; - - const mockLayers: Layer[] = [ - { - id: 1, - name: 'Test Imagery Layer', - description: 'Test imagery description', - type: 'Imagery', - url: 'http://example.com/imagery', - state: 'available' - }, - { - id: 2, - name: 'Test Feature Layer', - description: 'Test feature description', - type: 'Feature', - url: 'http://example.com/feature', - state: 'available' - }, - { - id: 3, - name: 'Test GeoPackage Layer', - description: 'Test geopackage description', - type: 'GeoPackage', - state: 'available' - } - ]; - - beforeEach(async () => { - mockLayersService = jasmine.createSpyObj('LayersService', ['getLayers', 'deleteLayer']); - mockDialog = jasmine.createSpyObj('MatDialog', ['open']); - mockStateService = jasmine.createSpyObj('StateService', ['go']); - mockUserService = { - myself: { - role: { - permissions: ['CREATE_LAYER', 'UPDATE_LAYER', 'DELETE_LAYER'] - } - } - }; - - mockLayersService.getLayers.and.returnValue(of(mockLayers)); - - await TestBed.configureTestingModule({ - declarations: [LayerDashboardComponent], - providers: [ - { provide: LayersService, useValue: mockLayersService }, - { provide: MatDialog, useValue: mockDialog }, - { provide: StateService, useValue: mockStateService }, - { provide: UserService, useValue: mockUserService } - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(LayerDashboardComponent); - component = fixture.componentInstance; - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - describe('ngOnInit', () => { - it('should initialize permissions and load layers', () => { - fixture.detectChanges(); - - expect(component.hasLayerCreatePermission).toBe(true); - expect(component.hasLayerEditPermission).toBe(true); - expect(component.hasLayerDeletePermission).toBe(true); - expect(mockLayersService.getLayers).toHaveBeenCalledWith({ includeUnavailable: true }); - expect(component.layers.length).toBe(3); - expect(component.filteredLayers.length).toBe(3); - }); - - it('should set permissions to false when user has no permissions', () => { - mockUserService.myself.role.permissions = []; - fixture.detectChanges(); - - expect(component.hasLayerCreatePermission).toBe(false); - expect(component.hasLayerEditPermission).toBe(false); - expect(component.hasLayerDeletePermission).toBe(false); - }); - - it('should handle missing user permissions gracefully', () => { - mockUserService.myself = null; - fixture.detectChanges(); - - expect(component.hasLayerCreatePermission).toBe(false); - expect(component.hasLayerEditPermission).toBe(false); - expect(component.hasLayerDeletePermission).toBe(false); - }); - }); - - describe('refreshLayers', () => { - beforeEach(() => { - fixture.detectChanges(); - }); - - it('should fetch and update layers', () => { - const newLayers: Layer[] = [ - { id: 4, name: 'New Layer', type: 'Imagery', state: 'available' } - ]; - mockLayersService.getLayers.and.returnValue(of(newLayers)); - - component.refreshLayers(); - - expect(mockLayersService.getLayers).toHaveBeenCalled(); - expect(component.layers).toEqual(newLayers); - expect(component.filteredLayers).toEqual(newLayers); - }); - - it('should handle error when fetching layers', () => { - spyOn(console, 'error'); - mockLayersService.getLayers.and.returnValue(throwError(() => new Error('Fetch error'))); - - component.refreshLayers(); - - expect(console.error).toHaveBeenCalledWith('Error fetching layers:', jasmine.any(Error)); - }); - }); - - describe('filtering', () => { - beforeEach(() => { - fixture.detectChanges(); - }); - - it('should filter layers by search term in name', () => { - component.layerSearch = 'imagery'; - component.onSearchChanged(); - - expect(component.filteredLayers.length).toBe(1); - expect(component.filteredLayers[0].name).toBe('Test Imagery Layer'); - expect(component.page).toBe(0); - }); - - it('should filter layers by search term in description', () => { - component.layerSearch = 'feature description'; - component.onSearchChanged(); - - expect(component.filteredLayers.length).toBe(1); - expect(component.filteredLayers[0].type).toBe('Feature'); - }); - - it('should filter layers by search term in URL', () => { - component.layerSearch = 'example.com/imagery'; - component.onSearchChanged(); - - expect(component.filteredLayers.length).toBe(1); - expect(component.filteredLayers[0].id).toBe(1); - }); - - it('should be case-insensitive when searching', () => { - component.layerSearch = 'IMAGERY'; - component.onSearchChanged(); - - expect(component.filteredLayers.length).toBe(1); - }); - - it('should return all layers when search is empty', () => { - component.layerSearch = ''; - component.onSearchChanged(); - - expect(component.filteredLayers.length).toBe(3); - }); - - it('should filter by type - online (Imagery)', () => { - component.onTypeFilterChange('online'); - - expect(component.filteredLayers.length).toBe(1); - expect(component.filteredLayers[0].type).toBe('Imagery'); - }); - - it('should filter by type - offline (non-Imagery)', () => { - component.onTypeFilterChange('offline'); - - expect(component.filteredLayers.length).toBe(2); - expect(component.filteredLayers.every(l => l.type !== 'Imagery')).toBe(true); - }); - - it('should show all layers when filter is "all"', () => { - component.onTypeFilterChange('all'); - - expect(component.filteredLayers.length).toBe(3); - }); - - it('should combine search and type filters', () => { - component.layerSearch = 'test'; - component.onTypeFilterChange('online'); - - expect(component.filteredLayers.length).toBe(1); - expect(component.filteredLayers[0].type).toBe('Imagery'); - }); - }); - - describe('pagination', () => { - beforeEach(() => { - fixture.detectChanges(); - }); - - it('should get paginated layers correctly', () => { - component.page = 0; - component.itemsPerPage = 2; - - const paginated = component.getPaginatedLayers(); - - expect(paginated.length).toBe(2); - expect(paginated[0].id).toBe(1); - expect(paginated[1].id).toBe(2); - }); - - it('should get second page of layers', () => { - component.page = 1; - component.itemsPerPage = 2; - - const paginated = component.getPaginatedLayers(); - - expect(paginated.length).toBe(1); - expect(paginated[0].id).toBe(3); - }); - - it('should handle page change event', () => { - const event: PageEvent = { - pageIndex: 1, - pageSize: 5, - length: 10 - }; - - component.onPageChange(event); - - expect(component.page).toBe(1); - expect(component.itemsPerPage).toBe(5); - }); - - it('should update total layers count', () => { - expect(component.totalLayers).toBe(3); - - component.layerSearch = 'imagery'; - component.onSearchChanged(); - - expect(component.totalLayers).toBe(1); - }); - }); - - describe('type counts', () => { - beforeEach(() => { - fixture.detectChanges(); - }); - - it('should return correct count for all layers', () => { - expect(component.getTypeCount('all')).toBe(3); - }); - - it('should return correct count for online layers', () => { - expect(component.getTypeCount('online')).toBe(1); - }); - - it('should return correct count for offline layers', () => { - expect(component.getTypeCount('offline')).toBe(2); - }); - }); - - describe('search handlers', () => { - beforeEach(() => { - fixture.detectChanges(); - }); - - it('should handle search term changed from card navbar', () => { - component.page = 1; - component.onSearchTermChanged('new search'); - - expect(component.layerSearch).toBe('new search'); - expect(component.page).toBe(0); - }); - - it('should handle search cleared', () => { - component.layerSearch = 'some search'; - component.page = 2; - component.onSearchCleared(); - - expect(component.layerSearch).toBe(''); - expect(component.page).toBe(0); - }); - }); - - describe('reset', () => { - beforeEach(() => { - fixture.detectChanges(); - }); - - it('should reset all filters and pagination', () => { - component.layerSearch = 'search term'; - component.page = 2; - component.typeFilter = 'online'; - - component.reset(); - - expect(component.layerSearch).toBe(''); - expect(component.page).toBe(0); - expect(component.typeFilter).toBe('all'); - expect(component.filteredLayers.length).toBe(3); - }); - }); - - describe('layer creation', () => { - beforeEach(() => { - fixture.detectChanges(); - }); - - it('should open create layer dialog', () => { - const mockDialogRef = { - afterClosed: () => of(null) - }; - mockDialog.open.and.returnValue(mockDialogRef as any); - - component.newLayer(); - - expect(mockDialog.open).toHaveBeenCalled(); - }); - - it('should refresh and navigate after creating layer', () => { - const newLayer: Layer = { id: 5, name: 'New Layer', type: 'Imagery', state: 'available' }; - const mockDialogRef = { - afterClosed: () => of(newLayer) - }; - mockDialog.open.and.returnValue(mockDialogRef as any); - spyOn(component, 'refreshLayers'); - - component.newLayer(); - - expect(component.refreshLayers).toHaveBeenCalled(); - expect(mockStateService.go).toHaveBeenCalledWith('admin.layer', { layerId: 5 }); - }); - - it('should not navigate if dialog is cancelled', () => { - const mockDialogRef = { - afterClosed: () => of(null) - }; - mockDialog.open.and.returnValue(mockDialogRef as any); - spyOn(component, 'refreshLayers'); - - component.newLayer(); - - expect(component.refreshLayers).not.toHaveBeenCalled(); - expect(mockStateService.go).not.toHaveBeenCalled(); - }); - }); - - describe('responsive layout', () => { - beforeEach(() => { - fixture.detectChanges(); - }); - - it('should update layout values on window resize', () => { - Object.defineProperty(window, 'innerWidth', { - writable: true, - configurable: true, - value: 1000 - }); - - component.onResize(); - - expect(component.numChars).toBe(Math.ceil(1000 / 8.5)); - expect(component.toolTipWidth).toBe('750px'); - }); - - it('should set initial responsive values', () => { - expect(component.numChars).toBeGreaterThan(0); - expect(component.toolTipWidth).toContain('px'); - }); - }); - - describe('breadcrumbs', () => { - it('should have correct breadcrumb configuration', () => { - expect(component.breadcrumbs.length).toBe(1); - expect(component.breadcrumbs[0].title).toBe('Layers'); - expect(component.breadcrumbs[0].iconClass).toBe('fa fa-map'); - }); - }); - - describe('initial state', () => { - it('should have correct default values', () => { - expect(component.layers).toEqual([]); - expect(component.filteredLayers).toEqual([]); - expect(component.layerSearch).toBe(''); - expect(component.page).toBe(0); - expect(component.itemsPerPage).toBe(10); - expect(component.typeFilter).toBe('all'); - expect(component.displayedColumns).toEqual(['layer']); - expect(component.pageSizeOptions).toEqual([5, 10, 25, 50]); - }); - }); -}); diff --git a/web-app/admin/src/app/admin/admin-layers/dashboard/layer-dashboard.component.ts b/web-app/admin/src/app/admin/admin-layers/dashboard/layer-dashboard.component.ts deleted file mode 100644 index 8c01e252d..000000000 --- a/web-app/admin/src/app/admin/admin-layers/dashboard/layer-dashboard.component.ts +++ /dev/null @@ -1,194 +0,0 @@ -import { Component, OnInit, Inject, HostListener } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; -import { PageEvent } from '@angular/material/paginator'; -import { StateService } from '@uirouter/angular'; -import { UserService } from 'admin/src/app/upgrade/ajs-upgraded-providers'; -import { LayersService, Layer } from '../layers.service'; -import { AdminBreadcrumb } from '../../admin-breadcrumb/admin-breadcrumb.model'; -import { CreateLayerDialogComponent } from '../create-layer/create-layer.component'; -import _ from 'underscore'; - -@Component({ - selector: 'mage-layer-dashboard', - templateUrl: './layer-dashboard.component.html', - styleUrls: ['./layer-dashboard.component.scss'] -}) -export class LayerDashboardComponent implements OnInit { - layers: Layer[] = []; - filteredLayers: Layer[] = []; - displayedColumns: string[] = ['layer']; - - layerSearch = ''; - page = 0; - itemsPerPage = 10; - totalLayers = 0; - pageSizeOptions = [5, 10, 25, 50]; - - numChars = 180; - toolTipWidth = '1000px'; - - typeFilter: 'all' | 'online' | 'offline' = 'all'; - - hasLayerCreatePermission = false; - hasLayerEditPermission = false; - hasLayerDeletePermission = false; - - breadcrumbs: AdminBreadcrumb[] = [ - { title: 'Layers', iconClass: 'fa fa-map' } - ]; - - constructor( - private modal: MatDialog, - private stateService: StateService, - private layersService: LayersService, - @Inject(UserService) private userService: any - ) { } - - ngOnInit(): void { - this.initPermissions(); - this.refreshLayers(); - this.updateResponsiveLayout(); - } - - /** Initialize permission flags */ - private initPermissions(): void { - const permissions = this.userService.myself?.role?.permissions || []; - this.hasLayerCreatePermission = _.contains(permissions, 'CREATE_LAYER'); - this.hasLayerEditPermission = _.contains(permissions, 'UPDATE_LAYER'); - this.hasLayerDeletePermission = _.contains(permissions, 'DELETE_LAYER'); - } - - /** Fetch and apply filters to the layer list */ - refreshLayers(): void { - this.layersService.getLayers({ includeUnavailable: true }).subscribe({ - next: (layers) => { - this.layers = layers; - this.applyFilters(); - }, - error: (err) => console.error('Error fetching layers:', err) - }); - } - - /** Apply search and type filters */ - private applyFilters(): void { - if (!this.layers) return; - - const term = this.layerSearch.trim().toLowerCase(); - - this.filteredLayers = this.layers.filter(layer => { - const matchesSearch = !term || - layer.name?.toLowerCase().includes(term) || - layer.description?.toLowerCase().includes(term) || - layer.url?.toLowerCase().includes(term); - - const matchesType = this.filterByType(layer); - - return matchesSearch && matchesType; - }); - - this.totalLayers = this.filteredLayers.length; - } - - /** Filter layers by type */ - private filterByType(layer: Layer): boolean { - switch (this.typeFilter) { - case 'all': - return true; - case 'online': - return layer.type === 'Imagery'; - case 'offline': - return layer.type !== 'Imagery'; - default: - return true; - } - } - - /** Get paginated layers for display */ - getPaginatedLayers(): Layer[] { - const startIndex = this.page * this.itemsPerPage; - const endIndex = startIndex + this.itemsPerPage; - return this.filteredLayers.slice(startIndex, endIndex); - } - - /** Get count for specific type filter */ - getTypeCount(type: 'all' | 'online' | 'offline'): number { - if (type === 'all') return this.filteredLayers.length; - if (type === 'online') { - return this.filteredLayers.filter(l => l.type === 'Imagery').length; - } - return this.filteredLayers.filter(l => l.type !== 'Imagery').length; - } - - /** Handle search term change */ - onSearchChanged(): void { - this.page = 0; - this.applyFilters(); - } - - /** Handle search term change from card navbar */ - onSearchTermChanged(term: string): void { - this.layerSearch = term; - this.page = 0; - this.applyFilters(); - } - - /** Handle search cleared from card navbar */ - onSearchCleared(): void { - this.layerSearch = ''; - this.page = 0; - this.applyFilters(); - } - - /** Reset all filters and pagination */ - reset(): void { - this.layerSearch = ''; - this.page = 0; - this.typeFilter = 'all'; - this.applyFilters(); - } - - /** Handle type filter change */ - onTypeFilterChange(type: 'all' | 'online' | 'offline'): void { - this.typeFilter = type; - this.page = 0; - this.applyFilters(); - } - - /** Handle pagination change */ - onPageChange(event: PageEvent): void { - this.page = event.pageIndex; - this.itemsPerPage = event.pageSize; - } - - /** Open create layer dialog */ - newLayer(): void { - const dialogRef = this.modal.open(CreateLayerDialogComponent, { - data: { layer: {} } - }); - - dialogRef.afterClosed().subscribe((newLayer) => { - if (newLayer) { - this.refreshLayers(); - this.stateService.go('admin.layer', { layerId: newLayer.id }); - } - }); - } - - /** Navigate to layer detail */ - gotoLayer(layer: Layer): void { - this.stateService.go('admin.layer', { layerId: layer.id }); - } - - /** Update layout-related values on resize */ - @HostListener('window:resize') - onResize(): void { - this.updateResponsiveLayout(); - } - - /** Calculates responsive values */ - private updateResponsiveLayout(): void { - this.numChars = Math.ceil(window.innerWidth / 8.5); - this.toolTipWidth = `${window.innerWidth * 0.75}px`; - } -} - diff --git a/web-app/admin/src/app/admin/admin-layers/layers.service.ts b/web-app/admin/src/app/admin/admin-layers/layers.service.ts deleted file mode 100644 index c64568e35..000000000 --- a/web-app/admin/src/app/admin/admin-layers/layers.service.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { HttpClient, HttpParams } from '@angular/common/http'; -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; - -export interface Layer { - id?: number; - name?: string; - description?: string; - type?: 'Imagery' | 'Feature' | 'GeoPackage'; - url?: string; - file?: { - name: string; - relativePath: string; - contentType: string; - size: number; - }; - format?: string; - base?: string; - wms?: any; - state?: 'available' | 'processing' | 'unavailable'; -} - -export interface LayersResponse { - items: Layer[]; - totalCount: number; -} - -export interface SearchOptions { - includeUnavailable?: boolean; - type?: string; -} - -@Injectable({ - providedIn: 'root' -}) -export class LayersService { - constructor(private http: HttpClient) { } - - getLayers(options?: SearchOptions): Observable { - let params = new HttpParams(); - - if (options?.includeUnavailable) { - params = params.set('includeUnavailable', 'true'); - } - if (options?.type) { - params = params.set('type', options.type); - } - - return this.http.get('/api/layers', { params }); - } - - getLayerById(id: string): Observable { - return this.http.get(`/api/layers/${id}`); - } - - deleteLayer(layer: Layer): Observable { - return this.http.delete(`/api/layers/${layer.id}`); - } - - updateLayer(id: string, layer: Partial): Observable { - return this.http.put(`/api/layers/${id}`, layer); - } - - createLayer(layer: Partial | FormData): Observable { - return this.http.post('/api/layers', layer); - } - - getLayerCount(): Observable<{ count: number }> { - return this.http.get<{ count: number }>('/api/layers/count'); - } -} diff --git a/web-app/admin/src/app/admin/admin-nav/admin-nav.html b/web-app/admin/src/app/admin/admin-nav/admin-nav.html deleted file mode 100644 index f2866222c..000000000 --- a/web-app/admin/src/app/admin/admin-nav/admin-nav.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - diff --git a/web-app/admin/src/app/admin/admin-nav/admin-nav.scss b/web-app/admin/src/app/admin/admin-nav/admin-nav.scss deleted file mode 100644 index 303e77c37..000000000 --- a/web-app/admin/src/app/admin/admin-nav/admin-nav.scss +++ /dev/null @@ -1,213 +0,0 @@ -::ng-deep app-admin-side-nav { - position: relative; -} - -::ng-deep app-admin-side-nav > admin-breadcrumb { - display: block; - position: fixed; - width: 100%; - z-index: 5; - margin-bottom: 0.5rem; -} - -.nav-float-wrapper { - position: fixed; - top: 72px; - left: 5px; - z-index: 10000; - display: flex; - @media (max-width: 599px) { - top: 66px !important; - } - - .nav-divider { - left: 105px; - width: 1px; - height: 38px; - background: rgba(0, 0, 0, 0.25); - margin: 0 4px; - border-radius: 1px; - position: fixed; - } - - .nav-toggle { - display: inline-flex; - align-items: center; - gap: 0.5rem; - background: transparent; - color: #000; - border: none; - padding: 0.55rem 0.9rem; - cursor: pointer; - transition: background 0.25s ease, transform 0.15s ease; - position: fixed; - - .label { - font-weight: 400; - color: #000; - font-size: revert; - line-height: 14px; - padding: 2px; - user-select: none; - } - &:active { - transform: translateY(1px); - } - i { - font-size: 1.3rem; - } - } - - .drawer-backdrop { - position: fixed; - inset: 0; - background: rgba(0, 0, 0, 0.35); - backdrop-filter: blur(1px); - margin-top: 120px; - @media (max-width: 599px) { - margin-top: 110px; - } - } - - .drawer { - position: absolute; - top: 45px; - left: 0; - width: 320px; - background: #2f2f2f; - border: 2px solid #5f5f5f; - border-radius: 12px; - box-shadow: 0 12px 24px rgba(0, 0, 0, 0.55); - opacity: 0; - transform: translateY(-14px); - pointer-events: none; - transition: opacity 0.35s ease, transform 0.35s ease; - - &.open { - opacity: 1; - transform: translateY(0); - pointer-events: auto; - } - - .drawer-scroller { - max-height: min(70vh, 640px); - overflow: auto; - padding: 0.5rem; - } - - .nav-row { - position: relative; - width: 100%; - display: flex; - align-items: center; - gap: 0.8rem; - background: transparent; - color: #d1d1d1; - border: none; - border-radius: 10px; - padding: 0.75rem 0.75rem; - cursor: pointer; - text-align: left; - transition: background 0.2s ease, color 0.2s ease; - margin-bottom: 6px; - - .badge { - position: absolute; - right: 8px; - top: 50%; - transform: translateY(-50%); - background: #d9534f; - color: #fff; - font-size: 0.75rem; - font-weight: 600; - border-radius: 9999px; - padding: 0.15rem 0.45rem; - line-height: 1; - min-width: 1.2rem; - text-align: center; - box-shadow: 0 0 4px rgba(0, 0, 0, 0.4); - pointer-events: none; - } - - .icon { - font-size: 1.35rem; - width: 1.75rem; - display: inline-flex; - align-items: center; - justify-content: center; - - &.plugin .plugin-icon { - width: 1.35rem; - height: 1.35rem; - object-fit: contain; - display: block; - } - } - .text { - font-size: 1rem; - font-weight: 500; - } - - &:hover:not(.selected):not([disabled]) { - background: #434343; - color: #fff; - } - - &.selected, - &[disabled] { - background: #585858; - color: #fff; - cursor: default; - } - } - } - @media (max-width: 599px) { - .drawer { - position: fixed; - top: 25px; - left: 0; - width: 100vw; - height: 100vh; - border-radius: 0; - border: none; - transform: translateY(-100%); - opacity: 0; - - &.open { - transform: translateY(0); - opacity: 1; - margin-top: 86px; - transform: translateY(0); - opacity: 1; - height: auto; - max-height: 730px; - overflow: auto; - } - - .drawer-scroller { - max-height: none; - height: 100%; - padding: 1rem; - } - - .nav-row { - padding: 1rem 1.1rem; - .icon { - font-size: 1.6rem; - width: 2rem; - } - .icon.plugin .plugin-icon { - width: 1.6rem; - height: 1.6rem; - } - .text { - font-size: 1.1rem; - } - } - } - } -} - -.icon-fix { - font-size: 2em !important; -} diff --git a/web-app/admin/src/app/admin/admin-nav/admin-nav.spec.ts b/web-app/admin/src/app/admin/admin-nav/admin-nav.spec.ts deleted file mode 100644 index 5b186aa7d..000000000 --- a/web-app/admin/src/app/admin/admin-nav/admin-nav.spec.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { AdminNavComponent } from './admin-nav'; -import { UserService } from '../../upgrade/ajs-upgraded-providers'; - -describe('AdminNavComponent', () => { - let component: AdminNavComponent; - let fixture: ComponentFixture; - let mockUserService: any; - let mockState: any; - - beforeEach(() => { - mockState = { go: jasmine.createSpy('go') }; - mockUserService = { - myself: { role: { permissions: ['UPDATE_SETTINGS', 'VIEW_USERS'] } } - }; - - TestBed.configureTestingModule({ - declarations: [AdminNavComponent], - providers: [ - { provide: UserService, useValue: mockUserService }, - { provide: '$injector', useValue: { get: () => mockState } } - ] - }); - - fixture = TestBed.createComponent(AdminNavComponent); - component = fixture.componentInstance; - }); - - it('should parse JSON string inputs safely', () => { - const result = (component as any).parseInput('[1,2,3]', 'test'); - expect(result).toEqual([1, 2, 3]); - }); - - it('should return [] on invalid JSON', () => { - const result = (component as any).parseInput('notjson', 'test'); - expect(result).toEqual([]); - }); - - it('should return object if not a string', () => { - const arr = [1, 2, 3]; - const result = (component as any).parseInput(arr, 'test'); - expect(result).toBe(arr); - }); - - it('should return true if user has permission', () => { - expect(component.hasPermission('UPDATE_SETTINGS')).toBeTrue(); - }); - - it('should return false if user lacks permission', () => { - expect(component.hasPermission('DELETE_USERS')).toBeFalse(); - }); - - it('should update nav item counts correctly', () => { - component.inactiveUsers = [{}, {}]; - component.unregisteredDevices = [{}]; - component.pluginTabs = []; - component.stateName = 'admin.dashboard'; - - component.ngOnChanges({}); - - const dashboard = component.navItems.find(i => i.state === 'admin.dashboard'); - const users = component.navItems.find(i => i.state === 'admin.users'); - const devices = component.navItems.find(i => i.state === 'admin.devices'); - - expect(dashboard.count).toBe(3); - expect(users.count).toBe(2); - expect(devices.count).toBe(1); - }); - - it('should return true if state matches a plugin', () => { - component.pluginTabs = [{ id: '1', state: 'admin.pluginA', title: 'Plugin A' }]; - component.stateName = 'admin.pluginA'; - expect(component.pluginActive).toBeTrue(); - }); - - it('should return false if state not in plugin list', () => { - component.pluginTabs = [{ id: '1', state: 'admin.pluginA', title: 'Plugin A' }]; - component.stateName = 'admin.dashboard'; - expect(component.pluginActive).toBeFalse(); - }); - - it('should return correct breadcrumb when plugin active', () => { - component.pluginTabs = [{ - id: '1', - state: 'admin.pluginA', - title: 'Plugin A', - icon: { className: 'fa fa-rocket' } - }]; - component.stateName = 'admin.pluginA'; - const crumbs = component.pluginBreadcrumbs; - expect(crumbs.length).toBe(1); - expect(crumbs[0].title).toBe('Plugin A'); - expect(crumbs[0].iconClass).toBe('fa fa-rocket'); - }); - - it('should return empty array when no active plugin', () => { - component.pluginTabs = []; - expect(component.pluginBreadcrumbs).toEqual([]); - }); - - it('should emit pluginActiveChange correctly on state change', () => { - spyOn(component.pluginActiveChange, 'emit'); - component.pluginTabs = [{ id: '1', state: 'admin.pluginA', title: 'Plugin A' }]; - component.stateName = 'admin.pluginA'; - - component.ngOnChanges({}); - expect(component.pluginActiveChange.emit).toHaveBeenCalledWith(true); - }); - - it('should navigate when route is different', () => { - component.stateName = 'admin.dashboard'; - component.onClick('admin.users'); - expect(mockState.go).toHaveBeenCalledWith('admin.users'); - expect(component.drawerOpen).toBeFalse(); - }); - - it('should not navigate if already on route', () => { - mockState.go.calls.reset(); - component.stateName = 'admin.users'; - component.onClick('admin.users'); - expect(mockState.go).not.toHaveBeenCalled(); - }); -}); diff --git a/web-app/admin/src/app/admin/admin-nav/admin-nav.ts b/web-app/admin/src/app/admin/admin-nav/admin-nav.ts deleted file mode 100644 index edb2096e2..000000000 --- a/web-app/admin/src/app/admin/admin-nav/admin-nav.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { Component, Inject, Input, SimpleChanges, EventEmitter, Output } from '@angular/core'; -import { UserService } from '../../upgrade/ajs-upgraded-providers'; - -interface PluginTab { - id: string; - state: string; - title: string; - icon?: { path?: string; className?: string }; -} - -@Component({ - selector: 'app-admin-nav', - templateUrl: './admin-nav.html', - styleUrls: ['./admin-nav.scss'] -}) -export class AdminNavComponent { - @Input() stateName!: string; - @Input() inactiveUsers: any[] = []; - @Input() unregisteredDevices: any[] = []; - @Input() pluginTabs: PluginTab[] = []; - @Input() token: string = ''; - @Output() pluginActiveChange = new EventEmitter(); - - private $state: any; - drawerOpen = false; - - navItems = [ - { label: 'Dashboard', state: 'admin.dashboard', icon: 'fa fa-dashboard', count: 0}, - { label: 'Users', state: 'admin.users', icon: 'fa fa-user', count: 0 }, - { label: 'Teams', state: 'admin.teams', icon: 'fa fa-users' }, - { label: 'Events', state: 'admin.events', icon: 'fa fa-calendar' }, - { label: 'Devices', state: 'admin.devices', icon: 'fa fa-mobile-phone icon-fix', count: 0 }, - { label: 'Layers', state: 'admin.layers', icon: 'fa fa-map' }, - { label: 'Feeds', state: 'admin.feeds', icon: 'fa fa-rss' }, - { label: 'Map', state: 'admin.map', icon: 'fa fa-globe' }, - { label: 'Security', state: 'admin.security', icon: 'fa fa-shield', permission: 'UPDATE_SETTINGS' }, - { label: 'Settings', state: 'admin.settings', icon: 'fa fa-wrench', permission: 'UPDATE_SETTINGS' }, - ]; - - constructor( - @Inject(UserService) private userService: any, - @Inject('$injector') private $injector: any - ) { - this.$state = this.$injector.get('$state'); - } - - private parseInput(input: T | string, name: string): T { - if (typeof input === 'string') { - try { return JSON.parse(input); } - catch { return [] as unknown as T; } - } - return input; - } - - ngOnChanges(changes: SimpleChanges) { - this.pluginTabs = this.parseInput(this.pluginTabs, 'pluginTabs'); - this.unregisteredDevices = this.parseInput(this.unregisteredDevices, 'unregisteredDevices'); - this.inactiveUsers = this.parseInput(this.inactiveUsers, 'inactiveUsers'); - - const dashboardItem = this.navItems.find(i => i.state === 'admin.dashboard'); - const usersItem = this.navItems.find(i => i.state === 'admin.users'); - const devicesItem = this.navItems.find(i => i.state === 'admin.devices'); - - dashboardItem.count = (this.unregisteredDevices.length + this.inactiveUsers.length); - usersItem.count = this.inactiveUsers.length; - devicesItem.count = this.unregisteredDevices.length; - - const isPluginActive = - Array.isArray(this.pluginTabs) && - this.pluginTabs.some((p) => p.state === this.stateName); - - this.pluginActiveChange.emit(isPluginActive); - } - - hasPermission(permission: string): boolean { - return this.userService.myself?.role?.permissions?.includes(permission); - } - - onClick(route: string): void { - if (this.stateName !== route) { - this.$state.go(route); - this.closeDrawer(); - } - } - - toggleDrawer(): void { this.drawerOpen = !this.drawerOpen; } - closeDrawer(): void { this.drawerOpen = false; } - - get pluginActive(): boolean { - return Array.isArray(this.pluginTabs) && this.pluginTabs.some(p => p.state === this.stateName); - } - - get pluginBreadcrumbs() { - if (!this.pluginActive) return []; - const plugin = this.pluginTabs.find(p => p.state === this.stateName); - - return [ - { title: plugin.title, iconClass: plugin?.icon?.className || "fa fa-plug"} - ]; - } - -} diff --git a/web-app/admin/src/app/admin/admin-settings/admin-settings.component.html b/web-app/admin/src/app/admin/admin-settings/admin-settings.component.html index e175c969e..ad15780e5 100644 --- a/web-app/admin/src/app/admin/admin-settings/admin-settings.component.html +++ b/web-app/admin/src/app/admin/admin-settings/admin-settings.component.html @@ -1,40 +1,29 @@ - - -
-
- - - - - - - - - - - - -
- +
+ +
+
+
+
+ + + + + + + + + + + + +
+ +
+
-
-
+ \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-settings/admin-settings.component.scss b/web-app/admin/src/app/admin/admin-settings/admin-settings.component.scss index 90b203f85..7fd463573 100644 --- a/web-app/admin/src/app/admin/admin-settings/admin-settings.component.scss +++ b/web-app/admin/src/app/admin/admin-settings/admin-settings.component.scss @@ -21,5 +21,4 @@ align-items: flex-end; margin-top: 4px; margin-right: 8px; - margin-bottom: 15px; } \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.html b/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.html index a4c1c3b4f..c270bffce 100644 --- a/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.html +++ b/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.html @@ -21,36 +21,4 @@ close - -
- - Show NGA Contact Information on About page - - - - - - - - -
- \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.scss b/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.scss index b9bca3605..be9299a31 100644 --- a/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.scss +++ b/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.scss @@ -21,53 +21,4 @@ mat-form-field { section { margin-left: 16px; margin-right: 16px; -} - -::ng-deep .mat-menu-panel.contact-menu { - width: 495px !important; - min-width: unset; - max-width: unset; - padding: 0 !important; - } - - .menu-panel-content { - padding: 16px 24px; - box-sizing: border-box; - } - - .section-title { - display: flex; - align-items: center; - font-size: 1.25rem; - margin: 0; - gap: 8px; - } - - .divider { - margin: 12px 0; - border: none; - border-top: 1px solid #ccc; - } - - .contact-info { - display: flex; - flex-wrap: wrap; - gap: 80px; - - div { - display: flex; - align-items: center; - gap: 8px; - font-size: 0.95rem; - - a { - color: mat.get-color-from-palette($app-primary); - text-decoration: none; - - &:hover { - text-decoration: underline; - } - } - } - } - \ No newline at end of file +} \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.spec.ts b/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.spec.ts index 49ce677ef..2f016b573 100644 --- a/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.spec.ts @@ -1,145 +1,36 @@ -import { - ComponentFixture, - TestBed, - waitForAsync, - fakeAsync, - tick -} from '@angular/core/testing'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { ContactInfoComponent } from './contact-info.component'; +import { ComponentFixture, TestBed, waitForAsync } from "@angular/core/testing"; +import { NoopAnimationsModule } from "@angular/platform-browser/animations"; +import { Settings } from "../../../../app/upgrade/ajs-upgraded-providers"; +import { ContactInfoComponent } from "./contact-info.component"; import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { SimpleChange } from '@angular/core'; -import { Settings } from '../../../../app/upgrade/ajs-upgraded-providers'; -import { MatMenuModule } from '@angular/material/menu'; - -const MOCK_CONTACT_INFO = { - phone: '123-456-7890', - email: 'test@example.com', - showDevContact: true -}; - -const MOCK_SETTINGS_RESPONSE = [ - { - type: 'contactinfo', - settings: { ...MOCK_CONTACT_INFO } - } -]; - -const MOCK_EMPTY_RESPONSE = []; class MockSettings { - query(): any { - return { $promise: Promise.resolve(MOCK_SETTINGS_RESPONSE) }; - } - - update(params: any, data: any, success: Function, failure: Function): void { - success(); - } + query(): any { + return { $promise: Promise.resolve([]) }; + } } -describe('ContactInfoComponent', () => { - let component: ContactInfoComponent; - let fixture: ComponentFixture; - let settingsService: MockSettings; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [NoopAnimationsModule, HttpClientTestingModule, MatMenuModule], - providers: [{ provide: Settings, useClass: MockSettings }], - declarations: [ContactInfoComponent] - }).compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ContactInfoComponent); - component = fixture.componentInstance; - settingsService = TestBed.inject(Settings); - }); - - it('should create the component', () => { - expect(component).toBeTruthy(); - }); - - it('should load settings in ngOnInit', async () => { - spyOn(settingsService, 'query').and.callThrough(); - await component.ngOnInit(); - expect(settingsService.query).toHaveBeenCalled(); - expect(component.contactinfo).toEqual(MOCK_CONTACT_INFO); - expect(component.oldEmail).toBe(MOCK_CONTACT_INFO.email); - expect(component.oldPhone).toBe(MOCK_CONTACT_INFO.phone); - expect(component.oldShowDevContact).toBe(MOCK_CONTACT_INFO.showDevContact); - }); - - it('should handle empty settings in ngOnInit', async () => { - spyOn(settingsService, 'query').and.returnValue({ - $promise: Promise.resolve(MOCK_EMPTY_RESPONSE) +describe('Contact Info Tests', () => { + let component: ContactInfoComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [NoopAnimationsModule, HttpClientTestingModule], + providers: [ + { provide: Settings, useClass: MockSettings }, + ], + declarations: [ContactInfoComponent] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ContactInfoComponent); + component = fixture.componentInstance; + fixture.detectChanges(); }); - await component.ngOnInit(); - expect(component.contactinfo).toEqual({ - phone: '', - email: '', - showDevContact: false - }); - }); - it('should handle error in ngOnInit', fakeAsync(() => { - const consoleSpy = spyOn(console, 'log'); - spyOn(settingsService, 'query').and.returnValue({ - $promise: Promise.reject('Error!') + it('should create', () => { + expect(component).toBeTruthy(); }); - - component.ngOnInit(); - tick(); - - expect(consoleSpy).toHaveBeenCalledWith('Error!'); - })); - - it('should call save() from ngOnChanges if beginSave changes and form is dirty', () => { - const saveSpy = spyOn(component, 'save'); - component.isDirty = true; - const changes = { - beginSave: new SimpleChange(false, true, false) - }; - component.ngOnChanges(changes); - expect(saveSpy).toHaveBeenCalled(); - }); - - it('should NOT call save() if form is not dirty', () => { - const saveSpy = spyOn(component, 'save'); - component.isDirty = false; - const changes = { - beginSave: new SimpleChange(false, true, false) - }; - component.ngOnChanges(changes); - expect(saveSpy).not.toHaveBeenCalled(); - }); - - it('should emit onDirty from setDirty()', () => { - const dirtySpy = spyOn(component.onDirty, 'emit'); - component.setDirty(true); - expect(component.isDirty).toBeTrue(); - expect(dirtySpy).toHaveBeenCalledWith(true); - }); - - it('should emit saveComplete(true) on successful save', () => { - const saveSpy = spyOn(component.saveComplete, 'emit'); - spyOn(settingsService, 'update').and.callFake( - (params, data, success, failure) => { - success(); - } - ); - component.save(); - expect(saveSpy).toHaveBeenCalledWith(true); - }); - - it('should emit saveComplete(false) on failed save', () => { - const saveSpy = spyOn(component.saveComplete, 'emit'); - spyOn(settingsService, 'update').and.callFake( - (params, data, success, failure) => { - failure(); - } - ); - component.save(); - expect(saveSpy).toHaveBeenCalledWith(false); - }); }); diff --git a/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.ts b/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.ts index 8f31bb683..575b34cff 100644 --- a/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.ts +++ b/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.ts @@ -13,13 +13,11 @@ export class ContactInfoComponent implements OnInit, OnChanges { oldEmail: string; oldPhone: string; - oldShowDevContact: boolean; isDirty = false; contactinfo = { phone: '', - email: '', - showDevContact: false, + email: '' } constructor( @@ -44,7 +42,6 @@ export class ContactInfoComponent implements OnInit, OnChanges { this.oldEmail = this.contactinfo.email; this.oldPhone = this.contactinfo.phone; - this.oldShowDevContact = this.contactinfo.showDevContact; }).catch(err => { console.log(err); }); diff --git a/web-app/admin/src/app/admin/admin-teams/admin-teams.module.ts b/web-app/admin/src/app/admin/admin-teams/admin-teams.module.ts deleted file mode 100644 index 8af9c2bbd..000000000 --- a/web-app/admin/src/app/admin/admin-teams/admin-teams.module.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatTableModule } from '@angular/material/table'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatSortModule } from '@angular/material/sort'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatIconModule } from '@angular/material/icon'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; - -import { TeamDashboardComponent } from './dashboard/team-dashboard.component'; -import { CreateTeamDialogComponent } from './create-team/create-team.component'; -import { TeamsService } from './teams-service'; -import { EventsService } from '../admin-event/events.service'; -import { TeamDetailsComponent } from './team-details/team-details.component'; -import { CoreModule } from '../../core/core.module'; -import { DeleteTeamComponent } from './delete-team/delete-team.component'; -import { AdminBreadcrumbModule } from '../admin-breadcrumb/admin-breadcrumb.module'; -import { MatTooltipModule } from '@angular/material/tooltip'; - -@NgModule({ - declarations: [ - TeamDashboardComponent, - CreateTeamDialogComponent, - TeamDetailsComponent, - DeleteTeamComponent - ], - imports: [ - CommonModule, - FormsModule, - CoreModule, - ReactiveFormsModule, - MatTableModule, - MatPaginatorModule, - MatSortModule, - MatDialogModule, - MatFormFieldModule, - MatInputModule, - MatButtonModule, - MatCheckboxModule, - MatIconModule, - MatProgressSpinnerModule, - AdminBreadcrumbModule, - MatTooltipModule, - ], - providers: [ - TeamsService, - EventsService - ], - entryComponents: [ - CreateTeamDialogComponent, - DeleteTeamComponent - ] -}) -export class AdminTeamsModule { } \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-teams/create-team/create-team.component.html b/web-app/admin/src/app/admin/admin-teams/create-team/create-team.component.html deleted file mode 100644 index a7cbc918a..000000000 --- a/web-app/admin/src/app/admin/admin-teams/create-team/create-team.component.html +++ /dev/null @@ -1,37 +0,0 @@ -
-
-

Create a New Team

-
- -
-
- - {{ errorMessage }} -
- -
-
- - -
- - Name is required -
-
- -
- - -
-
-
- -
- - -
-
\ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-teams/create-team/create-team.component.scss b/web-app/admin/src/app/admin/admin-teams/create-team/create-team.component.scss deleted file mode 100644 index 4785940c8..000000000 --- a/web-app/admin/src/app/admin/admin-teams/create-team/create-team.component.scss +++ /dev/null @@ -1,99 +0,0 @@ -.error-alert { - display: flex; - align-items: center; - gap: 0.5rem; - padding: 1rem; - background-color: #fef2f2; - border: 1px solid #fecaca; - border-radius: 8px; - margin-bottom: 1.5rem; - color: #dc2626; - font-size: 0.875rem; - - i { - flex-shrink: 0; - font-size: 1rem; - } -} - -.team-form { - display: flex; - flex-direction: column; - gap: 1.5rem; -} - -.form-field { - display: flex; - flex-direction: column; - gap: 0.5rem; - - .field-label { - font-size: 0.875rem; - font-weight: 600; - color: #374151; - text-transform: uppercase; - letter-spacing: 0.05em; - } - - .form-input { - width: 100%; - padding: 0.75rem 1rem; - border: 1px solid #d1d5db; - border-radius: 8px; - font-size: 0.875rem; - background-color: #f9fafb; - transition: all 0.2s ease; - resize: vertical; - - &:focus { - outline: none; - border-color: #3b82f6; - background-color: white; - box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); - } - - &::placeholder { - color: #9ca3af; - } - - &:disabled { - background-color: #f3f4f6; - color: #9ca3af; - cursor: not-allowed; - } - } - - .field-error { - display: flex; - align-items: center; - gap: 0.25rem; - color: #dc2626; - font-size: 0.75rem; - margin-top: 0.25rem; - - i { - font-size: 0.75rem; - } - } -} - -::ng-deep .mat-dialog-container { - padding: 0; - border-radius: 12px; - box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; -} - -::ng-deep .mat-dialog-actions { - padding: 0; - margin: 0; -} - -::ng-deep .mat-dialog-content { - padding: 0; - margin: 0; -} - -::ng-deep .mat-dialog-title { - padding: 0; - margin: 0; -} \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-teams/create-team/create-team.component.ts b/web-app/admin/src/app/admin/admin-teams/create-team/create-team.component.ts deleted file mode 100644 index 6564c7a41..000000000 --- a/web-app/admin/src/app/admin/admin-teams/create-team/create-team.component.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Component, Inject } from '@angular/core'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; -import { TeamsService } from '../teams-service'; -import { Team } from '../team'; - -/** - * Dialog component for creating new teams. - * Provides a form interface with validation for team name (required) and description (optional). - */ -@Component({ - selector: 'mage-admin-team-create', - templateUrl: './create-team.component.html', - styleUrls: ['./create-team.component.scss'] -}) -export class CreateTeamDialogComponent { - teamForm: FormGroup; - errorMessage: string = ''; - - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: { team: Partial }, - private fb: FormBuilder, - private teamsService: TeamsService - ) { - this.teamForm = this.fb.group({ - name: [data.team.name || '', [Validators.required]], - description: [data.team.description || ''] - }); - } - - /** - * Handles form submission for creating a new team. - * Validates the form, creates the team via the teams service, and closes the dialog on success. - */ - save(): void { - if (this.teamForm.invalid) { - this.errorMessage = 'Please fill in all required fields.'; - return; - } - - this.errorMessage = ''; - const teamData = this.teamForm.value; - this.teamsService.createTeam(teamData).subscribe({ - next: (newTeam) => { - this.dialogRef.close(newTeam); - }, - error: (err) => { - if (err.status === 409) { - this.errorMessage = err.error; - } - else { - this.errorMessage = 'Failed to create team. Please try again.'; - } - } - }); - } - - /** - * Closes the dialog without saving any data or making any changes. - */ - cancel(): void { - this.dialogRef.close(); - } -} diff --git a/web-app/admin/src/app/admin/admin-teams/dashboard/team-dashboard.component.html b/web-app/admin/src/app/admin/admin-teams/dashboard/team-dashboard.component.html deleted file mode 100644 index 5e999148d..000000000 --- a/web-app/admin/src/app/admin/admin-teams/dashboard/team-dashboard.component.html +++ /dev/null @@ -1,81 +0,0 @@ - - -
- - -
-
-
- -
- -
- -
-
- -
- - - - - - - - -
Name -
- -
-
{{ team.name }}
-
-

{{ team.description }}

-
-
-
-
-
- - -
No teams found.
-
- - -
-
diff --git a/web-app/admin/src/app/admin/admin-teams/dashboard/team-dashboard.component.scss b/web-app/admin/src/app/admin/admin-teams/dashboard/team-dashboard.component.scss deleted file mode 100644 index 0703229f1..000000000 --- a/web-app/admin/src/app/admin/admin-teams/dashboard/team-dashboard.component.scss +++ /dev/null @@ -1,457 +0,0 @@ -::ng-deep .admin-main-content { - min-width: 520px; - &:has(admin-users) { - height: 92vh; - overflow-y: hidden; - -webkit-overflow-scrolling: touch; - - @media (max-height: 500px) { - overflow-y: scroll; - } - } - admin-users { - .container { - height: 90vh; - } - } -} - -$min-height: 40.8vh; -$max-height: 72.8vh; - -.container.bottom-gap-l { - margin-bottom: 2rem; -} - -.admin-nav-gap { - margin-top: -15px; - margin-bottom: -15px; - - .breadcrumbs-toolbar { - min-height: 36px !important; - height: 36px; - background-color: #f0f0f0; - color: #555; - font-size: 13px; - padding: 0 16px; - border-radius: 4px; - - mat-icon { - font-size: 18px; - margin-right: 4px; - vertical-align: middle; - color: #777; - } - - span { - display: flex; - align-items: center; - gap: 4px; - } - } -} - -.page-header { - margin-bottom: 20px; - margin-top: 5px; - padding: 0; - - .page-title { - font-size: 2rem; - font-weight: 700; - color: #1a1a1a; - margin: 0 0 0.5rem; - line-height: 1.2; - letter-spacing: -0.025em; - } - - .page-subtitle { - font-size: 1rem; - color: #666; - margin: 0; - line-height: 1.5; - font-weight: 400; - } -} - -.btn-primary { - background-color: #1e88e5; - color: #fff; -} - -.integrated-navbar { - display: flex; - align-items: center; - justify-content: space-between; - flex-wrap: wrap; - padding: 1rem 1.5rem; - border-bottom: 2px solid #e5e7eb; - height: 85px; - - mage-card-navbar { - flex: 1; - margin-right: 1rem; - min-width: 200px; - background: transparent; - box-shadow: none; - border-radius: 0; - margin-bottom: 0; - } - - @media (max-width: 768px) { - flex-direction: column; - align-items: stretch; - margin: 0; - padding: 5px; - - .button-group { - width: auto; - margin: 0 auto; - } - } -} -.table-wrapper { - border-radius: 12px; - background: #fff; - border: 1px solid #e5e7eb; - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), - 0 2px 4px -1px rgba(0, 0, 0, 0.06); - height: 75vh; - overflow: hidden; - - @media (max-height: 1100px) { - height: 73vh; - } - - @media (max-height: 1000px) { - height: 71vh; - } - - @media (max-height: 900px) { - height: 69vh; - } - - @media (max-height: 800px) { - height: 64vh; - } - - @media (max-height: 700px) { - height: 57vh; - } - - @media (max-height: 600px) { - height: 285px; - } -} - -.table-scroll { - height: 62.2vh; - @media (max-width: 768px) { - height: 60.2vh; - } - overflow-y: auto; - max-height: 100%; - - @media (max-height: 1100px) { - height: 59vh; - } - - @media (max-height: 1000px) { - height: 55vh; - } - - @media (max-height: 900px) { - height: 52vh; - } - - @media (max-height: 800px) { - height: 44vh; - } - - @media (max-height: 700px) { - height: 34vh; - } - @media (max-height: 600px) { - height: 142.5px; - } - - table { - width: 100%; - border-collapse: collapse; - table-layout: fixed; - - th, - td { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - } - - .mat-header-row { - position: sticky; - top: 0; - z-index: 2; - background: #f9fafb; - } - - .mat-row, - .mat-cell, - .mat-header-cell { - height: 3.5rem; - padding: 0.5rem; - - @media (max-height: 768px) { - height: 3.2rem; - } - - @media (max-height: 600px) { - height: 3rem; - padding: 0.4rem; - } - - @media (max-height: 480px) { - height: 2.8rem; - padding: 0.3rem; - font-size: 0.85rem; - } - - @media (max-height: 400px) { - height: 2.5rem; - font-size: 0.75rem; - } - - @media (max-height: 350px) { - height: 2.3rem; - font-size: 0.7rem; - } - } -} - -.pagination { - display: contents; -} - -.mat-column-actions { - text-align: right; - - .mat-cell, - .mat-header-cell { - justify-content: flex-end; - text-align: right; - } - - .d-flex { - display: flex; - justify-content: flex-end; - gap: 0.5rem; - } -} - -.bulk-overlay { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(255, 255, 255, 0.9); - z-index: 10000; - display: flex; - align-items: center; - justify-content: center; - pointer-events: all; -} - -.bulk-progress-content { - width: 60%; - text-align: center; - - @media (max-width: 768px) { - width: 100%; - } -} - -.bulk-progress-bar { - position: relative; - width: 100%; - height: 24px; - background-color: #e0e0e0; - border-radius: 12px; - overflow: hidden; - display: flex; - box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2); -} - -.bulk-progress-success { - background-color: #4caf50; - height: 100%; - transition: width 0.3s ease; -} - -.bulk-progress-failure { - background-color: #f44336; - height: 100%; - transition: width 0.3s ease; -} - -.bulk-progress-text { - margin-top: 1rem; - font-size: 16px; - font-weight: 500; -} - -.bulk-progress-warning { - display: flex; - align-items: center; - justify-content: center; - background-color: #fff3cd; - color: #856404; - padding: 12px; - border-radius: 4px; - margin-bottom: 1rem; - font-weight: 500; - border: 1px solid #ffeeba; - font-size: 14px; - text-align: center; - - mat-icon { - margin-right: 8px; - } -} - -.bulk-error-summary { - margin-top: 2rem; - background-color: #fff3f3; - border: 1px solid #f5c2c7; - padding: 1rem; - border-radius: 4px; -} - -.bulk-error-summary { - margin-top: 2rem; - background-color: #fff3f3; - border: 1px solid #f5c2c7; - padding: 1rem; - border-radius: 4px; - max-width: 100%; - - .error-table-wrapper { - max-height: 300px; - overflow-y: auto; - width: 100%; - margin-top: 1rem; - border: 1px solid #ccc; - border-radius: 4px; - - table.error-table { - width: 100%; - border-collapse: collapse; - margin: 0; - - thead { - th { - background-color: #f8d7da; - position: sticky; - top: 0; - z-index: 1; - padding: 8px; - border: 1px solid #ccc; - font-size: 14px; - white-space: nowrap; - } - } - - tbody { - td { - padding: 8px; - border: 1px solid #ccc; - font-size: 14px; - white-space: nowrap; - } - } - } - } -} - -.finalizing-text { - margin-top: 1rem; - font-style: italic; - color: #666; -} - -.button-group { - margin-top: -20px; - button { - height: 43px; - white-space: nowrap; - } - - button:not(:last-child) { - margin-right: 40px; - } -} - -.filters { - align-items: center !important; - display: flex !important; -} - -:host { - .status-filter { - width: 150px; - margin-left: 1rem; - margin-top: 10px; - font-size: 14px; - - ::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix { - padding: 10px; - } - ::ng-deep .mat-form-field-infix { - padding: 10px; - } - - ::ng-deep .mat-form-field-label-wrapper { - top: -12px; - left: -1px; - } - } - ::ng-deep input.search-input.ng-untouched.ng-pristine.ng-valid, - ::ng-deep input.search-input.ng-valid.ng-dirty.ng-touched, - ::ng-deep input.search-input.ng-valid.ng-dirty.ng-untouched { - height: 43px; - margin-top: -10px; - } -} - -.d-flex { - display: flex; - gap: 25px; -} - -.align-items-center{ - align-items: center !important; -} - -.icon { - font-size: 25px; -} - -.ellipsis { - text-overflow: ellipsis; - overflow: hidden; -} - -::ng-deep .mat-tooltip-event-desc{ - position: relative; - left: 0 !important; - font-size: 20px; - min-width: 75vw; -} - -.w-100 { - width: 100% !important; -} - -.w-90 { - width: 90% !important; -} \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-teams/dashboard/team-dashboard.component.spec.ts b/web-app/admin/src/app/admin/admin-teams/dashboard/team-dashboard.component.spec.ts deleted file mode 100644 index a8be34f94..000000000 --- a/web-app/admin/src/app/admin/admin-teams/dashboard/team-dashboard.component.spec.ts +++ /dev/null @@ -1,199 +0,0 @@ -import { ComponentFixture, TestBed, fakeAsync, tick } from '@angular/core/testing'; -import { MatDialog } from '@angular/material/dialog'; -import { MatTableModule } from '@angular/material/table'; -import { MatPaginatorModule, PageEvent } from '@angular/material/paginator'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { FormsModule } from '@angular/forms'; -import { of } from 'rxjs'; - -import { TeamDashboardComponent } from './team-dashboard.component'; -import { TeamsService } from '../teams-service'; -import { Team } from '../team'; -import { CreateTeamDialogComponent } from '../create-team/create-team.component'; - -describe('TeamDashboardComponent', () => { - let component: TeamDashboardComponent; - let fixture: ComponentFixture; - let mockTeamsService: jasmine.SpyObj; - let mockDialog: jasmine.SpyObj; - - const mockTeams: Team[] = [ - { id: '1', name: 'Team Alpha', description: 'First team description', teamEventId: '507f1f77bcf86cd799439011', users: [] as any, acl: {} as any }, - { id: '2', name: 'Team Beta', description: 'Second team description with much longer text that might wrap', teamEventId: '507f191e810c19729de860ea', users: [] as any, acl: {} as any }, - { id: '3', name: 'Team Gamma', description: 'Third team', teamEventId: '507f1f77bcf86cd799439012', users: [] as any, acl: {} as any } - ]; - - const mockTeamsResponse = [{ - items: mockTeams, - totalCount: mockTeams.length - }]; - - beforeEach(async () => { - const teamsServiceSpy = jasmine.createSpyObj('TeamsService', ['getTeams']); - const dialogSpy = jasmine.createSpyObj('MatDialog', ['open']); - - await TestBed.configureTestingModule({ - declarations: [TeamDashboardComponent], - imports: [ - MatTableModule, - MatPaginatorModule, - NoopAnimationsModule, - FormsModule - ], - providers: [ - { provide: TeamsService, useValue: teamsServiceSpy }, - { provide: MatDialog, useValue: dialogSpy } - ] - }).compileComponents(); - - fixture = TestBed.createComponent(TeamDashboardComponent); - component = fixture.componentInstance; - mockTeamsService = TestBed.inject(TeamsService) as jasmine.SpyObj; - mockDialog = TestBed.inject(MatDialog) as jasmine.SpyObj; - - mockTeamsService.getTeams.and.returnValue(of(mockTeamsResponse)); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - expect(component.teamSearch).toBe(''); - expect(component.pageSize).toBe(10); - expect(component.pageIndex).toBe(0); - expect(component.displayedColumns).toEqual(['name']); - }); - - it('should fetch teams on init', () => { - fixture.detectChanges(); - - expect(mockTeamsService.getTeams).toHaveBeenCalledWith({ - term: '', - sort: { name: 1 }, - limit: 10, - omit_event_teams: true, - start: '0' - }); - expect(component.teams).toEqual(mockTeams); - expect(component.totalTeams).toBe(mockTeams.length); - expect(component.dataSource.data).toEqual(mockTeams); - }); - - it('should reset page index when searching', fakeAsync(() => { - fixture.detectChanges(); - component.pageIndex = 2; - - component.onSearchTermChanged('test'); - tick(250); - - expect(component.pageIndex).toBe(0); - })); - - it('should handle page changes', () => { - const pageEvent: PageEvent = { - pageIndex: 1, - pageSize: 25, - length: 100 - }; - - component.onPageChange(pageEvent); - - expect(component.pageSize).toBe(25); - expect(component.pageIndex).toBe(1); - expect(mockTeamsService.getTeams).toHaveBeenCalledWith({ - term: '', - sort: { name: 1 }, - limit: 25, - omit_event_teams: true, - start: '25' - }); - }); - - it('should reset search and pagination', () => { - component.teamSearch = 'test'; - component.pageIndex = 2; - - component.onSearchCleared(); - - expect(component.teamSearch).toBe(''); - expect(component.pageIndex).toBe(0); - expect(mockTeamsService.getTeams).toHaveBeenCalledWith({ - term: '', - sort: { name: 1 }, - omit_event_teams: true, - limit: 10, - start: '0' - }); - }); - - it('should open new team dialog', () => { - const dialogRefSpy = jasmine.createSpyObj('MatDialogRef', ['afterClosed']); - dialogRefSpy.afterClosed.and.returnValue(of(null)); - mockDialog.open.and.returnValue(dialogRefSpy); - - component.createTeam(); - - expect(mockDialog.open).toHaveBeenCalledWith(CreateTeamDialogComponent, { - data: { team: {} } - }); - }); - - it('should refresh teams after creating new team', () => { - const createTeam = { id: '4', name: 'New Team', description: 'New team description' }; - const dialogRefSpy = jasmine.createSpyObj('MatDialogRef', ['afterClosed']); - dialogRefSpy.afterClosed.and.returnValue(of(createTeam)); - mockDialog.open.and.returnValue(dialogRefSpy); - - component.createTeam(); - - expect(mockTeamsService.getTeams).toHaveBeenCalled(); - }); - - it('should not refresh teams if dialog is cancelled', () => { - const dialogRefSpy = jasmine.createSpyObj('MatDialogRef', ['afterClosed']); - dialogRefSpy.afterClosed.and.returnValue(of(null)); - mockDialog.open.and.returnValue(dialogRefSpy); - - component.createTeam(); - - expect(mockTeamsService.getTeams).not.toHaveBeenCalled(); - }); - - it('should handle empty teams response', () => { - mockTeamsService.getTeams.and.returnValue(of([])); - - fixture.detectChanges(); - - expect(component.teams).toEqual([]); - expect(component.totalTeams).toBe(0); - expect(component.dataSource.data).toEqual([]); - }); - - it('should display team names and descriptions in table', () => { - fixture.detectChanges(); - - const compiled = fixture.nativeElement; - const tableRows = compiled.querySelectorAll('tr.mat-row'); - - expect(tableRows.length).toBe(mockTeams.length); - expect(compiled.textContent).toContain('Team Alpha'); - expect(compiled.textContent).toContain('First team description'); - }); - - it('should show table headers', () => { - fixture.detectChanges(); - - const compiled = fixture.nativeElement; - const headers = compiled.querySelectorAll('th.mat-header-cell'); - expect(headers.length).toBe(1); - expect(headers[0].textContent).toContain('Name'); - }); - - it('should cleanup subscriptions on destroy', () => { - spyOn(component['destroy$'], 'next'); - spyOn(component['destroy$'], 'complete'); - - component.ngOnDestroy(); - - expect(component['destroy$'].next).toHaveBeenCalled(); - expect(component['destroy$'].complete).toHaveBeenCalled(); - }); -}); diff --git a/web-app/admin/src/app/admin/admin-teams/dashboard/team-dashboard.component.ts b/web-app/admin/src/app/admin/admin-teams/dashboard/team-dashboard.component.ts deleted file mode 100644 index 5872ab2dd..000000000 --- a/web-app/admin/src/app/admin/admin-teams/dashboard/team-dashboard.component.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { Component, OnInit, OnDestroy, HostListener } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; -import { PageEvent } from '@angular/material/paginator'; -import { MatTableDataSource } from '@angular/material/table'; -import { Team } from '../team'; -import { Subject } from 'rxjs'; -import { TeamsService } from '../teams-service'; -import { CreateTeamDialogComponent } from '../create-team/create-team.component'; -import { CardActionButton } from '../../../core/card-navbar/card-navbar.component'; -import { AdminBreadcrumb } from '../../admin-breadcrumb/admin-breadcrumb.model'; - -/** - * Team dashboard component that displays a paginated list of teams with search functionality. - * Provides capabilities to view, search, and create new teams through a data table interface. - */ -@Component({ - selector: 'mage-admin-teams', - templateUrl: './team-dashboard.component.html', - styleUrls: ['./team-dashboard.component.scss'] -}) -export class TeamDashboardComponent implements OnInit, OnDestroy { - teamSearch = ''; - teams: Team[] = []; - totalTeams = 0; - pageSize = 10; - pageIndex = 0; - pageSizeOptions = [5, 10, 25]; - - numChars = 180; - toolTipWidth = '1000px'; - - dataSource = new MatTableDataSource(); - displayedColumns = ['name']; - - breadcrumbs: AdminBreadcrumb[] = [{ - title: 'Teams', - iconClass: 'fa fa-users' - }] - - private destroy$ = new Subject(); - - constructor( - private modal: MatDialog, - private teamService: TeamsService - ) { } - - /** - * Fetches the initial set of teams when the component loads - */ - ngOnInit(): void { - this.fetchTeams(); - this.updateResponsiveLayout(); - } - - /** - * Component destruction lifecycle hook - */ - ngOnDestroy(): void { - this.destroy$.next(); - this.destroy$.complete(); - } - - /** - * Fetches teams from the service based on current search term and pagination settings - */ - fetchTeams(): void { - this.teamService.getTeams({ - term: this.teamSearch, - sort: { name: 1 }, - limit: this.pageSize, - omit_event_teams: true, - start: String(this.pageIndex * this.pageSize) - }).subscribe((results) => { - if (results?.length > 0) { - const teams = results[0]; - this.teams = teams.items; - this.totalTeams = teams.totalCount; - this.dataSource.data = this.teams; - } - }); - } - - /** - * Handles pagination change events from the Material paginator - * - * @param event - The page event containing new page size and index - */ - onPageChange(event: PageEvent): void { - this.pageSize = event.pageSize; - this.pageIndex = event.pageIndex; - this.fetchTeams(); - } - - /** - * Resets pagination to the first page and refetches teams with the new search term - * - * @param term - The new search term entered by the user - */ - onSearchTermChanged(term: string): void { - this.teamSearch = term; - this.pageIndex = 0; // Reset to first page when searching - this.fetchTeams(); - } - - /** - * Resets the search term, pagination to the first page, and refetches all teams - */ - onSearchCleared(): void { - this.teamSearch = ''; - this.pageIndex = 0; - this.fetchTeams(); - } - - /** - * Opens the create team dialog and handles the result. - * If a new team is created, refetches the teams list to include the new team. - */ - createTeam(): void { - const dialogRef = this.modal.open(CreateTeamDialogComponent, { - data: { team: {} } - }); - - dialogRef.afterClosed().subscribe(newTeam => { - if (newTeam) { - this.fetchTeams(); - } - }); - } - - /** - * Navigates to the detailed view of a specific team - * - * @param team - The team to navigate to - */ - gotoTeam(team: Team): void { - // TODO: convert to this to using a router once upgrade is complete - const baseUrl = window.location.href.split('#')[0]; - window.location.href = `${baseUrl}#/home/teams/${team.id}`; - } - - /** Update layout-related values on resize */ - @HostListener('window:resize') - onResize(): void { - this.updateResponsiveLayout(); - } - - /** Calculates responsive values */ - private updateResponsiveLayout(): void { - this.numChars = Math.ceil(window.innerWidth / 8.5); - this.toolTipWidth = `${window.innerWidth * 0.75}px`; - } -} diff --git a/web-app/admin/src/app/admin/admin-teams/delete-team/delete-team.component.html b/web-app/admin/src/app/admin/admin-teams/delete-team/delete-team.component.html deleted file mode 100644 index ad29ab230..000000000 --- a/web-app/admin/src/app/admin/admin-teams/delete-team/delete-team.component.html +++ /dev/null @@ -1,54 +0,0 @@ -
-
-
- -
-
-

Delete Team

-

This action cannot be undone

-
-
- -
-
-

Team "{{team.name}}" will be permanently deleted.

-
- -
- -
- -
-
- -

Are you ABSOLUTELY sure?

-
-
-

This will delete all users that are part of this team, regardless of whether they - are in other teams.

-

This action CANNOT be undone.

-
- - -
-
-
-
- -
- - - -
-
\ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-teams/delete-team/delete-team.component.scss b/web-app/admin/src/app/admin/admin-teams/delete-team/delete-team.component.scss deleted file mode 100644 index 0e87e98e3..000000000 --- a/web-app/admin/src/app/admin/admin-teams/delete-team/delete-team.component.scss +++ /dev/null @@ -1,189 +0,0 @@ -.dialog-header { - align-items: flex-start; - gap: 1rem; - - .warning-icon { - flex-shrink: 0; - width: 3rem; - height: 3rem; - background-color: #fef2f2; - border: 2px solid #fecaca; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - color: #dc2626; - - i { - font-size: 1.25rem; - } - } - - .header-content { - flex: 1; - - .dialog-title { - font-size: 1.375rem; - font-weight: 700; - color: #111827; - margin: 0 0 0.25rem 0; - line-height: 1.2; - } - - .dialog-subtitle { - font-size: 0.875rem; - color: #dc2626; - margin: 0; - line-height: 1.4; - font-weight: 500; - } - } -} - -.warning-message { - padding: 1rem; - background-color: #fef2f2; - border: 1px solid #fecaca; - border-radius: 8px; - margin-bottom: 1.5rem; - - p { - margin: 0; - color: #7f1d1d; - font-size: 0.875rem; - line-height: 1.5; - - strong { - color: #dc2626; - font-weight: 600; - } - } -} - -.form-field { - margin-bottom: 1.5rem; -} - -.checkbox-field { - display: flex; - align-items: flex-start; - gap: 0.75rem; - cursor: pointer; - font-size: 0.875rem; - line-height: 1.5; - - .checkbox-input { - margin: 0; - width: 1.125rem; - height: 1.125rem; - flex-shrink: 0; - cursor: pointer; - accent-color: #dc2626; - } - - .checkbox-label { - color: #374151; - font-weight: 500; - cursor: pointer; - } -} - -.danger-zone { - background-color: #fef2f2; - border: 2px solid #fecaca; - border-radius: 12px; - padding: 1.5rem; - margin-top: 1rem; - - .danger-zone-header { - display: flex; - align-items: center; - gap: 0.5rem; - margin-bottom: 1rem; - - i { - color: #dc2626; - font-size: 1.125rem; - } - - h3 { - margin: 0; - font-size: 1.125rem; - font-weight: 700; - color: #dc2626; - } - } - - .danger-zone-content { - p { - margin: 0 0 0.75rem 0; - color: #7f1d1d; - font-size: 0.875rem; - line-height: 1.5; - - &:last-of-type { - margin-bottom: 1.25rem; - } - - strong { - color: #dc2626; - font-weight: 700; - } - } - } -} - -.confirmation-field { - .field-label { - display: block; - font-size: 0.875rem; - font-weight: 600; - color: #7f1d1d; - margin-bottom: 0.5rem; - text-transform: uppercase; - letter-spacing: 0.05em; - } - - .form-input { - width: 100%; - padding: 0.75rem 1rem; - border: 2px solid #fca5a5; - border-radius: 8px; - font-size: 0.875rem; - background-color: white; - transition: all 0.2s ease; - font-weight: 500; - - &:focus { - outline: none; - border-color: #dc2626; - box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.1); - } - - &::placeholder { - color: #fca5a5; - font-weight: 400; - } - } -} - -::ng-deep .mat-dialog-container { - padding: 0; - border-radius: 12px; - box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); -} - -::ng-deep .mat-dialog-actions { - padding: 0; - margin: 0; -} - -::ng-deep .mat-dialog-content { - padding: 0; - margin: 0; -} - -::ng-deep .mat-dialog-title { - padding: 0; - margin: 0; -} \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-teams/delete-team/delete-team.component.spec.ts b/web-app/admin/src/app/admin/admin-teams/delete-team/delete-team.component.spec.ts deleted file mode 100644 index 35c3e4234..000000000 --- a/web-app/admin/src/app/admin/admin-teams/delete-team/delete-team.component.spec.ts +++ /dev/null @@ -1,340 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { of, throwError } from 'rxjs'; -import { FormsModule } from '@angular/forms'; -import { By } from '@angular/platform-browser'; - -import { DeleteTeamComponent } from './delete-team.component'; -import { TeamsService } from '../teams-service'; -import { UserService } from 'admin/src/app/upgrade/ajs-upgraded-providers'; -import { Team } from '../team'; - -describe('DeleteTeamComponent', () => { - let component: DeleteTeamComponent; - let fixture: ComponentFixture; - let mockDialogRef: jasmine.SpyObj>; - let mockTeamsService: jasmine.SpyObj; - let mockUserService: jasmine.SpyObj; - - const mockTeam: Team = { - id: 'team123' as any, - name: 'Test Team', - description: 'Test Description', - teamEventId: null, - users: [ - { id: 'user1', displayName: 'User One' }, - { id: 'user2', displayName: 'User Two' } - ] as any, - acl: {} as any - }; - - beforeEach(async () => { - // Create spies for dependencies - mockDialogRef = jasmine.createSpyObj('MatDialogRef', ['close']); - mockTeamsService = jasmine.createSpyObj('TeamsService', ['deleteTeam']); - mockUserService = jasmine.createSpyObj('UserService', ['deleteUser']); - - await TestBed.configureTestingModule({ - declarations: [DeleteTeamComponent], - imports: [FormsModule], - providers: [ - { provide: MatDialogRef, useValue: mockDialogRef }, - { provide: MAT_DIALOG_DATA, useValue: { team: mockTeam } }, - { provide: TeamsService, useValue: mockTeamsService }, - { provide: UserService, useValue: mockUserService } - ] - }).compileComponents(); - - fixture = TestBed.createComponent(DeleteTeamComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should initialize with correct team data', () => { - expect(component.team).toEqual(mockTeam); - expect(component.deleteAllUsers).toBe(false); - expect(component.deleting).toBe(false); - expect(component.confirm).toEqual({}); - }); - - it('should display team name in the template', () => { - const teamNameElement = fixture.debugElement.query(By.css('.warning-message strong')); - expect(teamNameElement.nativeElement.textContent).toBe(`"${mockTeam.name}"`); - }); - - it('should show danger zone when deleteAllUsers is true', () => { - component.deleteAllUsers = true; - fixture.detectChanges(); - - const dangerZone = fixture.debugElement.query(By.css('.danger-zone')); - expect(dangerZone).toBeTruthy(); - }); - - it('should hide danger zone when deleteAllUsers is false', () => { - component.deleteAllUsers = false; - fixture.detectChanges(); - - const dangerZone = fixture.debugElement.query(By.css('.danger-zone')); - expect(dangerZone).toBeFalsy(); - }); - - it('should enable delete button when not deleting all users', () => { - component.deleteAllUsers = false; - fixture.detectChanges(); - - const deleteButton = fixture.debugElement.query(By.css('button.btn-danger')); - expect(deleteButton.nativeElement.disabled).toBe(false); - }); - - it('should disable delete button when deleting all users and team name not confirmed', () => { - component.deleteAllUsers = true; - component.confirm.text = 'wrong name'; - fixture.detectChanges(); - - const deleteButton = fixture.debugElement.query(By.css('button.btn-danger[disabled]')); - expect(deleteButton.nativeElement.disabled).toBe(true); - }); - - it('should enable delete button when deleting all users and team name is confirmed', () => { - component.deleteAllUsers = true; - component.confirm.text = mockTeam.name; - fixture.detectChanges(); - - const deleteButton = fixture.debugElement.query(By.css('button.btn-danger')); - expect(deleteButton.nativeElement.disabled).toBe(false); - }); - - it('should disable delete button when deleting is in progress', () => { - component.deleting = true; - component.deleteAllUsers = true; - component.confirm.text = mockTeam.name; - fixture.detectChanges(); - - const deleteButton = fixture.debugElement.query(By.css('button.btn-danger')); - expect(deleteButton.nativeElement.disabled).toBe(true); - }); - - describe('cancel', () => { - it('should close dialog without result', () => { - component.cancel(); - expect(mockDialogRef.close).toHaveBeenCalledWith(); - }); - }); - - describe('deleteTeam', () => { - beforeEach(() => { - mockTeamsService.deleteTeam.and.returnValue(of({})); - }); - - it('should set deleting to true when starting deletion', () => { - component.deleteTeam(); - expect(component.deleting).toBe(true); - }); - - it('should call teamsService.deleteTeam with correct team id', () => { - component.deleteTeam(); - expect(mockTeamsService.deleteTeam).toHaveBeenCalledWith(mockTeam.id.toString()); - }); - - it('should close dialog with team when deleteAllUsers is false', () => { - component.deleteAllUsers = false; - component.deleteTeam(); - - expect(mockDialogRef.close).toHaveBeenCalledWith(mockTeam); - }); - - it('should close dialog with team when deleteAllUsers is true but team name not confirmed', () => { - component.deleteAllUsers = true; - component.confirm.text = 'wrong name'; - component.deleteTeam(); - - expect(mockDialogRef.close).toHaveBeenCalledWith(mockTeam); - }); - - it('should call deleteUsers when deleteAllUsers is true and team name is confirmed', () => { - component.deleteAllUsers = true; - component.confirm.text = mockTeam.name; - spyOn(component as any, 'deleteUsers'); - - component.deleteTeam(); - - expect((component as any).deleteUsers).toHaveBeenCalled(); - }); - - it('should handle error and reset deleting state', () => { - const error = new Error('Delete failed'); - mockTeamsService.deleteTeam.and.returnValue(throwError(() => error)); - spyOn(console, 'error'); - - component.deleteTeam(); - - expect(component.deleting).toBe(false); - expect(console.error).toHaveBeenCalledWith('Error deleting team:', error); - }); - }); - - describe('deleteUsers', () => { - beforeEach(() => { - mockUserService.deleteUser.and.returnValue(of({})); - }); - - it('should close dialog immediately when no users exist', () => { - const teamWithoutUsers = { ...mockTeam, users: [] }; - component.team = teamWithoutUsers; - - (component as any).deleteUsers(); - - expect(mockDialogRef.close).toHaveBeenCalledWith(teamWithoutUsers); - }); - - it('should close dialog immediately when users is undefined', () => { - const teamWithoutUsers = { ...mockTeam, users: undefined }; - component.team = teamWithoutUsers; - - (component as any).deleteUsers(); - - expect(mockDialogRef.close).toHaveBeenCalledWith(teamWithoutUsers); - }); - - it('should call deleteUser for each user in the team', () => { - (component as any).deleteUsers(); - - expect(mockUserService.deleteUser).toHaveBeenCalledTimes(2); - expect(mockUserService.deleteUser).toHaveBeenCalledWith(mockTeam.users![0]); - expect(mockUserService.deleteUser).toHaveBeenCalledWith(mockTeam.users![1]); - }); - - it('should close dialog with team after all users are deleted successfully', () => { - (component as any).deleteUsers(); - - expect(mockDialogRef.close).toHaveBeenCalledWith(mockTeam); - }); - - it('should handle error and still close dialog', () => { - const error = new Error('User delete failed'); - mockUserService.deleteUser.and.returnValue(throwError(() => error)); - spyOn(console, 'error'); - - (component as any).deleteUsers(); - - expect(console.error).toHaveBeenCalledWith('Error deleting users:', error); - expect(mockDialogRef.close).toHaveBeenCalledWith(mockTeam); - }); - - it('should handle mixed success and failure of user deletions', () => { - // First user deletion succeeds, second fails - mockUserService.deleteUser.and.returnValues( - of({}), - throwError(() => new Error('Failed')) - ); - spyOn(console, 'error'); - - (component as any).deleteUsers(); - - expect(console.error).toHaveBeenCalledWith('Error deleting users:', jasmine.any(Error)); - expect(mockDialogRef.close).toHaveBeenCalledWith(mockTeam); - }); - }); - - describe('ngOnInit', () => { - it('should be defined and not throw error', () => { - expect(() => component.ngOnInit()).not.toThrow(); - }); - }); - - describe('Template Integration', () => { - it('should call cancel when cancel button is clicked', () => { - spyOn(component, 'cancel'); - const cancelButton = fixture.debugElement.query(By.css('button:not(.btn-danger)')); - - cancelButton.nativeElement.click(); - - expect(component.cancel).toHaveBeenCalled(); - }); - - it('should call deleteTeam when delete button is clicked', () => { - spyOn(component, 'deleteTeam'); - const deleteButton = fixture.debugElement.query(By.css('button.btn-danger')); - - deleteButton.nativeElement.click(); - - expect(component.deleteTeam).toHaveBeenCalled(); - }); - - it('should update deleteAllUsers when checkbox is changed', () => { - const checkbox = fixture.debugElement.query(By.css('input[type="checkbox"]')); - - checkbox.nativeElement.checked = true; - checkbox.nativeElement.dispatchEvent(new Event('change')); - fixture.detectChanges(); - - expect(component.deleteAllUsers).toBe(true); - }); - - it('should update confirm.text when input is changed', () => { - component.deleteAllUsers = true; - fixture.detectChanges(); - - const input = fixture.debugElement.query(By.css('input[type="text"]')); - input.nativeElement.value = 'test input'; - input.nativeElement.dispatchEvent(new Event('input')); - fixture.detectChanges(); - - expect(component.confirm.text).toBe('test input'); - }); - - it('should show spinner icon when deleting', () => { - component.deleting = true; - component.deleteAllUsers = true; - component.confirm.text = mockTeam.name; - fixture.detectChanges(); - - const spinnerIcon = fixture.debugElement.query(By.css('.fa-spinner.fa-spin')); - expect(spinnerIcon).toBeTruthy(); - }); - - it('should show trash icon when not deleting', () => { - component.deleting = false; - component.deleteAllUsers = true; - component.confirm.text = mockTeam.name; - fixture.detectChanges(); - - const trashIcon = fixture.debugElement.query(By.css('.fa-trash')); - expect(trashIcon).toBeTruthy(); - }); - - it('should show correct placeholder text in confirmation input', () => { - component.deleteAllUsers = true; - fixture.detectChanges(); - - const input = fixture.debugElement.query(By.css('input[type="text"]')); - expect(input.nativeElement.placeholder).toBe(mockTeam.name); - }); - }); - - describe('Edge Cases', () => { - it('should handle team with empty name', () => { - const teamWithEmptyName = { ...mockTeam, name: '' }; - component.team = teamWithEmptyName; - component.deleteAllUsers = true; - component.confirm.text = ''; - - expect(component.confirm.text === component.team.name).toBe(true); - }); - - it('should handle team with special characters in name', () => { - const teamWithSpecialName = { ...mockTeam, name: 'Test-Team_123!@#' }; - component.team = teamWithSpecialName; - component.deleteAllUsers = true; - component.confirm.text = 'Test-Team_123!@#'; - fixture.detectChanges(); - - const deleteButton = fixture.debugElement.query(By.css('button.btn-danger')); - expect(deleteButton.nativeElement.disabled).toBe(false); - }); - }); -}); diff --git a/web-app/admin/src/app/admin/admin-teams/delete-team/delete-team.component.ts b/web-app/admin/src/app/admin/admin-teams/delete-team/delete-team.component.ts deleted file mode 100644 index 5b40ff4d2..000000000 --- a/web-app/admin/src/app/admin/admin-teams/delete-team/delete-team.component.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { Component, OnInit, Inject } from '@angular/core'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { Observable, forkJoin } from 'rxjs'; -import { Team } from '../team'; -import { TeamsService } from '../teams-service'; -import { UserService } from 'admin/src/app/upgrade/ajs-upgraded-providers'; - -/** - * Modal component for confirming team deletion. - * Provides options to delete the team and optionally delete all associated users. - */ -@Component({ - selector: 'mage-delete-team', - templateUrl: './delete-team.component.html', - styleUrls: ['./delete-team.component.scss'] -}) -export class DeleteTeamComponent implements OnInit { - team: Team; - deleteAllUsers = false; - deleting = false; - confirm: { text?: string } = {}; - - /** - * Constructor - initializes the component with injected services and team data. - * @param dialogRef - Reference to the dialog for closing and returning results - * @param data - Injected data containing the team to delete - * @param teamsService - Service for team operations - * @param UserService - Service for user operations - */ - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: { team: Team }, - private teamsService: TeamsService, - @Inject(UserService) private UserService - ) { - this.team = data.team; - } - - /** - * Component initialization lifecycle hook. - */ - ngOnInit(): void { - } - - /** - * Deletes the team and optionally its users if the option is selected. - */ - deleteTeam(): void { - this.deleting = true; - - this.teamsService.deleteTeam(this.team.id.toString()).subscribe({ - next: () => { - if (this.deleteAllUsers && (this.confirm.text === this.team.name)) { - this.deleteUsers(); - } else { - this.dialogRef.close(this.team); - } - }, - error: (error) => { - console.error('Error deleting team:', error); - this.deleting = false; - } - }); - } - - /** - * Cancels the deletion and closes the dialog without any action. - */ - cancel(): void { - this.dialogRef.close(); - } - - /** - * Deletes all users associated with the team. - */ - private deleteUsers(): void { - const users = this.team.users || []; - - if (users.length === 0) { - this.dialogRef.close(this.team); - return; - } - - const deletePromises: Observable[] = users.map(user => - this.UserService.deleteUser(user) - ); - - forkJoin(deletePromises).subscribe({ - next: () => { - this.dialogRef.close(this.team); - }, - error: (error) => { - console.error('Error deleting users:', error); - this.dialogRef.close(this.team); - } - }); - } -} diff --git a/web-app/admin/src/app/admin/admin-teams/team-details/team-details.component.html b/web-app/admin/src/app/admin/admin-teams/team-details/team-details.component.html deleted file mode 100644 index 36d6ba24c..000000000 --- a/web-app/admin/src/app/admin/admin-teams/team-details/team-details.component.html +++ /dev/null @@ -1,203 +0,0 @@ - - -
- - -
-
-
-
-
-
-
- -
- {{team.name}} - -
-
- -
- -
- {{team.description}} - -
-
- -
- - -
-
-
- -
-

Delete Team

-

Deleting a team will remove all team information. - This cannot - be - undone, and all team data will be unrecoverable. Users within the team will not be - deleted. -

- -
-
- -
- -
-
-
-
Team Members
-
- -
- -
- - - - - - - -
-
-
- -
-
-
{{ user.displayName }}
-
{{ user.username }}
-
-
- - {{ getUserRole(user) }} - - -
-
- -
-
-
- -
-
- -
No members for {{ team?.name }}
-
-
-
- - - -
-
-
Loading
- -
-
-
-
- -
-
-
Events for {{ team.name }}
-
- -
- -
- - - - - - - -
-
-
- -
-
-
{{ event.name }}
-
{{ event.description }}
-
-
- -
-
-
- -
-
- -
No events for {{ team?.name }}
-
-
-
- - - -
-
-
Loading
- -
-
-
-
-
-
-
-
\ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-teams/team-details/team-details.component.scss b/web-app/admin/src/app/admin/admin-teams/team-details/team-details.component.scss deleted file mode 100644 index 0151ef38d..000000000 --- a/web-app/admin/src/app/admin/admin-teams/team-details/team-details.component.scss +++ /dev/null @@ -1,649 +0,0 @@ -.page-header { - margin-bottom: 2rem; - padding-bottom: 1rem; - display: flex; - justify-content: space-between; - align-items: flex-start; - gap: 2rem; - - @media (max-width: 768px) { - flex-direction: column; - align-items: stretch; - gap: 1rem; - } - - .page-title { - flex: 1; - font-size: 2rem; - font-weight: 700; - color: #1a1a1a; - margin: 0; - line-height: 1.2; - letter-spacing: -0.025em; - } -} - -.break-word { - word-wrap: break-word !important; -} - -.header-content { - display: flex; - justify-content: space-between; - align-items: flex-start; - gap: 2rem; - - @media (max-width: 768px) { - flex-direction: column; - align-items: stretch; - gap: 1rem; - } -} - -.header-title-section { - flex: 1; - - .page-title { - font-size: 2rem; - font-weight: 700; - color: #1a1a1a; - margin: 0 0 0.5rem 0; - line-height: 1.2; - letter-spacing: -0.025em; - } - - .page-subtitle { - font-size: 1rem; - color: #666; - margin: 0; - line-height: 1.5; - font-weight: 400; - } -} - -.header-actions { - display: flex; - gap: 0.75rem; - flex-shrink: 0; - - @media (max-width: 768px) { - justify-content: center; - } -} - -.page-header, -.header-content { - flex-direction: row; - align-items: center; -} - -.page-header { - flex-wrap: nowrap; -} - -.page-header .header-title-section { - flex: 1 1 auto; - min-width: 0; -} - -.page-header .header-actions { - display: flex; - flex: 0 0 auto; - gap: 0.5rem; - align-items: center; - flex-wrap: nowrap; - white-space: nowrap; -} - -.page-header .header-actions .action-button { - flex: 0 0 auto; -} - -@media (max-width: 480px) { - .page-header .header-actions { - flex-wrap: wrap; - white-space: normal; - } -} - -.details-section { - display: grid; - grid-template-columns: 2fr 1fr; - gap: 2rem; - margin-bottom: 3rem; - - @media (max-width: 768px) { - grid-template-columns: 1fr; - gap: 1.5rem; - } -} - -.details-card { - background: white; - border-radius: 12px; - border: 1px solid #e5e7eb; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - padding: 2rem; -} - -.details-form { - .form-field { - margin-bottom: 1.5rem; - - .field-label { - display: block; - font-size: 0.875rem; - font-weight: 600; - color: #374151; - margin-bottom: 0.5rem; - text-transform: uppercase; - letter-spacing: 0.05em; - } - - .field-content { - .field-value { - font-size: 1rem; - color: #111827; - line-height: 1.5; - } - - .form-input { - width: 100%; - padding: 0.75rem 1rem; - border: 1px solid #d1d5db; - border-radius: 8px; - font-size: 0.875rem; - background-color: #f9fafb; - transition: all 0.2s ease; - - &:focus { - outline: none; - border-color: #3b82f6; - background-color: white; - box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); - } - } - } - } - - .form-actions { - display: flex; - gap: 0.75rem; - margin-top: 2rem; - } -} - -.danger-zone-card { - background: #fef2f2; - border: 1px solid #fecaca; - border-radius: 12px; - padding: 2rem; - display: flex; - flex-direction: column; - min-height: 200px; - - .danger-zone-title { - font-size: 1.125rem; - font-weight: 600; - color: #dc2626; - margin: 0 0 1rem 0; - } - - .danger-zone-description { - font-size: 0.875rem; - color: #7f1d1d; - margin: 0 0 1.5rem 0; - line-height: 1.5; - flex: 1; - } - - .action-button.btn-danger { - align-self: flex-end; - margin-top: auto; - } -} - -.sections-container { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 2rem; - - @media (max-width: 1200px) { - grid-template-columns: 1fr; - gap: 1.5rem; - } -} - -.section-card { - background: white; - border-radius: 12px; - overflow: hidden; - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); - border: 1px solid #e5e7eb; -} - -.integrated-navbar { - background-color: #f9fafb; - border-bottom: 2px solid #e5e7eb; - - mage-card-navbar { - background: transparent; - box-shadow: none; - border-radius: 0; - } -} - -.modern-table-content { - position: relative; - min-height: 300px; - max-height: 500px; - display: flex; - flex-direction: column; -} - -.table-items { - flex: 1; - overflow-y: auto; - padding: 1rem 1.5rem; -} - -.table-item { - border-bottom: 1px solid #f1f5f9; - padding: 1rem 0; - - &:last-child { - border-bottom: none; - } -} - -.item-content { - display: flex; - align-items: center; - gap: 1rem; - transition: background-color 0.2s ease; - padding: 0.5rem; - border-radius: 8px; - - &.pointer { - cursor: pointer; - - &:hover { - background-color: #f8fafc; - } - } -} - -.item-icon { - flex-shrink: 0; - width: 2.5rem; - height: 2.5rem; - display: flex; - align-items: center; - justify-content: center; - background-color: #f3f4f6; - border-radius: 8px; - color: #6b7280; - - i { - font-size: 1.25rem; - } -} - -.item-info { - flex: 1; - min-width: 0; - - .item-primary { - font-size: 0.875rem; - font-weight: 600; - color: #111827; - margin-bottom: 0.25rem; - - .item-name { - margin-right: 0.5rem; - } - - .item-username { - color: #6b7280; - font-weight: 400; - } - } - - .item-secondary { - font-size: 0.75rem; - color: #6b7280; - line-height: 1.4; - } -} - -.item-actions { - flex-shrink: 0; -} - -.modern-pagination { - padding: 1rem 1.5rem; - border-top: 1px solid #e5e7eb; - background-color: #f9fafb; - display: flex; - justify-content: flex-end; - gap: 0.5rem; -} - -.pagination-btn { - padding: 0.5rem 1rem; - border: 1px solid #d1d5db; - border-radius: 6px; - background: white; - color: #374151; - font-size: 0.875rem; - cursor: pointer; - transition: all 0.2s ease; - - &:hover:not(:disabled) { - background-color: #f9fafb; - border-color: #9ca3af; - } - - &:disabled { - opacity: 0.5; - cursor: not-allowed; - background-color: #f9fafb; - } - - i { - font-size: 0.75rem; - } -} - -.loading-overlay { - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - background-color: rgba(255, 255, 255, 0.9); - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - border-radius: 12px; -} - -.loading-content { - text-align: center; - - .loading-text { - font-size: 1.125rem; - font-weight: 600; - color: #374151; - margin-bottom: 1rem; - } - - .loading-spinner { - font-size: 2rem; - color: #3b82f6; - } -} - -.action-button { - padding: 0.75rem 1.5rem; - border: 1px solid #d1d5db; - border-radius: 8px; - background: white; - color: #374151; - font-size: 0.875rem; - font-weight: 500; - cursor: pointer; - transition: all 0.2s ease; - white-space: nowrap; - display: inline-flex; - align-items: center; - gap: 0.5rem; - - &:hover:not(:disabled) { - background-color: #f9fafb; - border-color: #9ca3af; - } - - &:focus { - outline: none; - box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); - border-color: #3b82f6; - } - - &:disabled { - opacity: 0.5; - cursor: not-allowed; - } - - &.btn-sm { - padding: 0.5rem 1rem; - font-size: 0.75rem; - } - - &.btn-primary { - background-color: #3b82f6; - border-color: #3b82f6; - color: white; - - &:hover:not(:disabled) { - background-color: #2563eb; - border-color: #2563eb; - } - } - - &.btn-danger { - background-color: #ef4444; - border-color: #ef4444; - color: white; - - &:hover:not(:disabled) { - background-color: #dc2626; - border-color: #dc2626; - } - } -} - -.mat-table-no-header { - .mat-header-row { - display: none; - } -} - -.table-row-content { - padding: 0; - border-bottom: 1px solid #f1f5f9; - - &:last-child { - border-bottom: none; - } -} - -.row-item { - display: flex; - align-items: center; - gap: 1rem; - padding: 1rem 0rem; - transition: background-color 0.2s ease; - cursor: pointer; - - &:hover { - background-color: #f8fafc; - } -} - -.row-icon { - flex-shrink: 0; - width: 2.5rem; - height: 2.5rem; - display: flex; - align-items: center; - justify-content: center; - background-color: #f3f4f6; - border-radius: 8px; - color: #6b7280; - - i { - font-size: 1.25rem; - } -} - -.row-info { - flex: 1; - min-width: 0; // Allow shrinking - - @media (max-width: 768px) { - flex: 1; - } - - .row-primary { - font-size: 0.875rem; - font-weight: 600; - color: #111827; - margin-bottom: 0.25rem; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - max-width: 12rem; - } - - .row-secondary { - font-size: 0.75rem; - color: #6b7280; - line-height: 1.4; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - max-width: 12rem; - } -} - -.row-actions { - flex: 0 0 auto; - min-width: fit-content; -} - -.section-table-title { - font-size: 1rem; - font-weight: 600; - padding: 1rem 1.5rem 0.5rem 1.5rem; - color: #111827; -} - -.table-wrapper { - --row-height: 73px; - --min-page-size: 5; - --base-table-height: calc(var(--row-height) * var(--min-page-size)); - - display: flex; - flex-direction: column; - position: relative; -} - -.table-scroll { - height: var(--base-table-height); - max-height: var(--base-table-height); - overflow-y: auto; - overflow-x: hidden; - -webkit-overflow-scrolling: touch; - overscroll-behavior: contain; - border-bottom: 1px solid #e5e7eb; -} - -.table-wrapper .mat-table { - display: table; - width: 100%; - height: auto; - overflow: visible; -} - -.table-wrapper mat-paginator { - flex-shrink: 0; - border-top: 1px solid #e5e7eb; - background: #f9fafb; -} - -.empty-state { - display: flex; - align-items: center; - justify-content: center; - padding: 3rem 2rem; - min-height: 200px; - - .empty-state-content { - text-align: center; - - .empty-state-icon { - font-size: 3rem; - color: #9ca3af; - margin-bottom: 1rem; - display: block; - } - - .empty-state-text { - font-size: 1.1rem; - color: #6b7280; - font-weight: 500; - } - } -} - -// Role display and editing styles -.row-role { - flex-shrink: 0; - display: flex; - align-items: center; - margin-left: auto; // Push to the right - margin-right: 0.5rem; // Add some space before row-actions - - .user-role-badge { - display: inline-block; - padding: 0.2rem 0.5rem; - border-radius: 0.25rem; - font-size: 0.75rem; - font-weight: 600; - text-transform: uppercase; - letter-spacing: 0.025em; - - // Default styling - background-color: #f3f4f6; - color: #6b7280; - - // Role-specific colors can be added via ngClass in template - &.role-owner { - background-color: #fef3c7; - color: #d97706; - } - - &.role-manager { - background-color: #dbeafe; - color: #2563eb; - } - - &.role-guest { - background-color: #f3f4f6; - color: #6b7280; - } - } - - .role-select { - padding: 0.25rem 0.5rem; - border: 1px solid #d1d5db; - border-radius: 0.375rem; - background-color: #ffffff; - font-size: 0.875rem; - color: #374151; - cursor: pointer; - min-width: 120px; - - &:focus { - outline: none; - border-color: #3b82f6; - box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); - } - - &:hover { - border-color: #9ca3af; - } - } -} \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-teams/team-details/team-details.component.spec.ts b/web-app/admin/src/app/admin/admin-teams/team-details/team-details.component.spec.ts deleted file mode 100644 index dc9641ed7..000000000 --- a/web-app/admin/src/app/admin/admin-teams/team-details/team-details.component.spec.ts +++ /dev/null @@ -1,518 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatDialog } from '@angular/material/dialog'; -import { MatTableDataSource } from '@angular/material/table'; -import { PageEvent } from '@angular/material/paginator'; -import { StateService } from '@uirouter/angular'; -import { of, throwError } from 'rxjs'; - -import { TeamDetailsComponent } from './team-details.component'; -import { TeamsService } from '../teams-service'; -import { EventsService } from '../../admin-event/events.service'; -import { UserService } from '../../../upgrade/ajs-upgraded-providers'; -import { Team } from '../team'; -import { User } from '@ngageoint/mage.web-core-lib/user'; -import { Event } from 'src/app/filter/filter.types'; -import { DeleteTeamComponent } from '../delete-team/delete-team.component'; -import { SearchModalComponent } from '../../../core/search-modal/search-modal.component'; - -describe('TeamDetailsComponent', () => { - let component: TeamDetailsComponent; - let fixture: ComponentFixture; - let mockStateService: jasmine.SpyObj; - let mockDialog: jasmine.SpyObj; - let mockUserService: jasmine.SpyObj; - let mockTeamsService: jasmine.SpyObj; - let mockEventsService: jasmine.SpyObj; - - const mockTeam: Team = { - id: 'team123' as any, - name: 'Test Team', - description: 'Test Description', - teamEventId: 'event123', - users: ['user1', 'user2'] as any, - acl: { - 'user123': { - permissions: ['update', 'delete'] - } - } as any - }; - - const mockUser: User = { - id: 'user123', - username: 'testuser', - displayName: 'Test User', - email: 'test@example.com', - role: { - permissions: ['UPDATE_TEAM', 'DELETE_TEAM'] - } - } as any; - - const mockEvent: Event = { - id: 'event123', - name: 'Test Event', - description: 'Test Event Description' - } as any; - - beforeEach(async () => { - mockStateService = jasmine.createSpyObj('StateService', ['go'], { - params: { teamId: 'team123' } - }); - - mockDialog = jasmine.createSpyObj('MatDialog', ['open']); - - mockUserService = { - myself: mockUser - }; - - mockTeamsService = jasmine.createSpyObj('TeamsService', [ - 'getTeamById', - 'getMembers', - 'getNonMembers', - 'addUserToTeam', - 'removeMember', - 'editTeam' - ]); - - mockEventsService = jasmine.createSpyObj('EventsService', [ - 'getEvents', - 'addTeamToEvent', - 'removeEventFromTeam' - ]); - - await TestBed.configureTestingModule({ - declarations: [TeamDetailsComponent], - providers: [ - { provide: StateService, useValue: mockStateService }, - { provide: MatDialog, useValue: mockDialog }, - { provide: UserService, useValue: mockUserService }, - { provide: TeamsService, useValue: mockTeamsService }, - { provide: EventsService, useValue: mockEventsService } - ] - }).compileComponents(); - - fixture = TestBed.createComponent(TeamDetailsComponent); - component = fixture.componentInstance; - }); - - describe('Component Initialization', () => { - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should initialize with default values', () => { - expect(component.hasUpdatePermission).toBeFalse(); - expect(component.hasDeletePermission).toBeFalse(); - expect(component.editingDetails).toBeFalse(); - expect(component.loadingMembers).toBeTrue(); - expect(component.loadingEvents).toBeTrue(); - expect(component.membersPageIndex).toBe(0); - expect(component.membersPageSize).toBe(5); - expect(component.totalMembers).toBe(0); - expect(component.eventsPageSize).toBe(5); - expect(component.totalEvents).toBe(0); - expect(component.membersDataSource).toBeInstanceOf(MatTableDataSource); - expect(component.eventsDataSource).toBeInstanceOf(MatTableDataSource); - }); - }); - - describe('ngOnInit', () => { - beforeEach(() => { - mockTeamsService.getTeamById.and.returnValue(of(mockTeam)); - mockTeamsService.getMembers.and.returnValue(of({ - items: [mockUser], - totalCount: 1 - })); - mockEventsService.getEvents.and.returnValue(of({ - items: [mockEvent], - totalCount: 1 - })); - }); - - it('should load team data on init', () => { - component.ngOnInit(); - - expect(mockTeamsService.getTeamById).toHaveBeenCalledWith('team123'); - expect(component.team).toEqual(mockTeam); - expect(component.teamId).toBe('team123'); - }); - - it('should set permissions correctly for users with role permissions', () => { - component.ngOnInit(); - - expect(component.hasUpdatePermission).toBeTrue(); - expect(component.hasDeletePermission).toBeTrue(); - }); - - it('should set permissions correctly for users with ACL permissions', () => { - mockUserService.myself = { - ...mockUser, - id: 'user123', - role: { permissions: [] } - }; - - component.ngOnInit(); - - expect(component.hasUpdatePermission).toBeTrue(); - expect(component.hasDeletePermission).toBeTrue(); - }); - - it('should deny permissions for users without access', () => { - mockUserService.myself = { - ...mockUser, - id: 'user456', - role: { permissions: [] } - }; - - const teamWithoutAcl = { ...mockTeam, acl: {} }; - mockTeamsService.getTeamById.and.returnValue(of(teamWithoutAcl)); - - component.ngOnInit(); - - expect(component.hasUpdatePermission).toBeFalse(); - expect(component.hasDeletePermission).toBeFalse(); - }); - - it('should call getMembers and getTeamEvents after loading team', () => { - spyOn(component, 'getMembers'); - spyOn(component, 'getTeamEvents'); - - component.ngOnInit(); - - expect(component.getMembers).toHaveBeenCalled(); - expect(component.getTeamEvents).toHaveBeenCalled(); - }); - }); - - describe('getMembers', () => { - beforeEach(() => { - component.team = mockTeam; - }); - - it('should fetch members successfully', () => { - const mockResponse = { - items: [mockUser], - totalCount: 1 - }; - mockTeamsService.getMembers.and.returnValue(of(mockResponse)); - - component.getMembers(); - - expect(mockTeamsService.getMembers).toHaveBeenCalledWith({ - id: mockTeam.id, - term: component.memberSearchTerm, - page: component.membersPageIndex, - page_size: component.membersPageSize - }); - expect(component.loadingMembers).toBeFalse(); - expect(component.membersDataSource.data).toEqual([mockUser]); - expect(component.totalMembers).toBe(1); - }); - - it('should handle error when fetching members', () => { - spyOn(console, 'error'); - mockTeamsService.getMembers.and.returnValue(throwError('Error')); - - component.getMembers(); - - expect(component.loadingMembers).toBeFalse(); - expect(component.membersDataSource.data).toEqual([]); - expect(component.totalMembers).toBe(0); - expect(console.error).toHaveBeenCalledWith('Error fetching members:', 'Error'); - }); - - it('should return early if team is not loaded', () => { - component.team = null as any; - - component.getMembers(); - - expect(mockTeamsService.getMembers).not.toHaveBeenCalled(); - }); - }); - - describe('getTeamEvents', () => { - beforeEach(() => { - component.teamId = 'team123'; - }); - - it('should fetch team events successfully', () => { - const mockResponse = { - items: [mockEvent], - totalCount: 1 - }; - mockEventsService.getEvents.and.returnValue(of(mockResponse)); - - component.getTeamEvents(); - - expect(mockEventsService.getEvents).toHaveBeenCalledWith({ - term: component.teamEventSearch, - teamId: component.teamId, - page: component.teamEventsPage, - page_size: component.eventsPerPage - }); - expect(component.loadingEvents).toBeFalse(); - expect(component.teamEvents).toEqual([mockEvent]); - expect(component.eventsDataSource.data).toEqual([mockEvent]); - expect(component.totalEvents).toBe(1); - }); - }); - - describe('Pagination', () => { - it('should handle members page change', () => { - spyOn(component, 'getMembers'); - const pageEvent: PageEvent = { - pageIndex: 1, - pageSize: 10, - length: 20 - }; - - component.onMembersPageChange(pageEvent); - - expect(component.membersPageSize).toBe(10); - expect(component.membersPageIndex).toBe(1); - expect(component.getMembers).toHaveBeenCalled(); - }); - - it('should handle events page change', () => { - spyOn(component, 'getTeamEvents'); - const pageEvent: PageEvent = { - pageIndex: 2, - pageSize: 5, - length: 15 - }; - - component.onEventsPageChange(pageEvent); - - expect(component.eventsPageSize).toBe(5); - expect(component.teamEventsPage).toBe(2); - expect(component.getTeamEvents).toHaveBeenCalled(); - }); - }); - - describe('Search Functionality', () => { - it('should handle members search change', () => { - spyOn(component, 'getMembers'); - - component.onMembersSearchChange('test search'); - - expect(component.membersPageIndex).toBe(0); - expect(component.memberSearchTerm).toBe('test search'); - expect(component.getMembers).toHaveBeenCalled(); - }); - - it('should handle empty search term for members', () => { - spyOn(component, 'getMembers'); - - component.onMembersSearchChange(); - - expect(component.memberSearchTerm).toBe(''); - expect(component.getMembers).toHaveBeenCalled(); - }); - - it('should handle team events search change', () => { - spyOn(component, 'getTeamEvents'); - - component.onTeamEventSearchChange('event search'); - - expect(component.teamEventsPage).toBe(0); - expect(component.teamEventSearch).toBe('event search'); - expect(component.getTeamEvents).toHaveBeenCalled(); - }); - }); - - describe('Team Details Editing', () => { - beforeEach(() => { - component.team = mockTeam; - }); - - it('should toggle edit details mode', () => { - component.toggleEditDetails(); - - expect(component.editingDetails).toBeTrue(); - expect(component.editForm.name).toBe(mockTeam.name); - expect(component.editForm.description).toBe(mockTeam.description); - }); - - it('should save team details', () => { - const updatedTeam = { ...mockTeam, name: 'Updated Team' }; - mockTeamsService.editTeam.and.returnValue(of(updatedTeam)); - - component.editForm.name = 'Updated Team'; - component.editForm.description = 'Updated Description'; - component.editingDetails = true; - - component.saveTeamDetails(); - - expect(mockTeamsService.editTeam).toHaveBeenCalledWith(mockTeam.id, { - name: 'Updated Team', - description: 'Updated Description' - }); - expect(component.team).toEqual(updatedTeam); - expect(component.editingDetails).toBeFalse(); - }); - - it('should cancel edit details', () => { - component.editingDetails = true; - component.editForm.name = 'Changed Name'; - - component.cancelEditDetails(); - - expect(component.editingDetails).toBeFalse(); - expect(component.editForm.name).toBe(mockTeam.name); - expect(component.editForm.description).toBe(mockTeam.description); - }); - }); - - describe('Navigation', () => { - it('should navigate to teams page', () => { - component.goToTeams(); - - expect(mockStateService.go).toHaveBeenCalledWith('admin.teams'); - }); - - it('should navigate to user profile', () => { - component.goToUserProfile(mockUser); - - expect(mockStateService.go).toHaveBeenCalledWith('admin.user', { userId: mockUser.id }); - }); - - it('should navigate to team access page', () => { - component.team = mockTeam; - - component.goToAccess(); - - expect(mockStateService.go).toHaveBeenCalledWith('admin.teamAccess', { teamId: mockTeam.id }); - }); - - it('should navigate to event page', () => { - component.goToEventPage(mockEvent); - - expect(mockStateService.go).toHaveBeenCalledWith('admin.event', { eventId: mockEvent.id }); - }); - }); - - describe('Member Management', () => { - beforeEach(() => { - component.team = mockTeam; - }); - - it('should open add member dialog', () => { - const dialogRef = { afterClosed: () => of({ selectedItem: mockUser }) }; - mockDialog.open.and.returnValue(dialogRef as any); - mockTeamsService.addUserToTeam.and.returnValue(of({})); - spyOn(component, 'getMembers'); - - component.addMember(); - - expect(mockDialog.open).toHaveBeenCalledWith(SearchModalComponent, jasmine.any(Object)); - expect(mockTeamsService.addUserToTeam).toHaveBeenCalledWith(mockTeam.id, mockUser); - expect(component.getMembers).toHaveBeenCalled(); - }); - - it('should remove member from team', () => { - const mockEvent = new MouseEvent('click'); - spyOn(mockEvent, 'stopPropagation'); - mockTeamsService.removeMember.and.returnValue(of({})); - spyOn(component, 'getMembers'); - - component.removeMember(mockEvent, mockUser); - - expect(mockEvent.stopPropagation).toHaveBeenCalled(); - expect(mockTeamsService.removeMember).toHaveBeenCalledWith(mockTeam.id, mockUser.id); - expect(component.getMembers).toHaveBeenCalled(); - }); - - it('should handle error when removing member', () => { - const mockEvent = new MouseEvent('click'); - spyOn(mockEvent, 'stopPropagation'); - spyOn(console, 'error'); - mockTeamsService.removeMember.and.returnValue(throwError('Error removing member')); - - component.removeMember(mockEvent, mockUser); - - expect(console.error).toHaveBeenCalledWith('Error removing member:', 'Error removing member'); - }); - }); - - describe('Event Management', () => { - beforeEach(() => { - component.team = mockTeam; - }); - - it('should open add event dialog', () => { - const dialogRef = { afterClosed: () => of({ selectedItem: mockEvent }) }; - mockDialog.open.and.returnValue(dialogRef as any); - mockEventsService.addTeamToEvent.and.returnValue(of(mockEvent)); - spyOn(component, 'getTeamEvents'); - - component.addEventToTeam(); - - expect(mockDialog.open).toHaveBeenCalledWith(SearchModalComponent, jasmine.any(Object)); - expect(mockEventsService.addTeamToEvent).toHaveBeenCalledWith(mockEvent.id.toString(), mockTeam); - expect(component.getTeamEvents).toHaveBeenCalled(); - }); - - it('should handle error when adding event to team', () => { - const dialogRef = { afterClosed: () => of({ selectedItem: mockEvent }) }; - mockDialog.open.and.returnValue(dialogRef as any); - spyOn(console, 'error'); - mockEventsService.addTeamToEvent.and.returnValue(throwError('Error adding event')); - - component.addEventToTeam(); - - expect(console.error).toHaveBeenCalledWith('Error adding event to team:', 'Error adding event'); - }); - - it('should remove event from team', () => { - const mockClickEvent = new MouseEvent('click'); - spyOn(mockClickEvent, 'stopPropagation'); - mockEventsService.removeEventFromTeam.and.returnValue(of(undefined)); - spyOn(component, 'getTeamEvents'); - - component.removeEventFromTeam(mockClickEvent, mockEvent); - - expect(mockClickEvent.stopPropagation).toHaveBeenCalled(); - expect(mockEventsService.removeEventFromTeam).toHaveBeenCalledWith( - mockEvent.id.toString(), - mockTeam.id.toString() - ); - expect(component.getTeamEvents).toHaveBeenCalled(); - }); - - it('should handle error when removing event from team', () => { - const mockClickEvent = new MouseEvent('click'); - spyOn(mockClickEvent, 'stopPropagation'); - spyOn(console, 'error'); - mockEventsService.removeEventFromTeam.and.returnValue(throwError('Error removing event')); - - component.removeEventFromTeam(mockClickEvent, mockEvent); - - expect(console.error).toHaveBeenCalledWith('Error removing event:', 'Error removing event'); - }); - }); - - describe('Team Deletion', () => { - it('should open delete team dialog and navigate on success', () => { - component.team = mockTeam; - const dialogRef = { afterClosed: () => of(true) }; - mockDialog.open.and.returnValue(dialogRef as any); - - component.deleteTeam(); - - expect(mockDialog.open).toHaveBeenCalledWith(DeleteTeamComponent, { - data: { team: mockTeam } - }); - expect(mockStateService.go).toHaveBeenCalledWith('admin.teams'); - }); - - it('should not navigate if dialog is cancelled', () => { - component.team = mockTeam; - const dialogRef = { afterClosed: () => of(false) }; - mockDialog.open.and.returnValue(dialogRef as any); - - component.deleteTeam(); - - expect(mockStateService.go).not.toHaveBeenCalled(); - }); - }); - -}); diff --git a/web-app/admin/src/app/admin/admin-teams/team-details/team-details.component.ts b/web-app/admin/src/app/admin/admin-teams/team-details/team-details.component.ts deleted file mode 100644 index da0c48ac6..000000000 --- a/web-app/admin/src/app/admin/admin-teams/team-details/team-details.component.ts +++ /dev/null @@ -1,512 +0,0 @@ -import { Component, Inject, OnInit } from '@angular/core'; -import { StateService } from '@uirouter/angular'; -import { MatDialog } from '@angular/material/dialog'; -import { PageEvent } from '@angular/material/paginator'; -import { MatTableDataSource } from '@angular/material/table'; -import { UserService } from '../../../upgrade/ajs-upgraded-providers'; -import { TeamsService } from '../teams-service'; -import { EventsService } from '../../admin-event/events.service'; -import { Team } from '../team'; -import { User } from '@ngageoint/mage.web-core-lib/user'; -import { Event } from 'src/app/filter/filter.types'; -import { DeleteTeamComponent } from '../delete-team/delete-team.component'; -import { CardActionButton } from '../../../core/card-navbar/card-navbar.component'; -import { SearchModalComponent, SearchModalData, SearchModalResult, SearchModalColumn } from '../../../core/search-modal/search-modal.component'; -import { Observable } from 'rxjs'; -import { AdminBreadcrumb } from '../../admin-breadcrumb/admin-breadcrumb.model'; - -/** - * Component for displaying and managing team details in the admin interface. - * Provides functionality for viewing team information, managing team members, - * associating events with teams, and editing team properties. - */ -@Component({ - selector: 'mage-team-details', - templateUrl: './team-details.component.html', - styleUrls: ['./team-details.component.scss'] -}) -export class TeamDetailsComponent implements OnInit { - team: Team; - teamId: string; - hasUpdatePermission = false; - hasDeletePermission = false; - editingDetails = false; - editingMembers = false; - editingEvents = false; - editForm = { - name: '', - description: '' - }; - loadingMembers = true; - membersPageIndex = 0; - membersPageSize = 5; - memberSearchTerm: string; - membersDataSource = new MatTableDataSource(); - membersDisplayedColumns = ['content']; - totalMembers = 0; - pageSizeOptions = [5, 10, 25]; - - loadingEvents = true; - teamEvents: Event[] = []; - teamEventsPage = 0; - eventsPerPage = 5; - eventSearch: string; - teamEventSearch: string; - filteredEvents: Event[] = []; - - eventsDataSource = new MatTableDataSource(); - eventsDisplayedColumns = ['content']; - totalEvents = 0; - eventsPageSize = 5; - - actionButtons: CardActionButton[] = []; - memberActionButtons: CardActionButton[] = []; - eventActionButtons: CardActionButton[] = []; - - breadcrumbs: AdminBreadcrumb[] = [{ - title: 'Teams', - iconClass: 'fa fa-users', - state: {name: "admin.teams"} - }] - - /** - * Configures buttons for main team actions, member management, and event management. - */ - private updateActionButtons(): void { - this.actionButtons = []; - this.memberActionButtons = []; - this.eventActionButtons = []; - - if (this.hasUpdatePermission) { - this.actionButtons.push({ - label: this.editingDetails ? 'Cancel' : 'Edit', - action: () => this.toggleEditDetails(), - type: this.editingDetails ? 'btn-primary' : 'btn-secondary' - }); - - this.memberActionButtons.push({ - label: this.editingMembers ? 'Done' : 'Edit Members', - action: () => this.toggleEditRoles(), - type: this.editingMembers ? 'btn-primary' : 'btn-secondary' - }); - - this.memberActionButtons.push({ - label: 'Add Member', - action: () => this.addMember(), - type: 'btn-secondary' - }); - - this.eventActionButtons.push({ - label: this.editingEvents ? 'Done' : 'Edit Events', - action: () => this.toggleEditEvents(), - type: this.editingEvents ? 'btn-primary' : 'btn-secondary' - }); - - this.eventActionButtons.push({ - label: 'Add Event', - action: () => this.addEventToTeam(), - type: 'btn-secondary' - }); - } - } - - /** - * Component constructor. Injects required services for team management. - */ - constructor( - private stateService: StateService, - private dialog: MatDialog, - @Inject(UserService) private UserService, - @Inject(TeamsService) private teamService: TeamsService, - @Inject(EventsService) private eventsService: EventsService - ) { } - - /** - * Retrieves team ID from route parameters, loads team data, - * sets up permissions, and initializes members and events data. - */ - ngOnInit(): void { - this.teamId = this.stateService.params.teamId; - if (this.teamId) { - this.teamService.getTeamById(this.teamId).subscribe((team: Team) => { - this.team = team; - - const myAccess = this.team.acl[this.UserService.myself.id]; - const aclPermissions = myAccess ? myAccess.permissions : []; - - this.hasUpdatePermission = this.UserService.myself.role.permissions.includes('UPDATE_TEAM') || aclPermissions.includes('update'); - this.hasDeletePermission = this.UserService.myself.role.permissions.includes('DELETE_TEAM') || aclPermissions.includes('delete'); - - this.updateActionButtons(); - this.getMembers(); - this.getTeamEvents(); - this.breadcrumbs.push({title: this.team.name}) - }); - } - } - - /** - * Fetches team members with pagination and search filtering. - */ - getMembers(): void { - if (!this.team?.id) { - return; - } - - this.teamService.getMembers({ - id: this.team.id, - term: this.memberSearchTerm, - page: this.membersPageIndex, - page_size: this.membersPageSize - }).subscribe({ - next: (results) => { - this.loadingMembers = false; - this.membersDataSource.data = results.items || []; - this.totalMembers = results.totalCount || 0; - }, - error: (error) => { - this.loadingMembers = false; - console.error('Error fetching members:', error); - this.membersDataSource.data = []; - this.totalMembers = 0; - } - }); - } - - /** - * Fetches events associated with this team with pagination and search filtering. - */ - getTeamEvents(): void { - this.eventsService.getEvents({ - term: this.teamEventSearch, - teamId: this.teamId, - page: this.teamEventsPage, - page_size: this.eventsPerPage - }).subscribe((results) => { - this.loadingEvents = false; - this.teamEvents = results.items || []; - this.eventsDataSource.data = results.items || []; - this.totalEvents = results.totalCount || 0; - }); - } - - /** - * Handles pagination changes for the members table. - * @param event - Material paginator event containing new page - */ - onMembersPageChange(event: PageEvent): void { - this.membersPageSize = event.pageSize; - this.membersPageIndex = event.pageIndex; - this.getMembers(); - } - - /** - * Handles search term changes for members filtering. - * @param searchTerm - The search term to filter members - */ - onMembersSearchChange(searchTerm: string = ''): void { - this.membersPageIndex = 0; - this.memberSearchTerm = searchTerm; - this.getMembers(); - } - - /** - * Toggles the editing state for team details. - */ - toggleEditDetails(): void { - if (!this.editingDetails) { - this.editForm.name = this.team.name; - this.editForm.description = this.team.description; - } - this.editingDetails = !this.editingDetails; - this.updateActionButtons(); - } - - /** - * Saves the edited team details. - */ - saveTeamDetails(): void { - const name = this.editForm.name; - const description = this.editForm.description; - - this.teamService.editTeam(this.team.id, { - name: name, - description: description - }).subscribe((updatedTeam: Team) => { - this.team = updatedTeam; - this.editingDetails = false; - this.updateActionButtons(); - }); - } - - /** - * Cancels the editing of team details. - */ - cancelEditDetails(): void { - this.editingDetails = false; - this.updateActionButtons(); - - this.editForm.name = this.team?.name; - this.editForm.description = this.team?.description; - } - - /** - * Navigates back to the teams list page. - */ - goToTeams(): void { - this.stateService.go('admin.teams'); - } - - /** - * Opens a search modal to add new members to the team. - */ - addMember(): void { - const dialogRef = this.dialog.open(SearchModalComponent, { - panelClass: 'search-modal-dialog', - data: { - title: 'Add Members to Team', - searchPlaceholder: 'Search for users to add...', - type: 'members', - teamId: this.team?.id, - searchFunction: (searchTerm: string, page: number, pageSize: number): Observable => { - return this.teamService.getNonMembers({ - id: this.team?.id || '', - term: searchTerm, - page: page, - page_size: pageSize - }); - }, - columns: [ - { - key: 'name', - label: 'Name', - displayFunction: (user: User) => user.username || 'Unknown', - width: '40%' - }, - { - key: 'displayName', - label: 'Display Name', - displayFunction: (user: User) => user.displayName || 'Unknown', - width: '35%' - }, - { - key: 'email', - label: 'Email', - displayFunction: (user: User) => user.email || 'No email provided', - width: '35%' - } - ] as SearchModalColumn[] - } as SearchModalData - }); - - dialogRef.afterClosed().subscribe((result: SearchModalResult) => { - if (result && result.selectedItem) { - console.log('Selected user to add:', result.selectedItem); - this.teamService.addUserToTeam(this.team.id, result.selectedItem).subscribe({ - next: () => { - this.getMembers(); - this.team.users.push(result.selectedItem); - } - }); - } - }); - } - - /** - * Removes a member from the team. - * @param $event - The mouse event - * @param user - The user to remove from the team - */ - removeMember($event: MouseEvent, user: User): void { - $event.stopPropagation(); - this.teamService.removeMember(this.team.id, user.id).subscribe({ - next: () => { - this.getMembers(); - this.team.users = this.team.users.filter(u => u.id !== user.id); - }, - error: (error) => { - console.error('Error removing member:', error); - } - }); - } - - /** - * Navigates to the user profile page for the specified user. - * @param user - The user to view - */ - goToUserProfile(user: User): void { - this.stateService.go('admin.user', { userId: user.id }); - } - - /** - * Navigates to the team access control page. - */ - goToAccess(): void { - this.stateService.go('admin.teamAccess', { teamId: this.team.id }); - } - - /** - * Toggles the editing state for user roles. - */ - toggleEditRoles(): void { - this.editingMembers = !this.editingMembers; - this.updateActionButtons(); - } - - /** - * Toggles the editing state for events. - */ - toggleEditEvents(): void { - this.editingEvents = !this.editingEvents; - this.updateActionButtons(); - } - - /** - * Gets the role of a user in the current team. - * @param user - The user to get the role for - * @returns The user's role in the team or 'GUEST' as default - */ - getUserRole(user: User): string { - const userAcl = this.team?.acl[user.id]; - return userAcl?.role || 'GUEST'; - } - - /** - * Gets the CSS class for a user's role badge. - * @param user - The user to get the role class for - * @returns The CSS class for the role badge - */ - getRoleClass(user: User): string { - const role = this.getUserRole(user); - return `user-role-badge role-${role.toLowerCase()}`; - } - - /** - * Updates a user's role in the team. - * @param user - The user whose role to update - * @param event - The change event containing the new role - */ - updateUserRole(user: User, event: any): void { - const newRole = event.target.value; - console.log(`Updating user ${user.displayName} role to ${newRole}`); - - this.teamService.updateUserRole(this.team.id, user.id, newRole).subscribe({ - next: (updatedTeam: Team) => { - this.team = updatedTeam; - this.getMembers(); - }, - error: (error) => { - console.error('Error updating user role:', error); - } - }); - } - - /** - * Opens a search modal to add an event to the team. - */ - addEventToTeam(): void { - const dialogRef = this.dialog.open(SearchModalComponent, { - panelClass: 'search-modal-dialog', - data: { - title: 'Add Events to Team', - searchPlaceholder: 'Search for events to add...', - type: 'events', - searchFunction: (searchTerm: string, page: number, pageSize: number): Observable => { - return this.eventsService.getEvents({ - term: searchTerm, - page: page, - page_size: pageSize, - excludeTeamId: this.team.id - }); - }, - columns: [ - { - key: 'name', - label: 'Event Name', - displayFunction: (event: any) => event.name || 'Unnamed Event', - width: '50%' - }, - { - key: 'description', - label: 'Description', - displayFunction: (event: any) => event.description || 'No description', - width: '50%' - } - ] as SearchModalColumn[] - } as SearchModalData - }); - - dialogRef.afterClosed().subscribe((result: SearchModalResult) => { - if (result && result.selectedItem) { - this.eventsService.addTeamToEvent(result.selectedItem.id.toString(), this.team).subscribe({ - next: () => { - this.getTeamEvents(); - }, - error: (error) => { - console.error('Error adding event to team:', error); - } - }); - } - }); - } - - /** - * Removes an event from the team. - * @param $event - The mouse event - * @param event - The event to remove from the team - */ - removeEventFromTeam($event: MouseEvent, event: Event): void { - $event.stopPropagation(); - this.eventsService.removeEventFromTeam(event.id.toString(), this.team.id.toString()).subscribe({ - next: () => { - this.getTeamEvents(); - }, - error: (error) => { - console.error('Error removing event:', error); - } - }); - } - - /** - * Navigates to the event details page for the specified event. - * @param event - The event whose details to view - */ - goToEventPage(event: Event): void { - this.stateService.go('admin.event', { eventId: event.id }); - } - - /** - * Opens a confirmation dialog to delete the team. - */ - deleteTeam(): void { - const dialogRef = this.dialog.open(DeleteTeamComponent, { - data: { team: this.team } - }); - - dialogRef.afterClosed().subscribe(result => { - if (result) { - this.stateService.go('admin.teams'); - } - }); - } - - /** - * Handles pagination changes for the events table. - * @param event - Material paginator event containing new page - */ - onEventsPageChange(event: PageEvent): void { - this.eventsPageSize = event.pageSize; - this.teamEventsPage = event.pageIndex; - this.getTeamEvents(); - } - - /** - * Handles search term changes for team events filtering. - * @param searchTerm - The search term to filter events - */ - onTeamEventSearchChange(searchTerm?: string): void { - this.teamEventsPage = 0; - this.teamEventSearch = searchTerm; - this.getTeamEvents(); - } -} diff --git a/web-app/admin/src/app/admin/admin-teams/team.d.ts b/web-app/admin/src/app/admin/admin-teams/team.d.ts deleted file mode 100644 index b85a60a81..000000000 --- a/web-app/admin/src/app/admin/admin-teams/team.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { ObjectId } from 'mongodb'; - -export interface Team { - id: ObjectId; - name: string; - description: string; - teamEventId: number | string; - users: ObjectId[]; - acl: Records; - permissions?: string[]; -} - -export interface TeamAcl { - [userId: string]: { - role: 'OWNER' | 'MANAGER' | 'GUEST'; - permissions: string[]; - }; -} - -export type TeamMemberRole = 'OWNER' | 'MANAGER' | 'GUEST'; \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-teams/teams-service.ts b/web-app/admin/src/app/admin/admin-teams/teams-service.ts deleted file mode 100644 index ead560995..000000000 --- a/web-app/admin/src/app/admin/admin-teams/teams-service.ts +++ /dev/null @@ -1,176 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient, HttpParams } from '@angular/common/http'; -import { Observable } from 'rxjs'; -import { Team } from './team'; -import { User } from '@ngageoint/mage.web-core-lib/user'; - -export interface SearchOptions { - populate?: boolean; - limit?: number; - sort?: { [key: string]: 1 | -1 }; - omit_event_teams?: boolean; - term?: string; - start?: string; - id?: string; - with_members?: string[]; - without_members?: string[]; -} - -export interface membersOptions extends SearchOptions { - page?: number; - page_size?: number; -} - -interface membersResponse { - pageSize?: number; - page?: number; - items: User[]; - totalCount?: number; -} - -@Injectable({ - providedIn: 'root' -}) -export class TeamsService { - - constructor(private http: HttpClient) { } - - getTeams(options: SearchOptions): Observable { - let params = new HttpParams(); - - if (options.populate !== undefined) { - params = params.set('populate', String(options.populate)); - } - if (options.limit !== undefined) { - params = params.set('limit', String(options.limit)); - } - if (options.sort !== undefined) { - params = params.set('sort', JSON.stringify(options.sort)); - } - if (options.omit_event_teams !== undefined) { - params = params.set('omit_event_teams', String(options.omit_event_teams)); - } - if (options.term !== undefined) { - params = params.set('term', options.term); - } - if (options.start !== undefined) { - params = params.set('start', options.start); - } - if (options.with_members && options.with_members.length) { - for (const m of options.with_members) { - params = params.append('with_members', m); - } - } - if (options.without_members && options.without_members.length) { - for (const m of options.without_members) { - params = params.append('without_members', m); - } - } - - return this.http.get('/api/teams', { params }); - } - - createTeam(teamData: Partial): Observable { - return this.http.post('/api/teams', teamData); - } - - editTeam(id: string, teamData: Partial): Observable { - return this.http.put(`/api/teams/${id}`, teamData); - } - - getTeamById(id: string): Observable { - return this.http.get(`/api/teams/${id}`); - } - - getMembers(options: membersOptions): Observable { - let params = new HttpParams(); - - if (options.populate !== undefined) { - params = params.set('populate', String(options.populate)); - } - if (options.limit !== undefined) { - params = params.set('limit', String(options.limit)); - } - if (options.sort !== undefined) { - params = params.set('sort', JSON.stringify(options.sort)); - } - if (options.omit_event_teams !== undefined) { - params = params.set('omit_event_teams', String(options.omit_event_teams)); - } - if (options.term !== undefined) { - params = params.set('term', options.term); - } - if (options.start !== undefined) { - params = params.set('start', options.start); - } - if (options.page !== undefined) { - params = params.set('page', String(options.page)); - } - if (options.page_size !== undefined) { - params = params.set('page_size', String(options.page_size)); - } - - // Always request total count for pagination - params = params.set('total', 'true'); - - return this.http.get(`/api/teams/${options.id}/members`, { params }); - } - - getNonMembers(options: membersOptions): Observable { - let params = new HttpParams(); - - if (options.populate !== undefined) { - params = params.set('populate', String(options.populate)); - } - if (options.limit !== undefined) { - params = params.set('limit', String(options.limit)); - } - if (options.sort !== undefined) { - params = params.set('sort', JSON.stringify(options.sort)); - } - if (options.omit_event_teams !== undefined) { - params = params.set('omit_event_teams', String(options.omit_event_teams)); - } - if (options.term !== undefined) { - params = params.set('term', options.term); - } - if (options.start !== undefined) { - params = params.set('start', options.start); - } - if (options.page !== undefined) { - params = params.set('page', String(options.page)); - } - if (options.page_size !== undefined) { - params = params.set('page_size', String(options.page_size)); - } - - // Always request total count for pagination - params = params.set('total', 'true'); - - return this.http.get(`/api/teams/${options.id}/nonMembers`, { params }); - } - - deleteTeam(id: string): Observable { - return this.http.delete(`/api/teams/${id}`); - } - - addUserToTeam(teamId: string, user: User): Observable { - return this.http.post(`/api/teams/${teamId}/users`, user); - } - - removeMember(teamId: string, userId: string): Observable { - return this.http.delete(`/api/teams/${teamId}/users/${userId}`); - } - - /** - * Updates a user's role in a team. - * - * @param teamId - The ID of the team - * @param userId - The ID of the user - * @param role - The new role for the user ('OWNER', 'MANAGER', or 'GUEST') - * @returns Observable that will emit the updated team - */ - updateUserRole(teamId: string, userId: string, role: string): Observable { - return this.http.put(`/api/teams/${teamId}/acl/${userId}`, { role }); - } -} diff --git a/web-app/admin/src/app/admin/admin-users/admin-users.module.ts b/web-app/admin/src/app/admin/admin-users/admin-users.module.ts deleted file mode 100644 index b996618fd..000000000 --- a/web-app/admin/src/app/admin/admin-users/admin-users.module.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { MatTableModule } from '@angular/material/table'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; - -import { UserDetailsComponent } from './user-details/user-details.component'; -import { DeleteUserComponent } from './delete-user/delete-user.component'; -import { CoreModule } from '../../core/core.module'; -import { LoginsModule } from '../../logins/logins.module'; -import { UserDashboardComponent } from './dashboard/user-dashboard.component'; -import { UserAvatarModule } from 'src/app/user/user-avatar/user-avatar.module'; -import { CreateUserModalComponent } from './create-user/create-user.component'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatSelectModule } from '@angular/material/select'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatOptionModule } from '@angular/material/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { BulkUserComponent } from './bulk-user/bulk-user.component'; -import { AdminBreadcrumbModule } from '../admin-breadcrumb/admin-breadcrumb.module'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - CoreModule, - MatTableModule, - MatPaginatorModule, - MatDialogModule, - MatButtonModule, - MatIconModule, - MatProgressSpinnerModule, - LoginsModule, - UserAvatarModule, - MatFormFieldModule, - MatInputModule, - MatSelectModule, - MatTooltipModule, - MatProgressBarModule, - MatOptionModule, - AdminBreadcrumbModule - ], - declarations: [ - UserDashboardComponent, - UserDetailsComponent, - DeleteUserComponent, - CreateUserModalComponent, - BulkUserComponent - ], - exports: [ - UserDetailsComponent, - UserDashboardComponent, - CreateUserModalComponent, - BulkUserComponent - ] -}) -export class AdminUsersModule {} diff --git a/web-app/admin/src/app/admin/admin-users/bulk-user/bulk-user.component.html b/web-app/admin/src/app/admin/admin-users/bulk-user/bulk-user.component.html deleted file mode 100644 index 5172e7e8b..000000000 --- a/web-app/admin/src/app/admin/admin-users/bulk-user/bulk-user.component.html +++ /dev/null @@ -1,123 +0,0 @@ -
- -
- - Team - - - {{ team.name }} - - - - - - Role - - - {{ role.name }} - - - - -
-
-
- - -
- - -
- -
{{ filename }}
- -
-

CSV Format Requirements

-

Required: Username, Display Name, Password

-

- Optional: Email, Phone Number, Icon Initials, Icon - Color -

-

Ensure headers match these exactly (case-insensitive).

- Username,Display Name,Email,Phone Number,Password -
-
-
- -
-
- error - {{ field.title }} is required but not mapped. -
-
- -
- - - - - - - - - - - - - - - - - - -
Team - {{ user.team?.name }} - Role - {{ user.role?.name }} - {{ column }}{{ user[column] }}
-
-
- - -
diff --git a/web-app/admin/src/app/admin/admin-users/bulk-user/bulk-user.component.scss b/web-app/admin/src/app/admin/admin-users/bulk-user/bulk-user.component.scss deleted file mode 100644 index 114e3ca21..000000000 --- a/web-app/admin/src/app/admin/admin-users/bulk-user/bulk-user.component.scss +++ /dev/null @@ -1,232 +0,0 @@ -::ng-deep mat-dialog-container { - &:has(app-bulk-user) { - background-color: rgba(0, 0, 0, 0) !important; - box-shadow: none !important; - } -} - -.bulk-user-import-modal { - display: flex; - flex-direction: column; - width: 100%; - height: 70vh; - background: #fff; - border-radius: 16px; - box-sizing: border-box; - overflow: hidden; - padding: 0; -} - -.modal-body { - flex: 1 1 auto; - display: flex; - flex-direction: column; - padding: 1.5rem; - gap: 1.25rem; - overflow: hidden; - - .form-grid { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 1rem; - align-items: center; - flex-shrink: 0; - width: 95%; - margin: 0 auto; - - @media (max-width: 640px) { - grid-template-columns: 1fr; - } - - mat-form-field { - width: 100%; - } - - .file-upload { - grid-column: 1 / -1; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - gap: 0.5rem; - } - } - - .unmapped { - background: #fef2f2; - border: 1px solid #fca5a5; - border-radius: 12px; - padding: 0.75rem; - color: #b91c1c; - font-size: 0.875rem; - flex-shrink: 0; - - .unmapped-field { - display: flex; - align-items: center; - gap: 0.5rem; - } - } - - .table-wrapper { - flex: 1 1 auto; - overflow: auto; - margin-top: 1rem; - - table { - width: 100%; - border-collapse: collapse; - - th, - td { - padding: 0.75rem 1rem; - text-align: left; - border-bottom: 1px solid #e5e7eb; - } - - th { - font-weight: 600; - color: #374151; - background: #f9fafb; - } - - td { - font-size: 0.875rem; - color: #374151; - } - } - } -} - -.file-upload { - display: flex; - flex-direction: column; - gap: 0.5rem; - - input[type='file'] { - font-size: 0.9rem; - } - - .filename { - font-size: 0.875rem; - color: #4b5563; - } -} - -.modal-footer { - padding: 1.5rem; - border-top: 1px solid #e5e7eb; - display: flex; - justify-content: flex-end; - gap: 0.75rem; - background: #f9fafb; - flex-shrink: 0; - - @media (max-width: 640px) { - flex-direction: column; - align-items: stretch; - padding: 1rem; - } - - .action-button { - font-size: 0.875rem; - padding: 0.5rem 1.25rem; - border-radius: 8px; - border: 1px solid #d1d5db; - background-color: #fff; - color: #374151; - cursor: pointer; - transition: background-color 0.2s ease; - - &.btn-primary { - background-color: #3b82f6; - color: white; - border-color: #3b82f6; - - &:hover:not(:disabled) { - background-color: #2563eb; - } - } - - &:disabled { - opacity: 0.5; - cursor: not-allowed; - } - } -} - -.file-upload-container { - position: relative; - display: flex; - flex-direction: column; - align-items: center; - grid-column: 1 / 3; -} - -.file-upload-row { - display: flex; - align-items: center; - justify-content: center; - gap: 6px; -} - -.file-upload { - position: relative; -} - -input[type='file'] { - display: none; -} - -.upload-label { - display: inline-block; - background-color: #e0e0e0; - padding: 8px 14px; - border-radius: 4px; - font-weight: 500; - color: #333; - cursor: pointer; - white-space: nowrap; -} - -.info-btn { - padding: 4px; - margin-left: 4px; -} - -.filename { - margin-top: 6px; - font-size: 13px; - color: #555; - word-break: break-word; - max-width: 100%; - text-align: center; -} - -.icon-margin { - margin-bottom: 14px; -} - -.csv-info-popover { - position: absolute; - top: 100%; - margin-top: 10px; - z-index: 1000; - width: 50%; - background-color: #f0f4f8; - border-radius: 6px; - padding: 12px 16px; - text-align: left; - font-size: 14px; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); -} - -.csv-info-popover code { - display: block; - background: #e8e8e8; - padding: 6px; - margin-top: 8px; - border-radius: 4px; - font-family: monospace; - word-break: break-word; -} diff --git a/web-app/admin/src/app/admin/admin-users/bulk-user/bulk-user.component.spec.ts b/web-app/admin/src/app/admin/admin-users/bulk-user/bulk-user.component.spec.ts deleted file mode 100644 index 3cf078972..000000000 --- a/web-app/admin/src/app/admin/admin-users/bulk-user/bulk-user.component.spec.ts +++ /dev/null @@ -1,232 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import * as Papa from 'papaparse'; -import { BulkUserComponent } from './bulk-user.component'; -import { Role } from '../user'; -import { Team } from '../../admin-teams/team'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatSelectModule } from '@angular/material/select'; -import { MatTableModule } from '@angular/material/table'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; - -describe('BulkUserComponent', () => { - let component: BulkUserComponent; - let fixture: ComponentFixture; - let closeSpy: jasmine.Spy; - - const mockDialogRef = { - close: (_?: any) => {} - } as unknown as MatDialogRef; - const roles: Role[] = [ - { id: '1', name: 'Role A', permissions: [] }, - { id: '2', name: 'Role B', permissions: [] } - ]; - const teams: Team[] = [ - { - id: 10, - name: 'Team X', - description: '', - teamEventId: '', - users: [], - acl: undefined - }, - { - id: 11, - name: 'Team Y', - description: '', - teamEventId: '', - users: [], - acl: undefined - } - ]; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [BulkUserComponent], - imports: [ - FormsModule, - MatFormFieldModule, - MatSelectModule, - MatIconModule, - MatTableModule, - BrowserAnimationsModule - ], - providers: [ - { provide: MatDialogRef, useValue: mockDialogRef }, - { provide: MAT_DIALOG_DATA, useValue: { roles, teams } } - ], - schemas: [NO_ERRORS_SCHEMA] - }).compileComponents(); - - fixture = TestBed.createComponent(BulkUserComponent); - component = fixture.componentInstance; - closeSpy = spyOn(TestBed.inject(MatDialogRef), 'close'); - fixture.detectChanges(); - }); - - it('initializes injected data', () => { - expect(component.roles.length).toBe(2); - expect(component.teams.length).toBe(2); - }); - - it('parses CSV and populates state using title-based headers', () => { - component.selectedRole = roles[0] as any; - component.selectedTeam = teams[1] as any; - - const header = [ - 'Username', - 'Display Name', - 'Email', - 'Phone Number', - 'Password' - ]; - const row = ['user1', 'User One', 'u1@example.com', '555-0001', 'pass1']; - - spyOn(Papa, 'parse').and.callFake((_: any, cfg: Papa.ParseConfig) => { - (cfg.complete as any)({ data: [header, row] }); - }); - - const file = new File(['csv'], 'data.csv', { type: 'text/csv' }); - const ev = { target: { files: [file] } } as any; - component.onFileChange(ev); - - expect(component.filename).toBe('data.csv'); - expect(component.columns).toEqual(header); - expect(component.displayedColumns).toEqual(['team', 'role', ...header]); - expect(component.users.length).toBe(1); - expect((component.users[0] as any)['Username']).toBe('user1'); - expect((component.users[0] as any).team?.id).toBe(11); - expect((component.users[0] as any).role?.id).toBe("1"); - expect(component.unmappedFields.length).toBe(0); - }); - - it('flags unmapped required fields when missing', () => { - component.selectedRole = roles[0] as any; - - const header = ['Username', 'Display Name', 'Email']; - const row = ['user2', 'User Two', 'u2@example.com']; - - spyOn(Papa, 'parse').and.callFake((_: any, cfg: Papa.ParseConfig) => { - (cfg.complete as any)({ data: [header, row] }); - }); - - component.onFileChange({ - target: { files: [new File(['x'], 'x.csv')] } - } as any); - - const missing = component.unmappedFields.map((f) => f.value).sort(); - expect(missing).toEqual(['password']); - }); - - it('maps case-insensitively by internal keys', () => { - component.selectedRole = roles[1] as any; - component.selectedTeam = teams[0] as any; - - const header = ['username', 'displayname', 'password']; - const row = ['user3', 'User Three', 'pass3']; - - spyOn(Papa, 'parse').and.callFake((_: any, cfg: Papa.ParseConfig) => { - (cfg.complete as any)({ data: [header, row] }); - }); - - component.onFileChange({ - target: { files: [new File(['y'], 'y.csv')] } - } as any); - - expect(component.unmappedFields.length).toBe(0); - - component.onSubmit(); - expect(closeSpy).toHaveBeenCalledTimes(1); - - const payload = closeSpy.calls.mostRecent().args[0]; - expect(payload.users.length).toBe(1); - expect(payload.users[0]).toEqual( - jasmine.objectContaining({ - username: 'user3', - displayName: 'User Three', - password: 'pass3', - passwordconfirm: 'pass3', - roleId: roles[1].id, - team: teams[0].id - }) - ); - }); - - it('appends rows across multiple imports', () => { - component.selectedRole = roles[0] as any; - - const header = ['Username', 'Display Name', 'Password']; - const rowA = ['userA', 'User A', 'pA']; - const rowB = ['userB', 'User B', 'pB']; - - const parseSpy = spyOn(Papa, 'parse').and.callFake( - (_: any, cfg: Papa.ParseConfig) => { - (cfg.complete as any)({ data: [header, rowA] }); - } - ); - - component.onFileChange({ - target: { files: [new File(['a'], 'a.csv')] } - } as any); - expect(component.users.length).toBe(1); - - parseSpy.and.callFake((_: any, cfg: Papa.ParseConfig) => { - (cfg.complete as any)({ data: [header, rowB] }); - }); - component.onFileChange({ - target: { files: [new File(['b'], 'b.csv')] } - } as any); - - expect(component.users.length).toBe(2); - const ids = component.users.map((u: any) => u['Username']).sort(); - expect(ids).toEqual(['userA', 'userB']); - }); - - it('submits normalized payload with selected role and team', () => { - component.selectedRole = roles[0] as any; - component.selectedTeam = teams[0] as any; - - const header = [ - 'Username', - 'Display Name', - 'Email', - 'Phone Number', - 'Password' - ]; - const row = ['user9', 'User Nine', 'u9@example.com', '555-9999', 'p9']; - - spyOn(Papa, 'parse').and.callFake((_: any, cfg: Papa.ParseConfig) => { - (cfg.complete as any)({ data: [header, row] }); - }); - - component.onFileChange({ - target: { files: [new File(['z'], 'z.csv')] } - } as any); - component.onSubmit(); - - expect(closeSpy).toHaveBeenCalledTimes(1); - const { users, selectedRole, selectedTeam } = - closeSpy.calls.mostRecent().args[0]; - - expect(selectedRole.id).toBe("1"); - expect(selectedTeam.id).toBe(10); - expect(users[0]).toEqual( - jasmine.objectContaining({ - username: 'user9', - displayName: 'User Nine', - email: 'u9@example.com', - phone: '555-9999', - password: 'p9', - passwordconfirm: 'p9', - roleId: "1", - team: 10, - avatar: null, - icon: null, - iconMetadata: null - }) - ); - }); -}); diff --git a/web-app/admin/src/app/admin/admin-users/bulk-user/bulk-user.component.ts b/web-app/admin/src/app/admin/admin-users/bulk-user/bulk-user.component.ts deleted file mode 100644 index dd3c8049f..000000000 --- a/web-app/admin/src/app/admin/admin-users/bulk-user/bulk-user.component.ts +++ /dev/null @@ -1,236 +0,0 @@ -import { Component, Inject, OnInit } from '@angular/core'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import * as Papa from 'papaparse'; -import { Role, User } from '../user'; -import { Team } from '../../admin-teams/team'; - -/** - * Bulk import users from a CSV. - * - Disables file upload until at least a Role is selected (template). - * - Parses CSV headers and rows, attaches currently selected Team/Role to each row. - * - Validates that required fields are present (by display title or field key). - * - Emits a normalized payload on submit. - */ -@Component({ - selector: 'app-bulk-user', - templateUrl: './bulk-user.component.html', - styleUrls: ['./bulk-user.component.scss'] -}) -export class BulkUserComponent implements OnInit { - roles: Role[] = []; - teams: Team[] = []; - - selectedRole: Role | null = null; - selectedTeam: Team | null = null; - - filename = ''; - - users: User[] = []; - - columns: string[] = []; - displayedColumns: string[] = []; - - showCsvInfo = false; - - /** - * Required logical fields for a valid import, expressed as internal keys. - * These are validated against either CSV display titles (e.g., "Username") - * or internal keys (e.g., "username") in a case-insensitive way. - */ - private readonly requiredFields: Array<'username' | 'displayname' | 'password'> = [ - 'username', - 'displayname', - 'password' - ]; - - /** - * CSV <-> internal mapping options. - * value = internal key, title = human-friendly header likely to appear in CSV. - */ - private readonly columnOptions: Array<{ value: string; title: string }> = [ - { value: 'username', title: 'Username' }, - { value: 'displayname', title: 'Display Name' }, - { value: 'email', title: 'Email' }, - { value: 'phone', title: 'Phone Number' }, - { value: 'password', title: 'Password' }, - { value: 'iconInitials', title: 'Icon Initials' }, - { value: 'iconColor', title: 'Icon Color' } - ]; - - /** - * Headers lookup created from the last parsed CSV. - * Keys are lower-cased header names, values are their column indices. - */ - private headerIndexByName: Record = {}; - - /** - * Any required fields that are not present in the parsed header. - * Used by the template to show "unmapped" warnings. - */ - unmappedFields: Array<{ title: string; value: string }> = []; - - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: { roles?: Role[]; teams?: Team[] } - ) {} - - /** Initialize options from injected data. */ - ngOnInit(): void { - this.roles = this.data?.roles ?? []; - this.teams = this.data?.teams ?? []; - } - - /** - * Handle file input change, save filename, and parse the CSV. - * @param event Native input change event from - */ - onFileChange(event: Event): void { - const input = event.target as HTMLInputElement; - if (!input?.files?.length) return; - - const file = input.files[0]; - this.filename = file.name; - this.importFile(file); - } - - /** - * Parse a CSV file and merge rows into the current table. - * - Normalizes/records header indices for robust mapping. - * - Appends parsed users, preserving any previously added rows. - * @param file The CSV file to parse - */ - private importFile(file: File): void { - Papa.parse(file, { - complete: (results: Papa.ParseResult) => { - const nonEmptyRows = results.data.filter(row => Array.isArray(row) && row.length > 0); - if (!nonEmptyRows.length) return; - - const [headerRow, ...dataRows] = nonEmptyRows; - - const newColumns = headerRow.map(col => String(col ?? '').trim()); - newColumns.forEach((col) => { - if (!this.columns.includes(col)) this.columns.push(col); - }); - this.buildHeaderIndex(newColumns); - - this.displayedColumns = ['team', 'role', ...this.columns]; - - const newUsers: User[] = dataRows.map((row) => { - const u: any = {}; - newColumns.forEach((colName, i) => { - u[colName] = (row[i] ?? '').toString().trim(); - }); - u.team = this.selectedTeam ?? null; - u.role = this.selectedRole ?? null; - return u as User; - }); - - this.users = [...this.users, ...newUsers]; - - this.validateMapping(); - }, - skipEmptyLines: true - }); - } - - /** - * Build a fast lookup for header names -> column indices. - * Comparison is case-insensitive against both "title" and "value". - * @param headerNames Header names from the CSV (in order) - */ - private buildHeaderIndex(headerNames: string[]): void { - this.headerIndexByName = {}; - headerNames.forEach((h, idx) => { - this.headerIndexByName[h.trim().toLowerCase()] = idx; - }); - } - - /** - * Find the column index for a logical field key using: - * 1) Display title (e.g., "Display Name") - * 2) Internal key (e.g., "displayname") - * Both comparisons are case-insensitive. - * @param fieldKey Internal field key (e.g., 'username', 'displayname', 'password', etc.) - * @returns The matching column index, or -1 if not found - */ - private getIndexForField(fieldKey: string): number { - const opt = this.columnOptions.find(o => o.value.toLowerCase() === fieldKey.toLowerCase()); - const candidates = [ - opt?.title?.toLowerCase(), - opt?.value?.toLowerCase() - ].filter(Boolean) as string[]; - - for (const c of candidates) { - if (c in this.headerIndexByName) return this.headerIndexByName[c]; - } - return -1; - } - - /** - * Validate that all required fields are present in the parsed headers. - * Populates `unmappedFields` for the template to display warnings. - */ - private validateMapping(): void { - this.unmappedFields = this.requiredFields - .filter((key) => this.getIndexForField(key) === -1) - .map((key) => { - const def = this.columnOptions.find(o => o.value === key)!; - return { title: def.title, value: def.value }; - }); - } - - /** - * Produce the final, normalized payload shape for submission to the backend. - * Pulls values by matching CSV columns to required/known fields - * and attaches selected role/team IDs. - */ - private formatUsersForSubmit(): any[] { - const idxUsername = this.getIndexForField('username'); - const idxDisplayName = this.getIndexForField('displayname'); - const idxEmail = this.getIndexForField('email'); - const idxPhone = this.getIndexForField('phone'); - const idxPassword = this.getIndexForField('password'); - - return this.users.map((row: any) => { - const getByIndex = (i: number) => (i >= 0 ? (row[this.columns[i]] ?? '').toString().trim() : ''); - - const username = getByIndex(idxUsername); - const displayName = getByIndex(idxDisplayName); - const email = getByIndex(idxEmail); - const phone = getByIndex(idxPhone); - const password = getByIndex(idxPassword); - - return { - username, - displayName, - email, - phone, - password, - passwordconfirm: password, - roleId: this.selectedRole?.id ?? null, - team: this.selectedTeam?.id ?? null, - avatar: null, - icon: null, - iconMetadata: null - }; - }); - } - - /** - * Close the dialog with a normalized import payload. - * Assumes file/role validation handled by template and `validateMapping`. - */ - onSubmit(): void { - const formattedUsers = this.formatUsersForSubmit(); - this.dialogRef.close({ - users: formattedUsers, - selectedRole: this.selectedRole, - selectedTeam: this.selectedTeam - }); - } - - /** Close the dialog without changes. */ - onClose(): void { - this.dialogRef.close(); - } -} diff --git a/web-app/admin/src/app/admin/admin-users/create-user/create-user.component.html b/web-app/admin/src/app/admin/admin-users/create-user/create-user.component.html deleted file mode 100644 index 72bef6f56..000000000 --- a/web-app/admin/src/app/admin/admin-users/create-user/create-user.component.html +++ /dev/null @@ -1,278 +0,0 @@ - diff --git a/web-app/admin/src/app/admin/admin-users/create-user/create-user.component.scss b/web-app/admin/src/app/admin/admin-users/create-user/create-user.component.scss deleted file mode 100644 index 640bfc794..000000000 --- a/web-app/admin/src/app/admin/admin-users/create-user/create-user.component.scss +++ /dev/null @@ -1,394 +0,0 @@ -.modal-container { - display: flex; - flex-direction: column; - width: 100%; - max-height: 90vh; - background: #fff; - border-radius: 12px; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - overflow: hidden; - box-sizing: border-box; - - @media (max-width: 1200px) { - max-width: 95vw; - border-radius: 8px; - } - - @media (max-width: 480px) { - max-width: 98vw; - margin: 0 auto; - } -} - -.modal-header { - padding: 1.5rem; - border-bottom: 1px solid #e5e7eb; - - h2 { - margin: 0; - font-size: 1.5rem; - font-weight: 700; - color: #fff; - letter-spacing: -0.025em; - - @media (max-width: 480px) { - font-size: 1.25rem; - } - } -} - -.modal-body { - padding: 1.5rem; - overflow-y: auto; - flex: 1; - display: grid; - grid-template-columns: 1fr 1fr; - gap: 1.5rem; - - @media (max-width: 1200px) { - grid-template-columns: 1fr; - padding: 1rem; - gap: 1rem; - } -} - -.avatar-icon-wrapper { - display: flex; - justify-content: space-between; - align-items: flex-start; - gap: 32px; - margin-top: 24px; - grid-column: 1 / 3; - - @media (max-width: 1200px) { - flex-direction: column; - grid-column: 1; - } -} - -.avatar-section { - flex: 1; - display: flex; - flex-direction: column; - align-items: center; - min-height: 280px; - - @media (max-width: 1200px) { - width: 100%; - } - - .avatar-upload { - display: flex; - flex-direction: column; - align-items: center; - gap: 12px; - margin-top: 12px; - } - - .clickable-avatar { - cursor: pointer; - position: relative; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - - input[type='file'] { - color: transparent; - height: 0px; - } - - .avatar-placeholder, - .avatar-image { - width: 120px; - height: 120px; - border-radius: 50%; - background: #e0e0e0; - display: flex; - align-items: center; - justify-content: center; - } - - .avatar-placeholder { - font-size: 48px; - color: #9ca3af; - - .plus-sign { - font-weight: 700; - line-height: 1; - font-size: 50px; - } - } - - .avatar-image { - text-align: center; - font-size: 14px; - color: #666; - object-fit: cover; - } - - &:hover { - opacity: 0.8; - } - } - - .filename-wrapper { - display: flex; - align-items: center; - justify-content: center; - gap: 8px; - margin-top: 8px; - } - - .filename { - font-size: 0.875rem; - color: #4b5563; - max-width: 120px; - word-break: break-word; - text-align: center; - } - - .clear-btn { - background: transparent; - border: none; - color: #ef4444; - cursor: pointer; - font-size: 1.25rem; - line-height: 1; - padding: 0; - user-select: none; - transition: color 0.2s ease; - - &:hover, - &:focus { - color: #b91c1c; - outline: none; - } - } - - .avatar-preview { - width: 200px; - height: 200px; - border-radius: 50%; - overflow: hidden; - background: #e0e0e0; - display: flex; - align-items: center; - justify-content: center; - - .avatar-image { - width: 100%; - height: 100%; - object-fit: cover; - border-radius: 50%; - } - } -} - -.icon-section { - flex: 1; - display: flex; - flex-direction: column; - gap: 16px; - - @media (max-width: 1200px) { - width: 100%; - } - - .icon-create-grid { - display: grid; - grid-template-columns: 1fr 1fr 1fr; - gap: 0.5rem; - align-items: stretch; - - @media (max-width: 1200px) { - grid-template-columns: 1fr; - } - - .create-field { - display: flex; - flex-direction: column; - justify-content: space-between; - height: 62px; - } - - .color-field { - input[type='color'] { - height: 15px; - padding: 0; - border: none; - background: none; - - &::-webkit-color-swatch-wrapper { - padding: 0; - } - - &::-webkit-color-swatch { - border: none; - } - } - - .mat-form-field-infix { - padding: 0.25rem 0; - min-height: unset; - } - - ::ng-deep .mat-form-field-wrapper { - padding-bottom: 0; - margin: 0; - } - } - - .icon-preview { - display: flex; - justify-content: center; - align-items: center; - padding: 0.5rem; - border: 1px solid #d1d5db; - border-radius: 8px; - background: #f3f4f6; - min-height: 100%; - box-sizing: border-box; - width: auto; - - @media (max-width: 1200px) { - margin: 0 auto; - } - img { - width: 44px; - height: 44px; - object-fit: contain; - } - } - } -} - -.modal-footer { - padding: 1.5rem; - border-top: 1px solid #e5e7eb; - display: flex; - justify-content: flex-end; - gap: 0.75rem; - background: #f9fafb; - - @media (max-width: 640px) { - flex-direction: column; - align-items: stretch; - padding: 1rem; - } -} - -.password-strength { - margin-top: 1rem; - - .mat-body-1 { - font-weight: 500; - color: #374151; - } - - .mat-body-2 { - font-size: 0.875rem; - color: #6b7280; - } - - .custom-password-bar { - margin-top: 0.5rem; - height: 8px; - border-radius: 4px; - background: #e5e7eb; - - ::ng-deep .mat-progress-bar-fill::after { - background-color: var(--password-bar-color) !important; - } - } -} - -.password-error-popover { - position: absolute; - background: #fff0f0; - border: 1px solid #f44336; - color: #b71c1c; - border-radius: 4px; - padding: 8px 12px; - font-size: 13px; - z-index: 10; - box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.15); - margin-top: 4px; - width: 100%; -} - -.error { - color: red; - font-size: 0.8em; - margin-top: 4px; -} - -.action-button { - padding: 0.75rem 1.5rem; - border: 1px solid #d1d5db; - border-radius: 8px; - background: white; - color: #374151; - font-size: 0.875rem; - font-weight: 500; - cursor: pointer; - transition: all 0.2s ease; - white-space: nowrap; - display: inline-flex; - align-items: center; - gap: 0.5rem; - - &:hover:not(:disabled) { - background-color: #f9fafb; - border-color: #9ca3af; - } - - &:focus { - outline: none; - box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); - border-color: #3b82f6; - } - - &:disabled { - opacity: 0.5; - cursor: not-allowed; - } - - &.btn-sm { - padding: 0.5rem 1rem; - font-size: 0.75rem; - } - - &.btn-primary { - background-color: #3b82f6; - border-color: #3b82f6; - color: white; - - &:hover:not(:disabled) { - background-color: #2563eb; - border-color: #2563eb; - } - } - - &.btn-danger { - background-color: #ef4444; - border-color: #ef4444; - color: white; - - &:hover:not(:disabled) { - background-color: #dc2626; - border-color: #dc2626; - } - } -} - -::ng-deep .mat-dialog-container { - padding: 0 !important; - background: transparent !important; - box-shadow: none !important; - border-radius: 30px !important; -} - -::ng-deep .mat-form-field-required-marker { - color: red; -} diff --git a/web-app/admin/src/app/admin/admin-users/create-user/create-user.component.spec.ts b/web-app/admin/src/app/admin/admin-users/create-user/create-user.component.spec.ts deleted file mode 100644 index 940b38dda..000000000 --- a/web-app/admin/src/app/admin/admin-users/create-user/create-user.component.spec.ts +++ /dev/null @@ -1,191 +0,0 @@ -import { - ComponentFixture, - fakeAsync, - TestBed, - tick -} from '@angular/core/testing'; -import { CreateUserModalComponent } from './create-user.component'; -import { ReactiveFormsModule, FormsModule } from '@angular/forms'; -import { - MatDialogModule, - MatDialogRef, - MAT_DIALOG_DATA -} from '@angular/material/dialog'; -import { ApiService } from '../../../api/api.service'; -import { Role } from '../user'; -import { of } from 'rxjs'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatSelectModule } from '@angular/material/select'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; - -describe('CreateUserModalComponent', () => { - let component: CreateUserModalComponent; - let fixture: ComponentFixture; - let dialogRefSpy: jasmine.SpyObj>; - let apiServiceSpy: jasmine.SpyObj; - - const mockRoles: Role[] = [ - { id: '1', name: 'Admin', permissions: [] }, - { id: '2', name: 'User', permissions: [] } - ]; - - beforeEach(async () => { - dialogRefSpy = jasmine.createSpyObj('MatDialogRef', ['close']); - apiServiceSpy = jasmine.createSpyObj('ApiService', ['getApi']); - apiServiceSpy.getApi.and.returnValue( - of({ - authenticationStrategies: { - local: { - settings: { - passwordPolicy: { - passwordMinLength: 8, - passwordMinLengthEnabled: true, - lowLettersEnabled: true, - lowLetters: 1, - highLettersEnabled: true, - highLetters: 1, - numbersEnabled: true, - numbers: 1, - specialCharsEnabled: true, - specialChars: 1, - maxConCharsEnabled: true, - maxConChars: 3, - restrictSpecialCharsEnabled: true, - restrictSpecialChars: '!@#', - helpTextTemplate: { - passwordMinLength: 'be at least # characters long', - lowLetters: 'have at least # lowercase letter(s)', - highLetters: 'have at least # uppercase letter(s)', - numbers: 'contain at least # number(s)', - specialChars: 'contain at least # special character(s)', - maxConChars: 'have no more than # consecutive characters', - restrictSpecialChars: 'use only these special characters: #' - } - } - } - } - } - }) - ); - - await TestBed.configureTestingModule({ - declarations: [CreateUserModalComponent], - imports: [ - ReactiveFormsModule, - FormsModule, - MatDialogModule, - BrowserAnimationsModule, - MatFormFieldModule, - MatInputModule, - MatSelectModule - ], - providers: [ - { provide: MAT_DIALOG_DATA, useValue: { roles: mockRoles } }, - { provide: MatDialogRef, useValue: dialogRefSpy }, - { provide: ApiService, useValue: apiServiceSpy } - ] - }).compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(CreateUserModalComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create the component', () => { - expect(component).toBeTruthy(); - }); - - it('should validate required fields in form', () => { - const form = component.signup; - form.get('displayName')?.setValue(''); - form.get('username')?.setValue(''); - form.get('password')?.setValue(''); - expect(form.valid).toBeFalse(); - expect(form.get('displayName')?.invalid).toBeTrue(); - expect(form.get('username')?.invalid).toBeTrue(); - expect(form.get('password')?.invalid).toBeTrue(); - }); - - it('should display error messages when form fields are invalid and touched', () => { - const form = component.signup; - const displayNameControl = form.get('displayName'); - displayNameControl?.setValue(''); - displayNameControl?.markAsTouched(); - fixture.detectChanges(); - const errorMessage = fixture.nativeElement.querySelector( - '.password-error-popover mat-error' - ); - expect(errorMessage).toBeTruthy(); - expect(errorMessage.textContent).toContain('Display name is required'); - }); - - it('should update password strength on password change', () => { - const passwordControl = component.signup.get('password'); - passwordControl?.setValue('GoodPass'); - fixture.detectChanges(); - expect(component.passwordStrength.text).toBe('Good'); - expect(component.passwordStrength.value).toEqual('50'); - passwordControl?.setValue('Str0ngPass!'); - fixture.detectChanges(); - expect(component.passwordStrength.text).toBe('Excellent'); - expect(component.passwordStrength.value).toEqual('100'); - }); - - it('should handle avatar file change and show preview', () => { - const avatarInput = - fixture.nativeElement.querySelector('input[type="file"]'); - spyOn(component, 'onAvatarChanged'); - avatarInput.dispatchEvent(new Event('change')); - fixture.detectChanges(); - expect(component.onAvatarChanged).toHaveBeenCalled(); - }); - - it('should clear avatar preview when clear button is clicked', () => { - component.avatarPreviewUrl = 'some-preview-url'; - component.selectedAvatarFileName = 'avatar.png'; - component.clearAvatar(); - expect(component.avatarPreviewUrl).toBe(''); - expect(component.selectedAvatarFileName).toBe(''); - }); - - it('should handle form submission when valid', () => { - (dialogRefSpy.close as jasmine.Spy).calls.reset(); - - component.signup.patchValue({ - displayName: 'John Doe', - username: 'john_doe', - email: '', - password: 'S!t!0!n!g!P!a!s!s!1!', - passwordconfirm: 'S!t!0!n!g!P!a!s!s!1!', - selectedRole: mockRoles[0].id - }); - - component.passwordErrorMessages = []; - component.signup.updateValueAndValidity(); - component.saveUser(); - - expect(dialogRefSpy.close).toHaveBeenCalledWith({ - confirmed: true, - user: { - username: 'john_doe', - displayName: 'John Doe', - email: '', - password: 'S!t!0!n!g!P!a!s!s!1!', - passwordconfirm: 'S!t!0!n!g!P!a!s!s!1!', - roleId: '1', - avatar: null, - icon: null, - iconMetadata: '{"type":"none","text":"","color":"#007bff"}' - } - }); - }); - - it('should not submit form if invalid', () => { - (dialogRefSpy.close as jasmine.Spy).calls.reset(); - component.saveUser(); - expect(dialogRefSpy.close).not.toHaveBeenCalled(); - }); -}); diff --git a/web-app/admin/src/app/admin/admin-users/create-user/create-user.component.ts b/web-app/admin/src/app/admin/admin-users/create-user/create-user.component.ts deleted file mode 100644 index 35b534cb8..000000000 --- a/web-app/admin/src/app/admin/admin-users/create-user/create-user.component.ts +++ /dev/null @@ -1,287 +0,0 @@ -import { Component, Inject } from '@angular/core'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { Role } from '../user'; -import { ApiService } from '../../../api/api.service'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; - -import { - createPasswordPolicyValidator, - confirmPasswordValidator, - evaluatePasswordStrength, - getPasswordTooltip -} from '../../../../app/shared/utils/password.utils'; - -import { - PasswordStrength, - passwordStrengthScores -} from 'src/app/entities/entities.password'; - -import { PasswordPolicy } from 'src/app/ingress/authentication/@types/signup'; - -/** - * Modal component for creating a new user. - */ -@Component({ - selector: 'create-user-modal', - templateUrl: './create-user.component.html', - styleUrls: ['./create-user.component.scss'] -}) -export class CreateUserModalComponent { - roles: Role[] = []; - saving = false; - - selectedAvatarFileName: string = ''; - avatarPreviewUrl: string | null = null; - iconPreviewUrl: string | null = null; - - showPassword: boolean = false; - showConfirmPassword: boolean = false; - - passwordPolicy: PasswordPolicy; - passwordErrorMessages: string[] = []; - passwordStrength: PasswordStrength = passwordStrengthScores[0]; - - newUserFiles = { - avatar: null as File | null, - icon: null as File | null - }; - - iconMetadata = { - type: 'none', - text: '', - color: '#007bff' - }; - - signup = new FormGroup({ - displayName: new FormControl('', [Validators.required]), - username: new FormControl('', [Validators.required]), - email: new FormControl('', [Validators.email]), - phone: new FormControl(''), - selectedRole: new FormControl(null, [Validators.required]), - password: new FormControl('', [Validators.required]), - passwordconfirm: new FormControl('', [Validators.required]), - iconType: new FormControl('none'), - iconInitials: new FormControl(''), - iconColor: new FormControl('#007bff') - }); - - /** - * Constructor to inject services and dialog data. - */ - constructor( - public dialogRef: MatDialogRef, - private apiService: ApiService, - @Inject(MAT_DIALOG_DATA) public data: { roles: Role[]; saving?: boolean } - ) { - if (data) { - this.roles = data.roles; - if (data.saving !== undefined) this.saving = data.saving; - } - } - - /** - * Initializes password validation, password strength meter, and icon generators. - */ - ngOnInit(): void { - this.apiService.getApi().subscribe((api: any) => { - this.passwordPolicy = - api.authenticationStrategies.local.settings.passwordPolicy; - - const passwordControl = this.signup.get('password'); - const confirmControl = this.signup.get('passwordconfirm'); - const username = this.signup.get('username')?.value; - - if (passwordControl) { - passwordControl.setValidators([ - Validators.required, - createPasswordPolicyValidator( - this.passwordPolicy, - (errors) => { - this.passwordErrorMessages = errors; - }, - username - ) - ]); - passwordControl.updateValueAndValidity(); - - passwordControl.valueChanges.subscribe((value) => { - this.passwordStrength = evaluatePasswordStrength(value, username); - confirmControl?.updateValueAndValidity(); - }); - } - - if (confirmControl) { - confirmControl.setValidators([ - Validators.required, - confirmPasswordValidator(() => this.signup.get('password')?.value) - ]); - confirmControl.updateValueAndValidity(); - } - }); - - this.watchIconChanges(); - } - - /** - * Watch for initials/color changes and regenerate marker icon. - */ - watchIconChanges(): void { - const initialsCtrl = this.signup.get('iconInitials'); - const colorCtrl = this.signup.get('iconColor'); - - if (initialsCtrl && colorCtrl) { - initialsCtrl.valueChanges.subscribe(() => { - this.generateMarkerIcon(initialsCtrl.value, colorCtrl.value); - }); - - colorCtrl.valueChanges.subscribe(() => { - this.generateMarkerIcon(initialsCtrl.value, colorCtrl.value); - }); - } - } - - /** - * Handles avatar file input. - */ - onAvatarChanged(event: Event): void { - const input = event.target as HTMLInputElement; - if (input.files && input.files.length > 0) { - const file = input.files[0]; - this.selectedAvatarFileName = file.name; - - const reader = new FileReader(); - reader.onload = () => { - this.avatarPreviewUrl = reader.result as string; - }; - reader.readAsDataURL(file); - - this.newUserFiles.avatar = file; - input.value = ''; - } - } - - /** - * Clears selected avatar. - */ - clearAvatar(): void { - this.avatarPreviewUrl = ''; - this.selectedAvatarFileName = ''; - this.newUserFiles.avatar = null; - } - - /** - * Handles icon file upload. - */ - onIconChanged(event: Event): void { - const file = (event.target as HTMLInputElement).files?.[0]; - if (!file) return; - - this.newUserFiles.icon = file; - const reader = new FileReader(); - reader.onload = () => (this.iconPreviewUrl = reader.result as string); - reader.readAsDataURL(file); - this.iconMetadata.type = 'upload'; - } - - /** - * Called when icon type changes (none/create/upload). - */ - onIconTypeChanged(): void { - const type = this.signup.get('iconType')?.value; - this.iconMetadata.type = type; - - if (type === 'none') { - this.iconPreviewUrl = null; - this.newUserFiles.icon = null; - } - } - - /** - * Generates a dynamic SVG map icon from initials and color. - */ - generateMarkerIcon(initials: string, color: string): void { - const contrast = this.getContrastingTextColor(color); - const circleFill = contrast === '#000000' ? '#ffffff' : '#000000'; - - const svg = ` - - - - - - ${initials?.toUpperCase().substring(0, 2)} - - - - `; - - const blob = new Blob([svg], { type: 'image/svg+xml' }); - this.newUserFiles.icon = new File([blob], 'map-icon.svg', { - type: 'image/svg+xml' - }); - - const encoded = encodeURIComponent(svg) - .replace(/'/g, '%27') - .replace(/"/g, '%22'); - this.iconPreviewUrl = `data:image/svg+xml;charset=utf-8,${encoded}`; - } - - /** - * Calculates a contrasting text color for a given background. - */ - getContrastingTextColor(bgColor: string): string { - const hex = bgColor.replace('#', ''); - const r = parseInt(hex.substring(0, 2), 16); - const g = parseInt(hex.substring(2, 4), 16); - const b = parseInt(hex.substring(4, 6), 16); - const yiq = (r * 299 + g * 587 + b * 114) / 1000; - return yiq >= 128 ? '#000000' : '#FFFFFF'; - } - - /** - * Submits the user creation form if valid. - */ - saveUser(): void { - if (this.signup.invalid || this.passwordErrorMessages.length > 0) { - this.signup.markAllAsTouched(); - return; - } - - const userPayload = { - username: this.signup.get('username')?.value, - displayName: this.signup.get('displayName')?.value, - email: this.signup.get('email')?.value, - password: this.signup.get('password')?.value, - passwordconfirm: this.signup.get('passwordconfirm')?.value, - roleId: this.signup.get('selectedRole')?.value, - avatar: this.newUserFiles.avatar, - icon: this.newUserFiles.icon, - iconMetadata: JSON.stringify({ - ...this.iconMetadata, - text: this.signup.get('iconInitials').value, - color: this.signup.get('iconColor').value - }) - }; - - this.dialogRef.close({ confirmed: true, user: userPayload }); - } - - /** - * Cancels and closes the modal. - */ - cancelModal(): void { - this.dialogRef.close({ confirmed: false }); - } - - /** - * Returns formatted tooltip text for password policy display. - */ - get passwordTooltipText(): string { - return this.passwordPolicy ? getPasswordTooltip(this.passwordPolicy) : ''; - } - - getPasswordErrorMessages(errors: any): string[] { - if (errors?.['required']) return ['Password is required']; - return this.passwordErrorMessages; - } -} diff --git a/web-app/admin/src/app/admin/admin-users/dashboard/user-dashboard.component.html b/web-app/admin/src/app/admin/admin-users/dashboard/user-dashboard.component.html deleted file mode 100644 index 78b8cbf01..000000000 --- a/web-app/admin/src/app/admin/admin-users/dashboard/user-dashboard.component.html +++ /dev/null @@ -1,161 +0,0 @@ - - -
- - -
-
-
- - - - Status - - All - Active - Inactive - Disabled - - -
- -
- - -
-
- -
- - - - - - - - -
User -
- -
-
{{ user.displayName }}
-
{{ user.email }}
-
-
-
-
- - -
-
-
-
-
- warning - Please do not refresh or leave the page while the upload is in progress. -
-
-
-
-
-
- Uploading users... {{ bulkProgress.completed }} / - {{ bulkProgress.total }} complete. - - {{ bulkProgress.failed }} failed - -
-
- Finalizing upload... please wait. -
-
-

Upload completed with errors

-

{{ bulkErrors.length }} user(s) failed to upload.

-
- - - - - - - - - - - - - - - -
UsernameEmailError
{{ error.user.username }}{{ error.user.email }}{{ error.error }}
-
- -
- - -
-
- -
- -
-
-
diff --git a/web-app/admin/src/app/admin/admin-users/dashboard/user-dashboard.component.scss b/web-app/admin/src/app/admin/admin-users/dashboard/user-dashboard.component.scss deleted file mode 100644 index 5d0befa80..000000000 --- a/web-app/admin/src/app/admin/admin-users/dashboard/user-dashboard.component.scss +++ /dev/null @@ -1,458 +0,0 @@ -::ng-deep .admin-main-content { - min-width: 520px; - &:has(admin-users) { - height: 92vh; - overflow-y: hidden; - -webkit-overflow-scrolling: touch; - - @media (max-height: 500px) { - overflow-y: scroll; - } - } - admin-users { - .container { - height: 90vh; - } - } -} - -$min-height: 40.8vh; -$max-height: 72.8vh; - -.container.bottom-gap-l { - margin-bottom: 2rem; -} - -.admin-nav-gap { - margin-top: -15px; - margin-bottom: -15px; - - .breadcrumbs-toolbar { - min-height: 36px !important; - height: 36px; - background-color: #f0f0f0; - color: #555; - font-size: 13px; - padding: 0 16px; - border-radius: 4px; - - mat-icon { - font-size: 18px; - margin-right: 4px; - vertical-align: middle; - color: #777; - } - - span { - display: flex; - align-items: center; - gap: 4px; - } - } -} - -.page-header { - margin-bottom: 20px; - margin-top: 5px; - padding: 0; - - .page-title { - font-size: 2rem; - font-weight: 700; - color: #1a1a1a; - margin: 0 0 0.5rem; - line-height: 1.2; - letter-spacing: -0.025em; - } - - .page-subtitle { - font-size: 1rem; - color: #666; - margin: 0; - line-height: 1.5; - font-weight: 400; - } -} - -.btn-primary { - background-color: #1e88e5; - color: #fff; -} - -.integrated-navbar { - display: flex; - align-items: center; - justify-content: space-between; - flex-wrap: wrap; - padding: 1rem 1.5rem; - border-bottom: 2px solid #e5e7eb; - height: 85px; - - mage-card-navbar { - flex: 1; - margin-right: 1rem; - min-width: 200px; - background: transparent; - box-shadow: none; - border-radius: 0; - margin-bottom: 0; - } - - @media (max-width: 768px) { - flex-direction: column; - align-items: stretch; - margin: 0; - padding: 5px; - - .button-group { - width: auto; - margin: 0 auto; - } - } -} -.table-wrapper { - border-radius: 12px; - background: #fff; - border: 1px solid #e5e7eb; - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), - 0 2px 4px -1px rgba(0, 0, 0, 0.06); - height: 75vh; - overflow: hidden; - - @media (max-height: 1100px) { - height: 73vh; - } - - @media (max-height: 1000px) { - height: 71vh; - } - - @media (max-height: 900px) { - height: 69vh; - } - - @media (max-height: 800px) { - height: 64vh; - } - - @media (max-height: 700px) { - height: 57vh; - } - - @media (max-height: 600px) { - height: 285px; - } -} - -.table-scroll { - height: 62.2vh; - @media (max-width: 768px) { - height: 60.2vh; - } - overflow-y: auto; - max-height: 100%; - - @media (max-height: 1100px) { - height: 59vh; - } - - @media (max-height: 1000px) { - height: 55vh; - } - - @media (max-height: 900px) { - height: 52vh; - } - - @media (max-height: 800px) { - height: 44vh; - } - - @media (max-height: 700px) { - height: 34vh; - } - @media (max-height: 600px) { - height: 142.5px; - } - - table { - width: 100%; - border-collapse: collapse; - table-layout: fixed; - - th, - td { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - } - - .mat-header-row { - position: sticky; - top: 0; - z-index: 2; - background: #f9fafb; - } - - .mat-row, - .mat-cell, - .mat-header-cell { - height: 3.5rem; - padding: 0.5rem; - - @media (max-height: 768px) { - height: 3.2rem; - } - - @media (max-height: 600px) { - height: 3rem; - padding: 0.4rem; - } - - @media (max-height: 480px) { - height: 2.8rem; - padding: 0.3rem; - font-size: 0.85rem; - } - - @media (max-height: 400px) { - height: 2.5rem; - font-size: 0.75rem; - } - - @media (max-height: 350px) { - height: 2.3rem; - font-size: 0.7rem; - } - } -} - -.pagination { - display: contents; -} - -.mat-column-actions { - text-align: right; - - .mat-cell, - .mat-header-cell { - justify-content: flex-end; - text-align: right; - } - - .d-flex { - display: flex; - justify-content: flex-end; - gap: 0.5rem; - } -} - -.bulk-overlay { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(255, 255, 255, 0.9); - z-index: 10000; - display: flex; - align-items: center; - justify-content: center; - pointer-events: all; -} - -.bulk-progress-content { - width: 60%; - text-align: center; - - @media (max-width: 768px) { - width: 100%; - } -} - -.bulk-progress-bar { - position: relative; - width: 100%; - height: 24px; - background-color: #e0e0e0; - border-radius: 12px; - overflow: hidden; - display: flex; - box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2); -} - -.bulk-progress-success { - background-color: #4caf50; - height: 100%; - transition: width 0.3s ease; -} - -.bulk-progress-failure { - background-color: #f44336; - height: 100%; - transition: width 0.3s ease; -} - -.bulk-progress-text { - margin-top: 1rem; - font-size: 16px; - font-weight: 500; -} - -.bulk-progress-warning { - display: flex; - align-items: center; - justify-content: center; - background-color: #fff3cd; - color: #856404; - padding: 12px; - border-radius: 4px; - margin-bottom: 1rem; - font-weight: 500; - border: 1px solid #ffeeba; - font-size: 14px; - text-align: center; - - mat-icon { - margin-right: 8px; - } -} - -.bulk-error-summary { - margin-top: 2rem; - background-color: #fff3f3; - border: 1px solid #f5c2c7; - padding: 1rem; - border-radius: 4px; -} - -.bulk-error-summary { - margin-top: 2rem; - background-color: #fff3f3; - border: 1px solid #f5c2c7; - padding: 1rem; - border-radius: 4px; - max-width: 100%; - - .error-table-wrapper { - max-height: 300px; - overflow-y: auto; - width: 100%; - margin-top: 1rem; - border: 1px solid #ccc; - border-radius: 4px; - - table.error-table { - width: 100%; - border-collapse: collapse; - margin: 0; - - thead { - th { - background-color: #f8d7da; - position: sticky; - top: 0; - z-index: 1; - padding: 8px; - border: 1px solid #ccc; - font-size: 14px; - white-space: nowrap; - } - } - - tbody { - td { - padding: 8px; - border: 1px solid #ccc; - font-size: 14px; - white-space: nowrap; - } - } - } - } -} - -.finalizing-text { - margin-top: 1rem; - font-style: italic; - color: #666; -} - -.button-group { - margin-top: -20px; - button { - height: 43px; - white-space: nowrap; - } - - button:not(:last-child) { - margin-right: 40px; - } -} - -.filters { - margin-top: -10px; - align-items: center !important; - display: flex !important; -} - -:host { - .status-filter { - width: 150px; - margin-left: 1rem; - margin-top: 10px; - font-size: 14px; - - ::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix { - padding: 10px; - } - ::ng-deep .mat-form-field-infix { - padding: 10px; - } - - ::ng-deep .mat-form-field-label-wrapper { - top: -12px; - left: -1px; - } - } - ::ng-deep input.search-input.ng-untouched.ng-pristine.ng-valid, - ::ng-deep input.search-input.ng-valid.ng-dirty.ng-touched, - ::ng-deep input.search-input.ng-valid.ng-dirty.ng-untouched { - height: 43px; - margin-top: -10px; - } -} - -.d-flex { - display: flex; - gap: 25px; -} - -.align-items-center{ - align-items: center !important; -} - -.icon { - font-size: 25px; -} - -.ellipsis { - text-overflow: ellipsis; - overflow: hidden; -} - -::ng-deep .mat-tooltip-event-desc{ - position: relative; - left: 0 !important; - font-size: 20px; - min-width: 75vw; -} - -.w-100 { - width: 100% !important; -} - -.w-90 { - width: 90% !important; -} \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-users/dashboard/user-dashboard.component.spec.ts b/web-app/admin/src/app/admin/admin-users/dashboard/user-dashboard.component.spec.ts deleted file mode 100644 index 26a2fdbca..000000000 --- a/web-app/admin/src/app/admin/admin-users/dashboard/user-dashboard.component.spec.ts +++ /dev/null @@ -1,284 +0,0 @@ -import { - ComponentFixture, - TestBed, - fakeAsync, - flush, - tick -} from '@angular/core/testing'; -import { UserDashboardComponent } from './user-dashboard.component'; -import { MatDialog } from '@angular/material/dialog'; -import { Router } from '@angular/router'; -import { - LocalStorageService, - UserService, - UserPagingService -} from 'admin/src/app/upgrade/ajs-upgraded-providers'; -import { TeamsService } from '../../admin-teams/teams-service'; -import { StateService } from '@uirouter/angular'; -import { of } from 'rxjs'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { MatIconModule } from '@angular/material/icon'; -import { MatOptionModule } from '@angular/material/core'; -import { MatTableModule } from '@angular/material/table'; -import { MatCardModule } from '@angular/material/card'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatListModule } from '@angular/material/list'; - -describe('UserDashboardComponent', () => { - let component: UserDashboardComponent; - let fixture: ComponentFixture; - - const testUsers = [ - { - id: '1', - username: 'ranma77', - displayName: 'Ranma Saotome', - active: true, - enabled: true, - authentication: 'LOCAL', - createdAt: new Date().toDateString(), - lastUpdated: new Date().toDateString(), - recentEventIds: [], - role: 'martial artist', - email: 'ranma@example.com', - phones: [] - }, - { - id: '2', - username: 'yusuke23', - displayName: 'Yusuke Urameshi', - active: true, - enabled: true, - authentication: 'LOCAL', - createdAt: new Date().toDateString(), - lastUpdated: new Date().toDateString(), - recentEventIds: [], - role: 'spirit detective', - email: 'yusuke@example.com', - phones: [] - }, - { - id: '3', - username: 'goku_saiyan', - displayName: 'Goku', - active: true, - enabled: true, - authentication: 'LOCAL', - createdAt: new Date().toDateString(), - lastUpdated: new Date().toDateString(), - recentEventIds: [], - role: 'saiyan warrior', - email: 'goku@example.com', - phones: [] - } - ]; - - let dialogSpy: any; - let routerSpy: any; - let localStorageSpy: any; - let userServiceSpy: any; - let pagingServiceSpy: any; - let teamsServiceSpy: any; - let stateServiceSpy: any; - let injectorSpy: any; - - beforeEach(async () => { - dialogSpy = jasmine.createSpyObj('MatDialog', ['open']); - routerSpy = jasmine.createSpyObj('Router', ['navigate']); - localStorageSpy = jasmine.createSpyObj('LocalStorageService', ['getToken']); - localStorageSpy.getToken.and.returnValue('token123'); - - userServiceSpy = { - myself: { - role: { permissions: ['CREATE_USER', 'UPDATE_USER', 'DELETE_USER'] } - }, - getRoles: jasmine - .createSpy() - .and.returnValue(Promise.resolve([{ name: 'Admin' }])), - createUser: jasmine.createSpy().and.returnValue(Promise.resolve()), - deleteUser: jasmine.createSpy().and.returnValue(Promise.resolve()), - updateUser: jasmine.createSpy().and.returnValue(Promise.resolve()) - }; - - pagingServiceSpy = { - constructDefault: jasmine - .createSpy() - .and.returnValue({ all: { pageInfo: { totalCount: 2 } } }), - refresh: jasmine.createSpy().and.callFake(() => Promise.resolve()), - users: jasmine.createSpy().and.returnValue(testUsers), - search: jasmine.createSpy().and.returnValue(Promise.resolve(testUsers)) - }; - - teamsServiceSpy = { - getTeams: jasmine.createSpy().and.returnValue(of([{ items: [] }])), - addUserToTeam: jasmine.createSpy().and.returnValue(of({})) - }; - - stateServiceSpy = jasmine.createSpyObj('StateService', ['go']); - - injectorSpy = { - get: (token: any) => (token === '$state' ? stateServiceSpy : null) - }; - - await TestBed.configureTestingModule({ - imports: [ - CommonModule, - FormsModule, - MatIconModule, - MatOptionModule, - MatTableModule, - MatCardModule, - MatProgressSpinnerModule, - MatDividerModule, - MatListModule - ], - declarations: [UserDashboardComponent], - providers: [ - { provide: MatDialog, useValue: dialogSpy }, - { provide: Router, useValue: routerSpy }, - { provide: LocalStorageService, useValue: localStorageSpy }, - { provide: UserService, useValue: userServiceSpy }, - { provide: UserPagingService, useValue: pagingServiceSpy }, - { provide: TeamsService, useValue: teamsServiceSpy }, - { provide: StateService, useValue: stateServiceSpy }, - { provide: '$injector', useValue: injectorSpy } - ] - }).compileComponents(); - - fixture = TestBed.createComponent(UserDashboardComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create component and initialize state', () => { - expect(component).toBeTruthy(); - expect(component.token).toBe('token123'); - }); - - it('should load permissions and roles on init', fakeAsync(() => { - component.ngOnInit(); - tick(); - expect(userServiceSpy.getRoles).toHaveBeenCalled(); - expect(component.roles.length).toBeGreaterThan(0); - flush(); - })); - - it('should refresh users and update table data', fakeAsync(() => { - component.refreshUsers(); - tick(); - expect(pagingServiceSpy.refresh).toHaveBeenCalled(); - expect(component.dataSource.length).toBe(3); - expect(component.totalUsers).toBe(2); - flush(); - })); - - it('should search and update user list', fakeAsync(() => { - component.onSearchTermChanged('user'); - tick(); - expect(pagingServiceSpy.search).toHaveBeenCalledWith( - component.stateAndData['all'], - 'user' - ); - expect(component.dataSource.length).toBe(3); - flush(); - })); - - it('should reset search and refresh users', fakeAsync(() => { - component.reset(); - tick(); - expect(pagingServiceSpy.constructDefault).toHaveBeenCalled(); - expect(pagingServiceSpy.refresh).toHaveBeenCalled(); - flush(); - })); - - it('should handle pagination event and refresh', fakeAsync(() => { - component.onPageChange({ pageIndex: 1, pageSize: 25 } as any); - tick(); - expect(component.pageIndex).toBe(1); - expect(component.pageSize).toBe(25); - expect(pagingServiceSpy.refresh).toHaveBeenCalled(); - flush(); - })); - - it('should navigate to create user page', () => { - component.newUser(); - expect(routerSpy.navigate).toHaveBeenCalledWith(['/admin/create-user']); - }); - - it('should navigate to bulk import page', () => { - component.bulkImport(); - expect(routerSpy.navigate).toHaveBeenCalledWith(['/admin/bulk-user']); - }); - - it('should open create user modal and call service', fakeAsync(() => { - dialogSpy.open.and.returnValue({ - afterClosed: () => of({ confirmed: true, user: {} }) - }); - - component.createUser(); - tick(); - expect(userServiceSpy.createUser).toHaveBeenCalled(); - flush(); - })); - - it('should navigate to user detail on click', () => { - component.gotoUser(testUsers[0] as any); - expect(stateServiceSpy.go).toHaveBeenCalledWith('admin.user', { - userId: '1' - }); - }); - - it('should set userStatusFilter and refresh users when filter changes', fakeAsync(() => { - spyOn(component, 'refreshUsers').and.callThrough(); - - component.onStatusFilterChange('active'); - expect(component.userStatusFilter).toBe('active'); - expect(component.pageIndex).toBe(0); - expect(component.refreshUsers).toHaveBeenCalled(); - flush(); - })); - - it('should apply "active" filter in refreshUsers()', fakeAsync(() => { - component.userStatusFilter = 'active'; - component.refreshUsers(); - tick(); - - const state = component.stateAndData['all']; - expect(state.userFilter.active).toBeTrue(); - expect(pagingServiceSpy.refresh).toHaveBeenCalled(); - flush(); - })); - - it('should apply "inactive" filter in refreshUsers()', fakeAsync(() => { - component.userStatusFilter = 'inactive'; - component.refreshUsers(); - tick(); - - const state = component.stateAndData['all']; - expect(state.userFilter.active).toBeFalse(); - flush(); - })); - - it('should apply "disabled" filter in refreshUsers()', fakeAsync(() => { - component.userStatusFilter = 'disabled'; - component.refreshUsers(); - tick(); - - const state = component.stateAndData['all']; - expect(state.userFilter.enabled).toBeFalse(); - flush(); - })); - - it('should clear filters for "all" option in refreshUsers()', fakeAsync(() => { - component.userStatusFilter = 'all'; - component.refreshUsers(); - tick(); - - const state = component.stateAndData['all']; - expect(state.userFilter.active).toBeUndefined(); - expect(state.userFilter.disabled).toBeUndefined(); - flush(); - })); -}); diff --git a/web-app/admin/src/app/admin/admin-users/dashboard/user-dashboard.component.ts b/web-app/admin/src/app/admin/admin-users/dashboard/user-dashboard.component.ts deleted file mode 100644 index 4424ff6a3..000000000 --- a/web-app/admin/src/app/admin/admin-users/dashboard/user-dashboard.component.ts +++ /dev/null @@ -1,439 +0,0 @@ -import { Component, OnInit, Inject } from '@angular/core'; -import { Router } from '@angular/router'; -import { MatDialog } from '@angular/material/dialog'; -import { PageEvent } from '@angular/material/paginator'; - -import { StateService } from '@uirouter/angular'; -import { - LocalStorageService, - UserService, - UserPagingService -} from 'admin/src/app/upgrade/ajs-upgraded-providers'; -import { User } from 'core-lib-src/user'; -import { CreateUserModalComponent } from '../create-user/create-user.component'; -import { Role } from '../user'; -import { BulkUserComponent } from '../bulk-user/bulk-user.component'; -import { TeamsService } from '../../admin-teams/teams-service'; -import { Team } from '../../admin-teams/team'; -import pLimit from 'p-limit'; -import { AdminBreadcrumb } from '../../admin-breadcrumb/admin-breadcrumb.model'; - -type UserFilter = { - limit?: number; - page?: number; - enabled?: boolean; - active?: boolean; -}; - -@Component({ - selector: 'admin-users', - templateUrl: './user-dashboard.component.html', - styleUrls: ['./user-dashboard.component.scss'] -}) -export class UserDashboardComponent implements OnInit { - dataSource: User[] = []; - displayedColumns: string[] = ['user']; - - userSearch: string = ''; - - totalUsers = 0; - pageSize = 10; - pageIndex = 0; - pageSizeOptions = [5, 10, 25, 50]; - - token: string; - error: string | null = null; - - hasUserCreatePermission = false; - - stateAndData: any; - - roles: Role[] = []; - teams: Team[] = []; - - isBulkUploading = false; - bulkProgress = { - total: 0, - completed: 0, - failed: 0 - }; - bulkErrors: { user: any; error: string }[] = []; - showErrorTable = false; - isFinalizing = false; - isFinished = false; - - breadcrumbs: AdminBreadcrumb[] = [ - { - title: 'Users', - iconClass: 'fa fa-user' - } - ]; - - userStatusFilter: 'all' | 'active' | 'inactive' | 'disabled' = 'all'; - - /** - * Constructs the UserDashboardComponent with necessary services. - * @param dialog Angular Material dialog service - * @param router Angular router for navigation - * @param localStorageService Service to access local storage - * @param stateService UI-Router state service - * @param teamService Service for fetching team data - * @param userService Service for user operations - * @param userPagingService Service for paginated user data - */ - constructor( - private dialog: MatDialog, - private router: Router, - private localStorageService: LocalStorageService, - private stateService: StateService, - @Inject(TeamsService) private teamService: TeamsService, - @Inject(UserService) private userService, - @Inject(UserPagingService) private userPagingService - ) { - this.token = this.localStorageService.getToken(); - this.stateAndData = this.userPagingService.constructDefault(); - } - - /** - * Initializes component data and permissions. - */ - ngOnInit(): void { - this.initPermissions(); - this.refreshUsers(); - this.loadRoles(); - this.fetchTeams(); - window.addEventListener('beforeunload', this.beforeUnloadListener); - } - - ngOnDestroy(): void { - window.removeEventListener('beforeunload', this.beforeUnloadListener); - } - - beforeUnloadListener = (event: BeforeUnloadEvent) => { - if (this.isBulkUploading) { - event.preventDefault(); - event.returnValue = ''; - return event.returnValue; - } - return; - }; - - /** - * Initializes permission flags for the current user. - */ - private initPermissions(): void { - const permissions = this.userService.myself.role?.permissions || []; - this.hasUserCreatePermission = permissions.includes('CREATE_USER'); - } - - /** - * Loads available user roles from the server. - */ - private loadRoles(): void { - this.userService.getRoles().then((roles: any[]) => { - this.roles = roles; - }); - } - - /** - * Fetches team data for use in bulk user import. - */ - private fetchTeams(): void { - this.teamService - .getTeams({ - limit: 9999, - sort: { name: 1 }, - omit_event_teams: true - }) - .subscribe((results) => { - if (results?.length > 0) { - this.teams = results[0].items; - } - }); - } - - getFilter(): UserFilter { - const filterObject: UserFilter = {}; - - filterObject.limit = this.pageSize; - filterObject.page = this.pageIndex; - if (this.userStatusFilter === 'all') return filterObject; - - if (this.userStatusFilter === 'disabled') { - filterObject.active = true; - filterObject.enabled = false; - } else if (this.userStatusFilter === 'active') { - filterObject.active = true; - } else { - filterObject.active = false; - } - - return filterObject; - } - - /** - * Refreshes the paginated list of users. - */ - refreshUsers(): Promise { - const state = this.stateAndData['all']; - - state.pageSize = this.pageSize; - state.pageIndex = this.pageIndex; - - state.userFilter = this.getFilter(); - - return this.userPagingService.refresh(this.stateAndData).then(() => { - const users = this.userPagingService.users(state); - this.dataSource = users; - this.totalUsers = state.pageInfo.totalCount || 0; - }); - } - - /** - * Handles search input change. - * @param term The search term entered by the user - */ - onSearchTermChanged(term: string): void { - this.userSearch = term; - this.pageIndex = 0; - this.search(); - } - - /** - * Clears the current search and refreshes the user list. - */ - onSearchCleared(): void { - this.userSearch = ''; - this.refreshUsers(); - } - - /** - * Executes a search query on the user list. - */ - search(): void { - this.stateAndData['all'].userFilter.active = this.getFilter(); - - this.userPagingService - .search(this.stateAndData['all'], this.userSearch) - .then((users) => { - this.dataSource = users; - this.totalUsers = - this.stateAndData['all'].pageInfo.totalCount || users.length; - }); - } - - /** - * Resets the search and pagination state. - */ - reset(): void { - this.userSearch = ''; - this.stateAndData = this.userPagingService.constructDefault(); - this.pageIndex = 0; - this.refreshUsers(); - } - - /** - * Handles page change events from the paginator. - * @param event The page event - */ - onPageChange(event: PageEvent): void { - this.pageSize = event.pageSize; - this.pageIndex = event.pageIndex; - this.refreshUsers(); - } - - /** - * Navigates to the user creation page. - */ - newUser(): void { - this.router.navigate(['/admin/create-user']); - } - - /** - * Navigates to the bulk user import page. - */ - bulkImport(): void { - this.router.navigate(['/admin/bulk-user']); - } - - /** - * Navigates to a specific user's detail page. - * @param user The user to navigate to - */ - gotoUser(user: User): void { - this.stateService.go('admin.user', { userId: user.id }); - } - - /** - * Opens a modal to create a new user. - */ - createUser(): void { - const dialogRef = this.dialog.open(CreateUserModalComponent, { - width: '80%', - disableClose: true, - data: { roles: this.roles } - }); - - dialogRef.afterClosed().subscribe((newUser) => { - if (newUser?.confirmed) { - new Promise((resolve, reject) => { - this.userService.createUser( - newUser.user, - (user) => resolve(user), - (err) => reject(err), - null - ); - }) - .catch((err) => { - console.error(err); - }) - .finally(() => { - this.refreshUsers(); - }); - } - }); - } - - /** - * Opens a modal for bulk user import. - */ - openImportModal(): void { - const dialogRef = this.dialog.open(BulkUserComponent, { - width: '80vw', - data: { - roles: this.roles, - teams: this.teams - } - }); - - dialogRef.afterClosed().subscribe((result) => { - if (result?.users?.length) { - this.isBulkUploading = true; - this.isFinalizing = false; - this.bulkProgress = { - total: result.users.length, - completed: 0, - failed: 0 - }; - - this.bulkCreateUsers(result.users) - .then(async (createdUsers) => { - this.isFinalizing = true; - - if (result.selectedTeam) { - await Promise.all( - createdUsers.map((u) => - this.teamService - .addUserToTeam(result.selectedTeam.id, u) - .toPromise() - ) - ); - } - }) - .finally(() => { - this.refreshUsers().then(() => { - this.isFinalizing = false; - if (this.bulkErrors.length === 0) { - this.isFinished = true; - } else { - this.showErrorTable = true; - } - }); - }); - } - }); - } - - onStatusFilterChange( - value: 'all' | 'active' | 'inactive' | 'disabled' - ): void { - this.userStatusFilter = value; - this.pageIndex = 0; - this.refreshUsers(); - } - - /** - * Creates users in bulk via the user service. - * @param users Array of user data to create - * @returns A promise that resolves to the list of successfully created users - */ - async bulkCreateUsers(users: any[]): Promise { - const usersAdded: User[] = []; - this.bulkErrors = []; - this.bulkProgress.total = users.length; - this.bulkProgress.completed = 0; - this.bulkProgress.failed = 0; - - const limit = pLimit(100); - - const tasks = users.map((userData) => - limit( - () => - new Promise((resolve) => { - const success = (ret: any) => { - usersAdded.push(ret); - this.bulkProgress.completed++; - resolve(); - }; - const error = (err: any) => { - this.bulkProgress.failed++; - this.bulkProgress.completed++; - - this.bulkErrors.push({ - user: userData, - error: err?.responseText || 'Unknown error' - }); - - console.error(`Failed to create user ${userData.username}`, err); - resolve(); - }; - - this.userService.createUser(userData, success, error); - }) - ) - ); - - await Promise.allSettled(tasks); - this.refreshUsers(); - return usersAdded; - } - - getSuccessPercent(): number { - const { completed, failed, total } = this.bulkProgress; - if (total === 0) return 0; - return ((completed - failed) / total) * 100; - } - - getFailurePercent(): number { - const { failed, total } = this.bulkProgress; - if (total === 0) return 0; - return (failed / total) * 100; - } - - downloadErrorCSV(): void { - const headers = ['Username', 'Email', 'Error']; - const rows = this.bulkErrors.map((err) => [ - err.user.username || '', - err.user.email || '', - err.error - ]); - - const csvContent = [headers, ...rows] - .map((e) => e.map((v) => `"${String(v).replace(/"/g, '""')}"`).join(',')) - .join('\n'); - - const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' }); - const url = window.URL.createObjectURL(blob); - const link = document.createElement('a'); - - link.setAttribute('href', url); - link.setAttribute('download', `bulk-upload-errors-${Date.now()}.csv`); - link.click(); - } - - closeBulkUpload(): void { - this.isBulkUploading = false; - this.bulkErrors = []; - this.bulkProgress = { total: 0, completed: 0, failed: 0 }; - } -} diff --git a/web-app/admin/src/app/admin/admin-users/delete-user/delete-user.component.html b/web-app/admin/src/app/admin/admin-users/delete-user/delete-user.component.html deleted file mode 100644 index a3d2dc080..000000000 --- a/web-app/admin/src/app/admin/admin-users/delete-user/delete-user.component.html +++ /dev/null @@ -1,27 +0,0 @@ -
-
-
- -
-
-

Delete User

-

This action cannot be undone

-
-
- -
-
-

User "{{ data.user?.displayName || data.user?.username }}" will be permanently deleted, - including associated location data.

-

This cannot be undone. Are you sure you want to proceed?

-
-
- -
- - -
-
\ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-users/delete-user/delete-user.component.scss b/web-app/admin/src/app/admin/admin-users/delete-user/delete-user.component.scss deleted file mode 100644 index a753c2d26..000000000 --- a/web-app/admin/src/app/admin/admin-users/delete-user/delete-user.component.scss +++ /dev/null @@ -1,190 +0,0 @@ -/* delete-team modal styles below */ -.dialog-header { - align-items: flex-start; - gap: 1rem; - - .warning-icon { - flex-shrink: 0; - width: 3rem; - height: 3rem; - background-color: #fef2f2; - border: 2px solid #fecaca; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - color: #dc2626; - - i { - font-size: 1.25rem; - } - } - - .header-content { - flex: 1; - - .dialog-title { - font-size: 1.375rem; - font-weight: 700; - color: #111827; - margin: 0 0 0.25rem 0; - line-height: 1.2; - } - - .dialog-subtitle { - font-size: 0.875rem; - color: #dc2626; - margin: 0; - line-height: 1.4; - font-weight: 500; - } - } -} - -.warning-message { - padding: 1rem; - background-color: #fef2f2; - border: 1px solid #fecaca; - border-radius: 8px; - margin-bottom: 1.5rem; - - p { - margin: 0; - color: #7f1d1d; - font-size: 0.875rem; - line-height: 1.5; - - strong { - color: #dc2626; - font-weight: 600; - } - } -} - -.form-field { - margin-bottom: 1.5rem; -} - -.checkbox-field { - display: flex; - align-items: flex-start; - gap: 0.75rem; - cursor: pointer; - font-size: 0.875rem; - line-height: 1.5; - - .checkbox-input { - margin: 0; - width: 1.125rem; - height: 1.125rem; - flex-shrink: 0; - cursor: pointer; - accent-color: #dc2626; - } - - .checkbox-label { - color: #374151; - font-weight: 500; - cursor: pointer; - } -} - -.danger-zone { - background-color: #fef2f2; - border: 2px solid #fecaca; - border-radius: 12px; - padding: 1.5rem; - margin-top: 1rem; - - .danger-zone-header { - display: flex; - align-items: center; - gap: 0.5rem; - margin-bottom: 1rem; - - i { - color: #dc2626; - font-size: 1.125rem; - } - - h3 { - margin: 0; - font-size: 1.125rem; - font-weight: 700; - color: #dc2626; - } - } - - .danger-zone-content { - p { - margin: 0 0 0.75rem 0; - color: #7f1d1d; - font-size: 0.875rem; - line-height: 1.5; - - &:last-of-type { - margin-bottom: 1.25rem; - } - - strong { - color: #dc2626; - font-weight: 700; - } - } - } -} - -.confirmation-field { - .field-label { - display: block; - font-size: 0.875rem; - font-weight: 600; - color: #7f1d1d; - margin-bottom: 0.5rem; - text-transform: uppercase; - letter-spacing: 0.05em; - } - - .form-input { - width: 100%; - padding: 0.75rem 1rem; - border: 2px solid #fca5a5; - border-radius: 8px; - font-size: 0.875rem; - background-color: white; - transition: all 0.2s ease; - font-weight: 500; - - &:focus { - outline: none; - border-color: #dc2626; - box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.1); - } - - &::placeholder { - color: #fca5a5; - font-weight: 400; - } - } -} - -::ng-deep .mat-dialog-container { - padding: 0; - border-radius: 12px; - box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); -} - -::ng-deep .mat-dialog-actions { - padding: 0; - margin: 0; -} - -::ng-deep .mat-dialog-content { - padding: 0; - margin: 0; -} - -::ng-deep .mat-dialog-title { - padding: 0; - margin: 0; -} \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-users/delete-user/delete-user.component.ts b/web-app/admin/src/app/admin/admin-users/delete-user/delete-user.component.ts deleted file mode 100644 index b466656f1..000000000 --- a/web-app/admin/src/app/admin/admin-users/delete-user/delete-user.component.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Component, Inject } from '@angular/core'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { User } from '../user'; - -@Component({ - selector: 'mage-delete-user', - templateUrl: './delete-user.component.html', - styleUrls: ['./delete-user.component.scss'] -}) -export class DeleteUserComponent { - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: { user: User } - ) { } - - cancel(): void { - this.dialogRef.close(); - } - - confirmDelete(): void { - this.dialogRef.close({ confirmed: true }); - } -} diff --git a/web-app/admin/src/app/admin/admin-users/user-details/user-details.component.html b/web-app/admin/src/app/admin/admin-users/user-details/user-details.component.html deleted file mode 100644 index fb1bcb389..000000000 --- a/web-app/admin/src/app/admin/admin-users/user-details/user-details.component.html +++ /dev/null @@ -1,748 +0,0 @@ - - -
- - -
- {{ error }} -
- -
-
-
-
-
- -
-
- -
- -
-
- -
-
-
- - - - -
No avatar
-
-
-
- -
- Upload a square image; it will be cropped to a circle. -
-
-
- -
-
Upload Avatar
-
- - -
-
-
-
-
- -
- -
-
- -
-
No icon
-
-
- -
-
-
-
- - - -
- No icon -
-
-
- -
- - -
-
- -
-
Create Icon
-
-
-
- - -
-
- - -
-
-
-
- -
-
Upload Icon
-
-
- - - -
-
-
- -
-
No Icon
-
- No icon selected -
-
-
-
-
-
-
- -
- -
- {{ - user.username - }} - -
-
- -
- -
- {{ - user.displayName - }} - -
-
- -
- -
- {{ - user.email - }} - -
-
- -
- -
- {{ - user.phones && user.phones[0] ? user.phones[0].number : '' - }} - -
-
- -
- -
- {{ - user.role?.name - }} - - {{ - user.role?.name - }} -
-
- -
- -
- - {{ user.authentication.authenticationConfiguration.title }} - - - Authentication strategy no longer exists - -
-
- -
-
- - -
-
-
- - -
- Password is required. -
-
-
- - -
- Confirmation is required. -
-
- Passwords do not match. -
-
-
- -
- Strength: {{ passwordStrength }} -
-
- {{ passwordStatus.msg }} -
- -
- - -
-
-
-
- -
-
- {{ error }} -
-
- -
- - -
-
-
- -
-
-
-
- -
-
-

Activate New User Account

-

- This is a new user account. Activate the account to allow user to - access MAGE. -

- -
-
-
- -
-

- {{ user.enabled ? 'Disable User Account' : 'User Account Disabled' }} -

-

- {{ - user.enabled - ? 'Disabling will prevent the account user from accessing MAGE. MAGE will retain all account - information and you can enable the account again at any time.' - : 'This account is disabled. Enable the account to allow user to access MAGE. Accounts can be - disabled manually by an administrator, or for security reasons, such as too many invalid login - attempts.' - }} -

- -
- -
-

Delete User Account

-

- Deleting the account will remove all associated user information - including location data. This cannot be undone, and the user's data - will be unrecoverable. -

- -
-
-
- -
- -
- -
-
-
User Teams
-
- -
- -
- - - - - - -
-
-
- -
-
-
{{ team.name }}
-
- {{ team.description }} -
-
-
- -
-
-
- -
-
- -
- No teams assigned to {{ user?.displayName }} -
-
-
-
- - - -
-
-
Loading
- -
-
-
-
- - -
-
-
User Events
-
- -
- -
- - - - - - -
-
-
- -
-
-
{{ event.name }}
-
- {{ event.description }} -
-
-
-
- -
-
- -
- No events assigned to {{ user?.displayName }} -
-
-
-
- - - -
-
-
Loading
- -
-
-
-
-
- -
-
- -
-
-
diff --git a/web-app/admin/src/app/admin/admin-users/user-details/user-details.component.scss b/web-app/admin/src/app/admin/admin-users/user-details/user-details.component.scss deleted file mode 100644 index 4846fdfd8..000000000 --- a/web-app/admin/src/app/admin/admin-users/user-details/user-details.component.scss +++ /dev/null @@ -1,1080 +0,0 @@ -.page-header { - margin-bottom: 2rem; - padding-bottom: 1rem; - display: flex; - justify-content: space-between; - align-items: flex-start; - gap: 2rem; - - @media (max-width: 768px) { - flex-direction: column; - align-items: stretch; - gap: 1rem; - } - - .page-title { - flex: 1; - font-size: 2rem; - font-weight: 700; - color: #1a1a1a; - margin: 0; - line-height: 1.2; - letter-spacing: -0.025em; - } - - .page-subtitle { - font-size: 1rem; - color: #666; - margin: 0.5rem 0 0 0; - line-height: 1.5; - font-weight: 400; - } -} - -.header-title-section { - flex: 1; -} - -.header-actions { - display: flex; - gap: 0.75rem; - flex-shrink: 0; - - @media (max-width: 768px) { - justify-content: center; - } - - .edit-actions { - display: flex; - gap: 0.5rem; - } -} - -.details-section { - display: grid; - grid-template-columns: 2fr 1fr; - gap: 2rem; - margin-bottom: 3rem; - align-items: stretch; - - @media (max-width: 768px) { - grid-template-columns: 1fr; - gap: 1.5rem; - } -} - -.side-cards { - display: flex; - flex-direction: column; - align-self: stretch; - height: 100%; - - >.action-card, - >.danger-zone-card { - flex: 0 1 auto; - max-height: calc(50% - 0.375rem); - display: flex; - overflow: auto; - } -} - -.details-card { - background: white; - border-radius: 12px; - border: 1px solid #e5e7eb; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - padding: 1.25rem; - height: 100%; -} - -.details-form { - .form-row { - display: flex; - justify-content: space-between; - align-items: stretch; - gap: 0.5rem; - - @media (max-width: 768px) { - grid-template-columns: 1fr; - } - - .form-field { - display: flex; - flex-direction: column; - - .field-content { - flex: 1; - display: flex; - - .map-icon-container { - flex: 1; - display: flex; - flex-direction: column; - } - } - } - } - - .form-field { - margin-bottom: 1.5rem; - - .field-label { - display: block; - font-size: 0.875rem; - font-weight: 600; - color: #374151; - margin-bottom: 0.5rem; - text-transform: uppercase; - letter-spacing: 0.05em; - } - - .field-content { - .field-value { - font-size: 1rem; - color: #111827; - line-height: 1.5; - - &.text-warning { - color: #d97706; - } - } - - .form-input { - width: 100%; - padding: 0.75rem 1rem; - border: 1px solid #d1d5db; - border-radius: 8px; - font-size: 0.875rem; - background-color: #f9fafb; - transition: all 0.2s ease; - - &:focus { - outline: none; - border-color: #3b82f6; - background-color: white; - box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); - } - - &[disabled] { - opacity: 0.6; - cursor: not-allowed; - } - } - } - - .avatar-display { - display: flex; - align-items: center; - } - - .avatar-image { - border-radius: 50%; - border: 2px solid #e5e7eb; - } - - .avatar-placeholder { - width: 75px; - height: 75px; - border-radius: 50%; - background-color: #f3f4f6; - display: flex; - align-items: center; - justify-content: center; - border: 2px solid #e5e7eb; - - i { - font-size: 2.5rem; - color: #9ca3af; - } - } - - .map-icon { - border-radius: 4px; - border: 1px solid #e5e7eb; - } - } - - .form-actions { - display: flex; - gap: 0.75rem; - margin-top: 2rem; - } - - .map-icon-field { - .map-icon-header { - display: flex; - align-items: center; - gap: 0.75rem; - } - - .map-icon-thumb { - width: 75px; - height: 75px; - border-radius: 8px; - border: 1px solid #e5e7eb; - background: #fff; - } - - .map-icon-editor { - display: flex; - flex-direction: column; - flex: 1; - } - - .map-icon-top { - display: flex; - align-items: center; - gap: 1rem; - min-height: 120px; - } - - @media (max-width: 768px) { - .map-icon-top { - min-height: 0; - } - } - - .map-icon-preview { - display: flex; - align-items: center; - justify-content: center; - width: 75px; - height: 75px; - border-radius: 10px; - border: 1px dashed #d1d5db; - background: #f9fafb; - } - - .map-icon-empty { - font-size: 0.75rem; - color: #9ca3af; - } - - .map-icon-type-select { - display: flex; - flex-direction: column; - gap: 0.375rem; - - .form-input { - width: auto; - min-width: 160px; - } - } - - .create-grid { - display: grid; - grid-template-columns: auto auto; - gap: 1rem; - align-items: end; - } - - .create-field { - display: flex; - flex-direction: column; - gap: 0.375rem; - - label { - font-size: 0.75rem; - font-weight: 600; - color: #6b7280; - text-transform: uppercase; - letter-spacing: 0.05em; - } - - input[type="text"].form-input { - width: 100px; - max-width: 100px; - } - - input[type="color"].color-input { - width: 48px; - height: 42px; - padding: 0; - border: 1px solid #d1d5db; - border-radius: 8px; - background: transparent; - appearance: none; - -webkit-appearance: none; - } - - input[type="color"].color-input::-webkit-color-swatch-wrapper { - padding: 0; - border-radius: 8px; - } - - input[type="color"].color-input::-webkit-color-swatch { - border: none; - border-radius: 6px; - } - } - - .upload-actions { - display: flex; - gap: 0.5rem; - align-items: center; - - input[type="file"] { - display: none; - } - - .imageLabel { - margin-bottom: 0; - } - - .btn-secondary { - background: #f9fafb; - } - } - - .helper-text { - font-size: 0.75rem; - color: #6b7280; - } - } - - .map-icon-container { - border: 1px solid #e5e7eb; - border-radius: 12px; - background: #f9fafb; - padding: 1rem; - height: 100%; - } - - .map-icon-container-header { - display: flex; - align-items: center; - justify-content: space-between; - margin-bottom: 0.75rem; - } - - .map-icon-container-title { - font-size: 0.875rem; - font-weight: 700; - color: #111827; - letter-spacing: 0.02em; - } - - .map-icon-section { - background: #fff; - border: 1px solid #e5e7eb; - border-radius: 10px; - padding: 0.75rem 1rem; - margin-top: 0.5rem; - } - - .map-icon-section-title { - font-size: 0.75rem; - font-weight: 600; - color: #6b7280; - text-transform: uppercase; - letter-spacing: 0.05em; - margin-bottom: 0.5rem; - } -} - -.action-cards-section { - display: flex; - flex-direction: column; - gap: 1.5rem; -} - -.action-card { - background: white; - border-radius: 12px; - border: 1px solid #e5e7eb; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - overflow: hidden; - display: flex; - flex-direction: column; - - &.warning { - background: #fffbeb; - border-color: #fef3c7; - - .action-card-title { - color: #a16207; - } - - .action-card-description { - color: #a16207; - } - } -} - -.action-card-content { - display: flex; - padding: 1.5rem; - gap: 1rem; - overflow: auto; -} - -.action-card-icon { - flex-shrink: 0; - width: 3rem; - height: 3rem; - border-radius: 8px; - display: flex; - align-items: center; - justify-content: center; - - &.success { - background-color: #dcfce7; - color: #16a34a; - } - - &.warning { - background-color: #fef3c7; - color: #d97706; - } - - &.danger { - background-color: #fecaca; - color: #dc2626; - } - - i { - font-size: 1.25rem; - } -} - -.action-card-body { - flex: 1; - - .action-card-title { - font-size: 1rem; - font-weight: 600; - color: #111827; - margin: 0 0 0.5rem 0; - } - - .action-card-description { - font-size: 0.875rem; - color: #6b7280; - line-height: 1.5; - margin: 0 0 1rem 0; - } -} - -.danger-zone-card { - background: #fef2f2; - border: 1px solid #fecaca; - border-radius: 12px; - padding: 1.25rem; - display: flex; - flex-direction: column; - min-height: 200px; - overflow: auto; - - .danger-zone-title { - font-size: 1.125rem; - font-weight: 600; - color: #dc2626; - margin: 0 0 1rem 0; - } - - .danger-zone-description { - font-size: 0.875rem; - color: #7f1d1d; - margin: 0 0 1.5rem 0; - line-height: 1.5; - flex: 1; - } - - .action-button { - margin-top: auto; - align-self: flex-end; - } - - &.warning { - background: #fffbeb; - border-color: #fde68a; - - .danger-zone-title { - color: #a16207; - } - - .danger-zone-description { - color: #7c4a03; - } - } - - &.sticky-bottom { - margin-top: auto; - } -} - -.sections-container { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 2rem; - margin-bottom: 1.5rem; - - @media (max-width: 1200px) { - grid-template-columns: 1fr; - gap: 1.5rem; - } -} - -.section-card { - background: white; - border-radius: 12px; - overflow: hidden; - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); - border: 1px solid #e5e7eb; -} - -.integrated-navbar { - background-color: #f9fafb; - border-bottom: 2px solid #e5e7eb; - - mage-card-navbar { - background: transparent; - box-shadow: none; - border-radius: 0; - } -} - -.section-table-title { - font-size: 1rem; - font-weight: 600; - padding: 1rem 1.5rem 0.5rem 1.5rem; - color: #111827; -} - -.table-wrapper { - --row-height: 73px; - --min-page-size: 5; - --base-table-height: calc(var(--row-height) * var(--min-page-size)); - - display: flex; - flex-direction: column; - position: relative; -} - -.table-scroll { - height: var(--base-table-height); - max-height: var(--base-table-height); - overflow-y: auto; - overflow-x: hidden; - -webkit-overflow-scrolling: touch; - overscroll-behavior: contain; - border-bottom: 1px solid #e5e7eb; -} - -.table-wrapper .mat-table { - display: table; - width: 100%; - height: auto; - overflow: visible; -} - -.table-wrapper mat-paginator { - flex-shrink: 0; - border-top: 1px solid #e5e7eb; - background: #f9fafb; -} - -.action-button { - display: inline-flex; - align-items: center; - gap: 0.5rem; - padding: 0.75rem 1.25rem; - font-size: 0.875rem; - font-weight: 600; - border: 1px solid #d1d5db; - border-radius: 0.5rem; - background-color: #ffffff; - color: #374151; - cursor: pointer; - transition: all 0.2s ease; - text-decoration: none; - white-space: nowrap; - - &:hover:not(:disabled) { - background-color: #f9fafb; - border-color: #9ca3af; - } - - &:focus { - outline: none; - box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); - border-color: #3b82f6; - } - - &:disabled { - opacity: 0.5; - cursor: not-allowed; - } - - &.btn-sm { - padding: 0.5rem 1rem; - font-size: 0.75rem; - } - - &.btn-primary { - background-color: #3b82f6; - border-color: #3b82f6; - color: white; - - &:hover:not(:disabled) { - background-color: #2563eb; - border-color: #2563eb; - } - } - - &.btn-success { - background-color: #16a34a; - border-color: #16a34a; - color: white; - - &:hover:not(:disabled) { - background-color: #15803d; - border-color: #15803d; - } - } - - &.btn-warning { - background-color: #fbbf24; - border-color: #fbbf24; - color: white; - - &:hover:not(:disabled) { - background-color: #f59e0b; - border-color: #f59e0b; - } - } - - &.btn-danger { - background-color: #ef4444; - border-color: #ef4444; - color: white; - - &:hover:not(:disabled) { - background-color: #dc2626; - border-color: #dc2626; - } - } -} - -.mat-table-no-header { - .mat-header-row { - display: none; - } -} - -.table-row-content { - padding: 0 !important; - border-bottom: 1px solid #f1f5f9; - - &:last-child { - border-bottom: none; - } -} - -.row-item { - display: flex; - align-items: center; - gap: 1rem; - padding: 1rem 1.5rem; - transition: background-color 0.2s ease; - cursor: pointer; - - &:hover { - background-color: #f8fafc; - } -} - -.row-icon { - flex-shrink: 0; - width: 2.5rem; - height: 2.5rem; - display: flex; - align-items: center; - justify-content: center; - background-color: #f3f4f6; - border-radius: 8px; - color: #6b7280; - - i { - font-size: 1.25rem; - } -} - -.row-info { - flex: 1; - min-width: 0; - - @media (max-width: 768px) { - flex: 1; - } - - .row-primary { - font-size: 0.875rem; - font-weight: 600; - color: #111827; - margin-bottom: 0.25rem; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - max-width: 12rem; - } - - .row-secondary { - font-size: 0.75rem; - color: #6b7280; - line-height: 1.4; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - max-width: 12rem; - } -} - -.row-actions { - flex: 0 0 auto; - min-width: fit-content; -} - -.empty-state { - display: flex; - align-items: center; - justify-content: center; - padding: 3rem 2rem; - min-height: 200px; - - .empty-state-content { - text-align: center; - - .empty-state-icon { - font-size: 3rem; - color: #9ca3af; - margin-bottom: 1rem; - display: block; - } - - .empty-state-text { - font-size: 1.1rem; - color: #6b7280; - font-weight: 500; - } - } -} - -.loading-overlay { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(255, 255, 255, 0.8); - display: flex; - align-items: center; - justify-content: center; - z-index: 10; - - .loading-content { - display: flex; - align-items: center; - gap: 0.75rem; - padding: 1rem 1.5rem; - background-color: white; - border-radius: 8px; - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1); - - .loading-text { - font-size: 0.875rem; - font-weight: 600; - color: #374151; - } - - .loading-spinner { - color: #3b82f6; - font-size: 1rem; - } - } -} - -.login-filters { - padding: 1rem 1.5rem; - background: #f9fafb; - - .filter-section { - display: grid; - grid-template-columns: 1fr 2fr 1fr; - gap: 1rem; - align-items: end; - - @media (max-width: 768px) { - grid-template-columns: 1fr; - gap: 0.75rem; - } - - .form-group { - display: flex; - flex-direction: column; - gap: 0.25rem; - - .filter-label { - font-size: 0.75rem; - font-weight: 600; - color: #374151; - text-transform: uppercase; - letter-spacing: 0.05em; - } - - .form-input { - padding: 0.5rem 0.75rem; - border: 1px solid #d1d5db; - border-radius: 6px; - font-size: 0.875rem; - background-color: white; - - &:focus { - outline: none; - border-color: #3b82f6; - box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); - } - - &.date-input { - flex: 1; - } - - &.results-select { - min-width: 80px; - } - } - - .date-range-inputs { - display: flex; - align-items: center; - gap: 0.5rem; - - .date-separator { - font-size: 0.875rem; - color: #6b7280; - white-space: nowrap; - } - } - } - } -} - -.login-table-scroll { - min-height: 300px; - max-height: 500px; -} - -.login-items { - padding: 0; -} - -.login-item { - border-bottom: 1px solid #f1f5f9; - padding: 1rem 1.5rem; - - &:last-child { - border-bottom: none; - } -} - -.login-content { - display: flex; - align-items: center; - gap: 1rem; -} - -.login-icon { - flex-shrink: 0; - width: 2.5rem; - height: 2.5rem; - display: flex; - align-items: center; - justify-content: center; - background-color: #f3f4f6; - border-radius: 8px; - color: #6b7280; - - i { - font-size: 1.25rem; - } -} - -.login-info { - flex: 1; - min-width: 0; - - .login-primary { - font-size: 0.875rem; - color: #111827; - margin-bottom: 0.25rem; - display: flex; - align-items: center; - gap: 0.75rem; - flex-wrap: wrap; - - .login-device { - font-size: 0.75rem; - color: #6b7280; - - a { - color: #3b82f6; - text-decoration: none; - - &:hover { - text-decoration: underline; - } - - i { - margin-right: 0.25rem; - } - } - - &.unknown { - color: #9ca3af; - - i { - margin-right: 0.25rem; - } - } - } - } - - .login-secondary { - font-size: 0.75rem; - color: #6b7280; - line-height: 1.4; - } -} - -.login-pagination { - display: flex; - justify-content: flex-end; - gap: 0.5rem; - padding: 1rem 1.5rem; - background: #f9fafb; - border-top: 1px solid #e5e7eb; -} - -.admin-main { - .top-gap { - margin-top: 10px; - } - - .top-gap-s { - margin-top: 5px; - } - - .top-gap-l { - margin-top: 20px; - } - - .bottom-gap-l { - margin-bottom: 20px; - } - - .right-gap { - margin-right: 10px; - } - - .right-gap-s { - margin-right: 5px; - } - - .admin-nav-gap { - margin-bottom: 15px; - } - - .muted { - color: #999; - } - - .pointer { - cursor: pointer; - } - - .admin-table { - .well-item { - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - border-radius: 4px; - margin-bottom: 10px; - padding: 15px; - - &:hover { - background-color: #e8e8e8; - } - } - } - - .card { - background: #fff; - border: 1px solid #ddd; - border-radius: 4px; - margin-bottom: 20px; - - .card-content { - padding: 15px; - } - } - - .admin-dashboard-navbar { - border-radius: 0; - margin-bottom: 0; - - .navbar-brand { - font-weight: bold; - } - } - - .fixed-width-navbar { - min-width: 600px; - } - - .navbar-text-inverse { - color: #333; - } - - .fa-small { - font-size: 0.8em; - } - - .admin-desktop-icon-xs, - .admin-android-icon-xs, - .admin-apple-icon-xs, - .admin-generic-icon-xs { - font-size: 16px; - } - - .admin-android-icon-xs { - color: #a4c639; - } - - .admin-apple-icon-xs { - color: #007aff; - } - - .admin-desktop-icon-xs { - color: #666; - } - - .admin-generic-icon-xs { - color: #999; - } -} - -@media (max-width: 768px) { - .admin-main { - .col-md-offset-1 { - margin-left: 0; - } - - .fixed-width-navbar { - min-width: auto; - } - } -} - -.edit-full-width { - grid-column: 1 / 3; - width: 100%; -} \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-users/user-details/user-details.component.spec.ts b/web-app/admin/src/app/admin/admin-users/user-details/user-details.component.spec.ts deleted file mode 100644 index 9dc9b8ff7..000000000 --- a/web-app/admin/src/app/admin/admin-users/user-details/user-details.component.spec.ts +++ /dev/null @@ -1,251 +0,0 @@ -import { ComponentFixture, TestBed, fakeAsync, tick } from '@angular/core/testing'; -import { FormsModule } from '@angular/forms'; -import { MatDialog } from '@angular/material/dialog'; -import { of } from 'rxjs'; -import { StateService } from '@uirouter/angular'; -import { UserDetailsComponent } from './user-details.component'; -import { - UserService, - LoginService, - DevicePagingService, - Team, - LocalStorageService -} from '../../../upgrade/ajs-upgraded-providers'; -import { TeamsService } from '../../admin-teams/teams-service'; -import { EventsService } from '../../admin-event/events.service'; - -describe('UserDetailsComponent', () => { - let component: UserDetailsComponent; - let fixture: ComponentFixture; - - const mockStateService = { - params: { userId: 'test-user-id' }, - go: jasmine.createSpy('go') - }; - - const mockUser: any = { - id: 'test-user-id', - username: 'testuser', - displayName: 'Test User', - email: 'test@example.com', - active: true, - enabled: true, - phones: [{ number: '123-456-7890' }], - role: { id: 'role-user', name: 'User' }, - authentication: { type: 'local' }, - iconUrl: '/api/icons/abc.png', - lastUpdated: 123 - }; - - const mockRoles = [ - { id: 'role-admin', name: 'Admin' }, - { id: 'role-user', name: 'User' } - ]; - - const mockUserService = { - myself: { role: { permissions: ['UPDATE_USER', 'DELETE_USER', 'UPDATE_USER_ROLE'] } }, - getUser: jasmine.createSpy('getUser').and.returnValue(Promise.resolve({ ...mockUser })), - getRoles: jasmine.createSpy('getRoles').and.returnValue(Promise.resolve(mockRoles)), - updateUser: jasmine.createSpy('updateUser').and.callFake((id: string, body: any, success?: Function, error?: Function) => { - // Simulate success by returning updated user - const updated = { ...mockUser, ...body }; - if (success) success(updated); - }), - deleteUser: jasmine.createSpy('deleteUser').and.returnValue(Promise.resolve()), - updatePassword: jasmine.createSpy('updatePassword').and.callFake((_id: string, _auth: any) => Promise.resolve()) - }; - - const mockLoginService = { - query: jasmine.createSpy('query').and.callFake((opts: any) => { - const page = { - logins: opts && opts.url ? [{ id: 'log2', user: mockUser, timestamp: new Date().toISOString() }] : [{ id: 'log1', user: mockUser, timestamp: new Date().toISOString() }], - prev: undefined, - next: undefined - }; - return Promise.resolve(page); - }) - }; - - const mockDevicePagingService = { - constructDefault: jasmine.createSpy('constructDefault').and.returnValue({}), - refresh: jasmine.createSpy('refresh').and.returnValue(Promise.resolve()), - devices: jasmine.createSpy('devices').and.returnValue([]), - search: jasmine.createSpy('search').and.returnValue(Promise.resolve([])) - }; - - const mockTeam = { - addUser: jasmine.createSpy('addUser'), - removeUser: jasmine.createSpy('removeUser') - }; - - const mockDialog = { - open: jasmine.createSpy('open').and.returnValue({ - afterClosed: () => of({ confirmed: true }) - }) - }; - - const mockTeamsService = { - getTeams: jasmine.createSpy('getTeams').and.returnValue(of([{ items: [{ id: 't1', name: 'Team One' }], totalCount: 1 }])) - } as unknown as TeamsService; - - const mockEventsService = { - getEvents: jasmine.createSpy('getEvents').and.returnValue(of({ items: [{ id: 'e1', name: 'Event One' }], totalCount: 1 })) - } as unknown as EventsService; - - const mockLocalStorageService = { - getToken: jasmine.createSpy('getToken').and.returnValue('token-123') - }; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [FormsModule], - declarations: [UserDetailsComponent], - providers: [ - { provide: StateService, useValue: mockStateService }, - { provide: MatDialog, useValue: mockDialog }, - { provide: UserService, useValue: mockUserService }, - { provide: LoginService, useValue: mockLoginService }, - { provide: DevicePagingService, useValue: mockDevicePagingService }, - { provide: Team, useValue: mockTeam }, - { provide: TeamsService, useValue: mockTeamsService }, - { provide: EventsService, useValue: mockEventsService }, - { provide: LocalStorageService, useValue: mockLocalStorageService } - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(UserDetailsComponent); - component = fixture.componentInstance; - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should initialize and load user, roles, teams, events, devices, and logins', fakeAsync(() => { - component.ngOnInit(); - tick(); - expect(mockUserService.getUser).toHaveBeenCalledWith('test-user-id'); - expect(mockUserService.getRoles).toHaveBeenCalled(); - expect(mockTeamsService.getTeams).toHaveBeenCalled(); - expect(mockEventsService.getEvents).toHaveBeenCalled(); - expect(mockLoginService.query).toHaveBeenCalled(); - expect(mockDevicePagingService.refresh).toHaveBeenCalled(); - // team/event data sources populated from mocks - expect(component.userTeams.length).toBeGreaterThan(0); - expect(component.userEvents.length).toBeGreaterThan(0); - // first login set from initial query - expect(component.firstLogin).toBeTruthy(); - })); - - it('should check user permissions', () => { - component.ngOnInit(); - expect(component.hasUserEditPermission).toBe(true); - expect(component.hasUserDeletePermission).toBe(true); - }); - - it('should compute icon class based on user agent/app version', () => { - const base: any = { id: 'd1', uid: 'u', userAgent: '' }; - expect(component.iconClass({ ...base, appVersion: 'Web Client' } as any)).toContain('fa-desktop'); - expect(component.iconClass({ ...base, userAgent: 'Android 12' } as any)).toContain('fa-android'); - expect(component.iconClass({ ...base, userAgent: 'iOS 15' } as any)).toContain('fa-apple'); - expect(component.iconClass({ ...base, userAgent: 'Other' } as any)).toContain('fa-mobile'); - }); - - it('should navigate to team and event', () => { - component.gotoTeam({ id: 't1' }); - component.gotoEvent({ id: 'e1' }); - expect(mockStateService.go).toHaveBeenCalledWith('admin.team', { teamId: 't1' }); - expect(mockStateService.go).toHaveBeenCalledWith('admin.event', { eventId: 'e1' }); - }); - - it('should toggle edit user state and update phone', () => { - component.user = { ...mockUser }; - component.startEdit(); - expect(component.isEditingUser).toBeTrue(); - expect(component.editUser).toBeTruthy(); - component.updatePhoneNumber('999-999-9999'); - expect((component.editUser as any).phones[0].number).toBe('999-999-9999'); - component.cancelEdit(); - expect(component.isEditingUser).toBeFalse(); - expect(component.editUser).toBeNull(); - }); - - it('should save user successfully and reset edit state', fakeAsync(() => { - component.user = { ...mockUser }; - component.startEdit(); - (component.editUser as any).selectedRole = mockRoles[0]; - component.saveUser(); - tick(); - expect(mockUserService.updateUser).toHaveBeenCalled(); - expect(component.isEditingUser).toBeFalse(); - expect(component.editUser).toBeNull(); - expect(component.error).toBeNull(); - })); - - it('should handle save errors', fakeAsync(() => { - const erring = { - ...mockUserService, - updateUser: jasmine.createSpy('updateUser').and.callFake((_id: string, _body: any, _s: Function, e: Function) => { - e({ responseText: 'boom' }); - }) - }; - TestBed.resetTestingModule(); - TestBed.configureTestingModule({ - imports: [FormsModule], - declarations: [UserDetailsComponent], - providers: [ - { provide: StateService, useValue: mockStateService }, - { provide: MatDialog, useValue: mockDialog }, - { provide: UserService, useValue: erring }, - { provide: LoginService, useValue: mockLoginService }, - { provide: DevicePagingService, useValue: mockDevicePagingService }, - { provide: Team, useValue: mockTeam }, - { provide: TeamsService, useValue: mockTeamsService }, - { provide: EventsService, useValue: mockEventsService }, - { provide: LocalStorageService, useValue: mockLocalStorageService } - ] - }).compileComponents(); - const fix = TestBed.createComponent(UserDetailsComponent); - const comp = fix.componentInstance; - comp.user = { ...mockUser }; - comp.startEdit(); - comp.saveUser(); - tick(); - expect(comp.error).toBe('boom'); - })); - - it('should search logins and inject "No Results Found" when empty', fakeAsync(() => { - component.searchLogins('something').then(results => { - expect(results.length).toBe(1); - expect(results[0].userAgent).toBe('No Results Found'); - }); - tick(); - expect(component.isSearchingDevices).toBeFalse(); - })); - - it('should page logins and update flags', fakeAsync(() => { - component.ngOnInit(); - tick(); - component.pageLogin('/next'); - tick(); - expect(component.loginPage).toBeTruthy(); - expect(component.showNext).toBeTrue(); - })); - - it('should open confirm dialog and delete user on confirm', fakeAsync(() => { - component.user = { ...mockUser }; - component.confirmDeleteUser(component.user as any); - tick(); - expect(mockDialog.open).toHaveBeenCalled(); - expect(mockUserService.deleteUser).toHaveBeenCalledWith(component.user); - expect(mockStateService.go).toHaveBeenCalledWith('admin.users'); - })); - - it('should compute authenticated user icon URL', fakeAsync(() => { - component.user = { ...mockUser }; - const url = component.userIconImgUrl; - expect(url).toContain('access_token='); - expect(url).toContain('_dc='); - })); -}); diff --git a/web-app/admin/src/app/admin/admin-users/user-details/user-details.component.ts b/web-app/admin/src/app/admin/admin-users/user-details/user-details.component.ts deleted file mode 100644 index 43396f9e9..000000000 --- a/web-app/admin/src/app/admin/admin-users/user-details/user-details.component.ts +++ /dev/null @@ -1,1242 +0,0 @@ -import { - Component, - OnInit, - Inject, - ElementRef, - ViewChild -} from '@angular/core'; -import { NgForm } from '@angular/forms'; -import { StateService } from '@uirouter/angular'; -import { MatDialog } from '@angular/material/dialog'; -import { DeleteUserComponent } from '../delete-user/delete-user.component'; -import { TeamsService } from '../../admin-teams/teams-service'; -import { EventsService } from '../../admin-event/events.service'; -import { MatTableDataSource } from '@angular/material/table'; -import { PageEvent } from '@angular/material/paginator'; -import { - UserService, - LoginService, - DevicePagingService, - Team, - LocalStorageService -} from '../../../upgrade/ajs-upgraded-providers'; -import { User } from '../user'; -import * as moment from 'moment'; -import { zxcvbn, zxcvbnOptions } from '@zxcvbn-ts/core'; -import * as zxcvbnCommonPackage from '@zxcvbn-ts/language-common'; -import * as zxcvbnEnPackage from '@zxcvbn-ts/language-en'; -import { AdminBreadcrumb } from '../../admin-breadcrumb/admin-breadcrumb.model'; - -interface Device { - id: string; - uid: string; - userAgent: string; - appVersion?: string; - iconClass?: string; -} - -interface Login { - id: string; - user: User; - device?: Device; - timestamp: string; -} - -interface LoginPage { - logins: Login[]; - prev?: string; - next?: string; -} - -interface EditableUser extends User { - selectedRole?: any; -} - -interface IconMetadata { - type: 'none' | 'create' | 'upload'; - text?: string; - color?: string; -} - -const CURRENT_TEAMS_KEY = 'all'; -const CANDIDATE_TEAMS_KEY = 'all.search'; - -@Component({ - selector: 'mage-user-details', - templateUrl: './user-details.component.html', - styleUrls: ['./user-details.component.scss'] -}) -/** - * Admin component for viewing and managing a user's details, teams, events, devices, logins, and credentials. - */ -export class UserDetailsComponent implements OnInit { - user: User; - userTeams: any[] = []; - userEvents: any[] = []; - team: any = {}; - isSelf: boolean = false; - - hasUserEditPermission: boolean = false; - hasUserDeletePermission: boolean = false; - - filter: any = {}; - login = { - startDateOpened: false, - endDateOpened: false, - startDate: null, - endDate: null - }; - - firstLogin: Login | null = null; - showPrevious = false; - showNext = true; - deviceStateAndData: any; - deviceState = 'all'; - loginSearchResults: Device[] = []; - isSearchingDevices = false; - device: Device | null = null; - userTeamSearch = ''; - userEventSearch = ''; - userTeamStateAndData: any; - nonUserTeamSearch = ''; - nonUserTeam: any = null; - nonUserTeamSearchResults: any[] = []; - isSearching = false; - loginPage: LoginPage; - loginResultsLimit = 10; - endDate: Date; - devices: Device[] = []; - editTeam = false; - editEvent = false; - isEditingUser = false; - editUser: EditableUser | null = null; - roles: any[] = []; - passwordStrengthScore = 0; - passwordStrengthMap = { - 0: { type: 'danger', text: 'Weak' }, - 1: { type: 'warning', text: 'Fair' }, - 2: { type: 'info', text: 'Good' }, - 3: { type: 'primary', text: 'Strong' }, - 4: { type: 'success', text: 'Excellent' } - }; - saving = false; - error: string | null = null; - canEditRole = false; - canUpdatePassword = false; - passwordStrengthType: string | null = null; - passwordStrength: string | null = null; - passwordStatus: { status: 'success' | 'danger' | null; msg: string | null } = - { status: null, msg: null }; - changePassword = false; - newPassword = ''; - newPasswordConfirm = ''; - updatingPassword = false; - - iconPreviewUrl: string | null = null; - avatarPreviewUrl: string | null = null; - removeIconSelected = false; - iconMetadata: IconMetadata = { type: 'none' }; - @ViewChild('mapIconCanvas') mapIconCanvasRef?: ElementRef; - - teamsDataSource = new MatTableDataSource(); - eventsDataSource = new MatTableDataSource(); - teamsDisplayedColumns = ['teamContent']; - eventsDisplayedColumns = ['eventContent']; - - loadingTeams = true; - loadingEvents = true; - - totalUserTeams = 0; - totalUserEvents = 0; - userTeamsPageSize = 5; - userEventsPageSize = 5; - userTeamsPageIndex = 0; - userEventsPageIndex = 0; - pageSizeOptions = [5, 10, 25]; - - teamActionButtons: any[] = []; - - breadcrumbs: AdminBreadcrumb[] = [{ - title: 'Users', - iconClass: 'fa fa-user', - state: {name: "admin.users"} - }] - - constructor( - public stateService: StateService, - private dialog: MatDialog, - @Inject(UserService) private userService: any, - @Inject(LoginService) private loginService: any, - @Inject(DevicePagingService) private devicePagingService: any, - @Inject(Team) private teamService: any, - @Inject(LocalStorageService) private localStorageService: any, - @Inject(TeamsService) private teamsService: TeamsService, - @Inject(EventsService) private eventsService: EventsService, - ) { - this.deviceStateAndData = this.devicePagingService.constructDefault(); - } - - /** - * Initialize component state, load user, roles, teams, events, devices, and login activity. - */ - ngOnInit(): void { - const userId = this.stateService.params.userId; - if (!userId) return; - - this.filter = { - user: { id: userId } - }; - - this.hasUserEditPermission = - this.userService.myself?.role?.permissions?.includes('UPDATE_USER') || - false; - this.hasUserDeletePermission = - this.userService.myself?.role?.permissions?.includes('DELETE_USER') || - false; - this.canEditRole = - this.userService.myself?.role?.permissions?.includes( - 'UPDATE_USER_ROLE' - ) || false; - this.canUpdatePassword = - this.userService.myself?.role?.permissions?.includes( - 'UPDATE_USER_ROLE' - ) || false; - - this.userService.getRoles().then((roles: any[]) => { - this.roles = roles; - this.setSelectedRoleFromUser(); - }); - - this.userService.getUser(userId).then((user: User) => { - this.user = user; - // determine if viewing own profile to adjust UI (e.g., hide disable card) - this.isSelf = - !!this.userService.myself && this.userService.myself.id === user.id; - - const anyUser: any = user as any; - if (anyUser.icon && anyUser.icon.type === 'create') { - this.iconMetadata = { - type: 'create', - text: anyUser.icon.text, - color: anyUser.icon.color || this.iconMetadata.color - }; - } else if (user.iconUrl) { - this.iconMetadata = { type: 'upload' }; - } else { - this.iconMetadata = { type: 'none' }; - } - - this.loadUserTeams(); - this.loadUserEvents(); - this.setupActionButtons(); - - this.setSelectedRoleFromUser(); - - this.breadcrumbs.push({title: user.displayName || "Unknown User"}); - }); - - this.loginService - .query({ filter: this.filter, limit: this.loginResultsLimit }) - .then((loginPage: LoginPage) => { - this.loginPage = loginPage; - if (loginPage.logins.length) { - this.firstLogin = loginPage.logins[0]; - } - }); - - delete this.deviceStateAndData['registered']; - delete this.deviceStateAndData['unregistered']; - - this.devicePagingService.refresh(this.deviceStateAndData).then(() => { - this.devices = this.devicePagingService.devices( - this.deviceStateAndData[this.deviceState] - ); - }); - - try { - zxcvbnOptions.setOptions({ - dictionary: { - ...zxcvbnCommonPackage.dictionary, - ...zxcvbnEnPackage.dictionary - }, - graphs: zxcvbnCommonPackage.adjacencyGraphs, - translations: zxcvbnEnPackage.translations - }); - } catch {} - } - - /** - * Load teams that include the current user using pagination and optional search. - */ - private loadUserTeams(): void { - if (!this.user?.id) return; - - this.teamsService - .getTeams({ - with_members: [this.user.id], - term: this.userTeamSearch || undefined, - limit: this.userTeamsPageSize, - start: String(this.userTeamsPageIndex), - populate: true - }) - .subscribe({ - next: (results: any) => { - if (Array.isArray(results) && results.length && results[0]?.items) { - const page = results[0]; - this.userTeams = page.items || []; - this.totalUserTeams = page.totalCount ?? this.userTeams.length; - } else if (Array.isArray(results)) { - this.userTeams = results; - this.totalUserTeams = results.length; - } else if (results?.items) { - this.userTeams = results.items || []; - this.totalUserTeams = results.totalCount ?? this.userTeams.length; - } else { - this.userTeams = []; - this.totalUserTeams = 0; - } - this.teamsDataSource.data = this.userTeams; - this.loadingTeams = false; - }, - error: () => { - this.userTeams = []; - this.totalUserTeams = 0; - this.teamsDataSource.data = []; - this.loadingTeams = false; - } - }); - } - - /** - * Load events the current user can access using pagination and optional search. - */ - private loadUserEvents(): void { - if (!this.user?.id) return; - - this.eventsService - .getEvents({ - userId: this.user.id, - term: this.userEventSearch || undefined, - page: this.userEventsPageIndex, - page_size: this.userEventsPageSize - }) - .subscribe({ - next: (results) => { - this.userEvents = results.items || []; - this.totalUserEvents = results.totalCount || this.userEvents.length; - this.eventsDataSource.data = this.userEvents; - this.loadingEvents = false; - }, - error: () => { - this.userEvents = []; - this.totalUserEvents = 0; - this.eventsDataSource.data = []; - this.loadingEvents = false; - } - }); - } - - /** - * Create or update action buttons based on edit state and permissions. - */ - setupActionButtons(): void { - this.teamActionButtons = []; - - if (this.hasUserEditPermission) { - this.teamActionButtons.push({ - label: this.editTeam ? 'Done' : 'Edit Teams', - action: () => this.toggleEditTeams(), - type: this.editTeam ? 'btn-primary' : 'btn-secondary' - }); - } - } - - /** - * Toggle edit mode for teams table. - */ - toggleEditTeams(): void { - this.editTeam = !this.editTeam; - this.setupActionButtons(); - } - - /** - * Toggle edit mode for events table. - */ - toggleEditEvents(): void { - this.editEvent = !this.editEvent; - this.setupActionButtons(); - } - - /** - * Handle pagination changes for the user's teams. - * @param event - Angular Material page change event - */ - onUserTeamsPageChange(event: PageEvent): void { - this.userTeamsPageSize = event.pageSize; - this.userTeamsPageIndex = event.pageIndex; - this.loadUserTeams(); - } - - /** - * Handle pagination changes for the user's events. - * @param event - Angular Material page change event - */ - onUserEventsPageChange(event: PageEvent): void { - this.userEventsPageSize = event.pageSize; - this.userEventsPageIndex = event.pageIndex; - this.loadUserEvents(); - } - - /** - * Search the user's teams by name and reset pagination. - * @param searchTerm - Text to filter team names - */ - searchUserTeam(searchTerm?: string): void { - this.userTeamSearch = searchTerm || ''; - this.userTeamsPageIndex = 0; - this.loadUserTeams(); - } - - /** - * Search events the user can access and reset pagination. - * @param searchTerm - Text to filter event names - */ - searchUserEvent(searchTerm?: string): void { - this.userEventSearch = searchTerm || ''; - this.userEventsPageIndex = 0; - this.loadUserEvents(); - } - - /** - * Search for teams not containing the user (placeholder stub). - * @param searchString - Search text - * @returns Promise resolving to a list of matching teams - */ - searchNonUserTeams(searchString: string): Promise { - this.isSearching = true; - - this.nonUserTeamSearchResults = []; - if (this.nonUserTeamSearchResults.length === 0) { - const noTeam = { - name: 'No Results Found' - }; - this.nonUserTeamSearchResults.push(noTeam); - } - - this.isSearching = false; - return Promise.resolve(this.nonUserTeamSearchResults); - } - - /** - * Determine a device icon class from the device's user agent or app version. - * @param device - Device information - * @returns FontAwesome class string - */ - iconClass(device: Device): string { - if (!device) return ''; - - if (device.iconClass) return device.iconClass; - - const userAgent = device.userAgent || ''; - - if (device.appVersion === 'Web Client') { - device.iconClass = 'fa-desktop admin-desktop-icon-xs'; - } else if (userAgent.toLowerCase().indexOf('android') !== -1) { - device.iconClass = 'fa-android admin-android-icon-xs'; - } else if (userAgent.toLowerCase().indexOf('ios') !== -1) { - device.iconClass = 'fa-apple admin-apple-icon-xs'; - } else { - device.iconClass = 'fa-mobile admin-generic-icon-xs'; - } - - return device.iconClass; - } - - /** - * Navigate to the edit user state for a given user. - * @param user - User to edit - */ - editUserNavigate(user: User): void { - this.stateService.go('admin.editUser', { userId: user.id }); - } - - /** - * Toggle user edit mode. - */ - toggleEditUser(): void { - if (this.isEditingUser) { - this.cancelEdit(); - } else { - this.startEdit(); - } - } - - /** - * Begin editing the current user's profile and icon metadata. - */ - startEdit(): void { - this.isEditingUser = true; - this.editUser = { ...this.user } as EditableUser; - - this.iconPreviewUrl = null; - this.avatarPreviewUrl = null; - this.removeIconSelected = false; - if (!this.iconMetadata) this.iconMetadata = { type: 'none' }; - if (this.iconMetadata.type === 'create') { - if (!this.iconMetadata.text) this.setIconInitials(this.user.displayName); - if (!this.iconMetadata.color) - this.iconMetadata.color = this.randomColor(); - setTimeout(() => this.updateMapIconCanvas(), 0); - } - - this.setSelectedRoleFromUser(); - - this.error = null; - } - - /** - * Cancel editing and reset temporary state. - */ - cancelEdit(): void { - this.isEditingUser = false; - this.editUser = null; - this.saving = false; - this.error = null; - this.iconPreviewUrl = null; - this.avatarPreviewUrl = null; - this.removeIconSelected = false; - } - - /** - * Get the current editable phone number from either the edit buffer or legacy fields. - * @returns The phone number string or empty string - */ - getPhoneNumber(): string { - return ( - this.editUser?.phones?.[0]?.number || - (this.editUser as any)?.phone || - (this.user as any)?.phone || - '' - ); - } - - /** - * Update the editable phone number, initializing array structures as needed. - * @param value - Phone number text - */ - updatePhoneNumber(value: string): void { - if (!this.editUser) return; - - if (!this.editUser.phones) { - this.editUser.phones = [] as any; - } - - if (!this.editUser.phones[0]) { - (this.editUser.phones as any)[0] = { type: 'Main', number: '' }; - } - - (this.editUser.phones as any)[0].number = value; - } - - /** - * Set the selected role in the edit model based on the user's existing role. - */ - private setSelectedRoleFromUser(): void { - if (!this.canEditRole || !this.user || !this.roles?.length) return; - if (!this.editUser) return; - - const userRole: any = (this.user as any).role; - const roleMatch = this.roles.find((role: any) => { - return ( - role?.id === userRole?.id || - role?.name === userRole?.name || - role?.name === userRole || - role?.id === userRole - ); - }); - - if (roleMatch) { - this.editUser.selectedRole = roleMatch; - } - } - - /** - * Handle changes to the map icon type (none/create/upload) and sync UI state. - */ - iconTypeChanged(): void { - if (this.iconMetadata.type === 'create') { - this.setIconInitials(this.user.displayName); - if (!this.iconMetadata.color) - this.iconMetadata.color = this.randomColor(); - if (this.editUser) (this.editUser as any).icon = null; - this.iconPreviewUrl = null; - this.removeIconSelected = false; - setTimeout(() => this.updateMapIconCanvas(), 0); - } else if (this.iconMetadata.type === 'upload') { - this.removeIconSelected = false; - } else { - this.iconPreviewUrl = null; - if (this.editUser) { - (this.editUser as any).icon = null; - } - this.removeIconSelected = true; - } - } - - /** - * Update the generated icon initials text. - * @param value - Initials text (up to 2 characters) - */ - onCreateTextChanged(value: string): void { - this.iconMetadata.text = (value || '').toUpperCase().slice(0, 2); - this.updateMapIconCanvas(); - } - - /** - * Update the generated icon color. - * @param value - Hex color value - */ - onCreateColorChanged(value: string): void { - this.iconMetadata.color = value; - this.updateMapIconCanvas(); - } - - /** - * Initialize icon initials from a name if not already set. - * @param name - Display name - */ - private setIconInitials(name: string): void { - if (this.iconMetadata.text) return; - const initials = (name || '').match(/\b\w/g) || []; - this.iconMetadata.text = ( - (initials.shift() || '') + (initials.pop() || '') - ).toUpperCase(); - } - - /** - * Generate a random hex color string. - * @returns Hex color - */ - private randomColor(): string { - return '#' + Math.floor(Math.random() * 16777215).toString(16); - } - - /** - * Redraw the map icon canvas based on current create metadata. - */ - private updateMapIconCanvas(): void { - const canvas = this.mapIconCanvasRef?.nativeElement; - if (!canvas || this.iconMetadata.type !== 'create') return; - const color = this.iconMetadata.color || '#007bff'; - const text = (this.iconMetadata.text || '').toUpperCase().slice(0, 2); - this.drawMarker(canvas, color, text); - } - - /** - * Draw a pin-shaped marker with text onto a canvas. - * @param canvas - Target canvas - * @param color - Marker color - * @param text - Initials text - */ - private drawMarker( - canvas: HTMLCanvasElement, - color: string, - text: string - ): void { - const ctx = canvas.getContext('2d'); - if (!ctx) return; - // Use the canvas' existing size (set by template) and scale drawing accordingly - const size = Math.min(canvas.width || 75, canvas.height || 75); - canvas.width = size; - canvas.height = size; - - ctx.clearRect(0, 0, canvas.width, canvas.height); - - ctx.strokeStyle = this.hexToRgb(color, 1); - ctx.fillStyle = this.hexToRgb(color, 1); - - const centerX = size / 2; - const circleY = size * (17 / 44); // proportional to old 44px design - const circleR = size * (16 / 44); - const innerR = size * (13 / 44); - const baseY = size * (43 / 44); - const leftX = size * (9 / 44); - const rightX = size * (35 / 44); - const midY = size * (26 / 44); - - ctx.beginPath(); - ctx.moveTo(centerX, baseY); - ctx.lineTo(leftX, midY); - ctx.lineTo(rightX, midY); - ctx.lineTo(centerX, baseY); - ctx.closePath(); - ctx.stroke(); - ctx.fill(); - - ctx.beginPath(); - ctx.arc(centerX, circleY, circleR, 0, 2 * Math.PI); - ctx.fill(); - ctx.stroke(); - - ctx.fillStyle = '#FFFFFF'; - ctx.strokeStyle = '#FFFFFF'; - - ctx.beginPath(); - ctx.arc(centerX, circleY, innerR, 0, 2 * Math.PI); - ctx.fill(); - ctx.stroke(); - - ctx.textAlign = 'center'; - ctx.textBaseline = 'middle'; - const fontSize = Math.round(size * (14 / 44)); - ctx.font = `500 ${fontSize}px "RobotoMono"`; - ctx.fillStyle = this.hexToRgb(color, 1); - ctx.fillText(text || '', centerX, circleY); - } - - /** - * Convert a canvas to a PNG blob. - * @param canvas - Source canvas - * @returns PNG Blob or undefined if conversion fails - */ - private canvasToPng(canvas: HTMLCanvasElement): Blob | undefined { - const icon = canvas.toDataURL('image/png'); - if (!icon) return undefined; - const byteString = atob(icon.split(',')[1]); - const ab = new ArrayBuffer(byteString.length); - const ia = new Uint8Array(ab); - for (let i = 0; i < byteString.length; i++) { - ia[i] = byteString.charCodeAt(i); - } - return new Blob([ab], { type: 'image/png' }); - } - - /** - * Convert a hex color to an rgba() string. - * @param hex - Hex color string - * @param opacity - Alpha value (0-1) - * @returns rgba color string - */ - private hexToRgb(hex: string, opacity: number): string { - hex = (hex || '#000000').replace('#', ''); - const r = parseInt(hex.substring(0, 2), 16); - const g = parseInt(hex.substring(2, 4), 16); - const b = parseInt(hex.substring(4, 6), 16); - return `rgba(${r},${g},${b},${opacity})`; - } - - /** - * Handle uploaded icon file selection and preview it. - * @param event - File input change event - */ - onIconChanged(event: Event): void { - if (!this.editUser) return; - const input = event.target as HTMLInputElement; - const file = input.files && input.files[0]; - if (!file) { - this.iconPreviewUrl = null; - return; - } - - this.editUser.icon = file as any; - this.removeIconSelected = false; - this.iconMetadata.type = 'upload'; - - const reader = new FileReader(); - reader.onload = (e: any) => { - this.iconPreviewUrl = e.target.result as string; - }; - reader.readAsDataURL(file); - } - - /** - * Handle uploaded avatar file selection and preview it. - * @param event - File input change event - */ - onAvatarChanged(event: Event): void { - if (!this.editUser) return; - const input = event.target as HTMLInputElement; - const file = input.files && input.files[0]; - if (!file) { - this.avatarPreviewUrl = null; - (this.editUser as any).avatar = null; - return; - } - - (this.editUser as any).avatar = file; - - const reader = new FileReader(); - reader.onload = (e: any) => { - this.avatarPreviewUrl = e.target.result as string; - }; - reader.readAsDataURL(file); - } - - /** - * Mark the icon for removal and clear previews. - */ - removeIcon(): void { - if (!this.editUser) return; - this.removeIconSelected = true; - this.iconPreviewUrl = null; - this.iconMetadata = { type: 'none' }; - (this.editUser as any).icon = null; - } - - /** - * Persist edits to the user, including role, phone, and icon changes. - */ - saveUser(): void { - if (!this.editUser) return; - - this.saving = true; - this.error = null; - - const userToSave: any = { - id: this.editUser.id, - username: this.editUser.username, - displayName: this.editUser.displayName, - email: this.editUser.email - }; - - if (this.canEditRole && this.editUser.selectedRole) { - userToSave['roleId'] = this.editUser.selectedRole.id; - } - - if (this.editUser.phones && this.editUser.phones.length) { - userToSave['phone'] = this.editUser.phones[0].number; - } - - if (this.iconMetadata.type === 'none') { - userToSave['icon'] = null; - userToSave['iconMetadata'] = JSON.stringify({ type: 'none' }); - } else if (this.iconMetadata.type === 'create') { - const canvas = this.mapIconCanvasRef?.nativeElement; - if (canvas) { - const blob = this.canvasToPng(canvas); - if (blob) userToSave['icon'] = blob as any; - } - userToSave['iconMetadata'] = JSON.stringify({ - type: 'create', - text: this.iconMetadata.text, - color: this.iconMetadata.color - }); - } else if (this.iconMetadata.type === 'upload') { - if ((this.editUser as any).icon instanceof File) { - userToSave['icon'] = (this.editUser as any).icon; - } - userToSave['iconMetadata'] = JSON.stringify({ type: 'upload' }); - } - - if ((this.editUser as any).avatar instanceof File) { - userToSave['avatar'] = (this.editUser as any).avatar; - } - - const success = (updatedUser: User) => { - this.user = updatedUser; - this.isEditingUser = false; - this.editUser = null; - this.saving = false; - this.iconPreviewUrl = null; - this.avatarPreviewUrl = null; - this.removeIconSelected = false; - }; - - const error = (response: any) => { - this.error = - response.responseText || response.data || 'Failed to update user'; - this.saving = false; - }; - - this.userService.updateUser(this.editUser.id, userToSave, success, error); - } - - /** - * Add the current user to the selected non-member team. - */ - addUserToTeam(): void { - this.teamService.addUser( - { id: this.nonUserTeam.id }, - this.user, - (team: any) => { - this.userTeams.push(team); - this.nonUserTeam = null; - } - ); - } - - /** - * Remove the user from a team. - * @param $event - Click event to stop propagation - * @param team - Team to remove - */ - removeUserFromTeam($event: MouseEvent, team: any): void { - $event.stopPropagation(); - const wasLastItemOnPage = (this.userTeams?.length || 0) <= 1; - - this.teamService.removeUser( - { id: team.id, userId: this.user.id }, - (removedTeam: any) => { - // Optimistically update total count - this.totalUserTeams = Math.max(0, (this.totalUserTeams || 0) - 1); - - // If we removed the last item on a non-first page, go back a page - if (wasLastItemOnPage && this.userTeamsPageIndex > 0) { - this.userTeamsPageIndex = this.userTeamsPageIndex - 1; - } - - // Refresh the current page from the server so rows and totals are accurate - this.loadUserTeams(); - } - ); - } - - /** - * Navigate to an event in the admin area. - * @param userEvent - Target event - */ - gotoEvent(userEvent: any): void { - this.stateService.go('admin.event', { eventId: userEvent.id }); - } - - /** - * Delete a user and navigate back to the users list. - * @param user - User to delete - */ - deleteUser(user: User): void { - this.userService - .deleteUser(user) - .then(() => { - this.stateService.go('admin.users'); - }) - .catch((err) => { - console.error('Failed to delete user:', err); - }); - } - - /** - * Open a confirmation dialog before deleting the user. - */ - confirmDeleteUser(user: User): void { - const dialogRef = this.dialog.open(DeleteUserComponent, { - data: { user } - }); - - dialogRef.afterClosed().subscribe((result?: { confirmed?: boolean }) => { - if (result?.confirmed) { - this.deleteUser(user); - } - }); - } - - /** - * Activate a user account. - * @param user - User to activate - */ - activateUser(user: User): void { - user.active = true; - this.userService.updateUser(user.id, user, () => {}); - } - - /** - * Enable a user account. - * @param user - User to enable - */ - enableUser(user: User): void { - user.enabled = true; - this.userService.updateUser(user.id, user, () => {}); - } - - /** - * Disable a user account. - * @param user - User to disable - */ - disableUser(user: User): void { - user.enabled = false; - this.userService.updateUser(user.id, user, () => {}); - } - - /** - * Navigate to a team in the admin area. - * @param team - Target team - */ - gotoTeam(team: any): void { - this.stateService.go('admin.team', { teamId: team.id }); - } - - /** - * Navigate to the details page for a device. - * @param device - Device to view - */ - gotoDevice(device: Device): void { - if (!device) return; - this.stateService.go('admin.device', { deviceId: device.id }); - } - - /** - * Page through login records using a provided URL from the API. - * @param url - Next/previous page URL - */ - pageLogin(url: string): void { - this.loginService - .query({ url: url, filter: this.filter, limit: this.loginResultsLimit }) - .then((loginPage: LoginPage) => { - if (loginPage.logins.length) { - this.loginPage = loginPage; - this.showNext = loginPage.logins.length !== 0; - this.showPrevious = loginPage.logins[0].id !== this.firstLogin?.id; - } - }); - } - - /** - * Search for devices associated with login activity. - * @param searchString - Regex or plain text search - * @returns Promise resolving to matching devices - */ - searchLogins(searchString: string): Promise { - this.isSearchingDevices = true; - - if (searchString == null) { - searchString = '.*'; - } - - return this.devicePagingService - .search(this.deviceStateAndData[this.deviceState], searchString) - .then((devices: Device[]) => { - this.loginSearchResults = devices; - this.isSearchingDevices = false; - - if (this.loginSearchResults.length === 0) { - const noDevice = { - userAgent: 'No Results Found' - } as Device; - this.loginSearchResults.push(noDevice); - } - - return this.loginSearchResults; - }); - } - - /** - * Apply login filters (device/date) and refresh results. - */ - filterLogins(): void { - this.filter.device = this.device; - this.filter.startDate = this.login.startDate; - if (this.login.endDate) { - this.endDate = moment(this.login.endDate).endOf('day').toDate(); - } - - this.loginService - .query({ filter: this.filter, limit: this.loginResultsLimit }) - .then((loginPage: LoginPage) => { - this.showNext = loginPage.logins.length !== 0; - this.showPrevious = false; - this.loginPage = loginPage; - }); - } - - /** - * Open the date picker for login start date. - * @param event - Mouse event to prevent default behavior - */ - openLoginStart(event: Event): void { - event.preventDefault(); - event.stopPropagation(); - - this.login.startDateOpened = true; - } - - /** - * Open the date picker for login end date. - * @param event - Mouse event to prevent default behavior - */ - openLoginEnd(event: Event): void { - event.preventDefault(); - event.stopPropagation(); - - this.login.endDateOpened = true; - } - - /** - * Update the login results limit and refetch. - */ - loginResultsLimitChanged(): void { - this.filterLogins(); - } - - /** - * Trigger login filtering when date range changes. - */ - dateFilterChanged(): void { - this.filterLogins(); - } - - /** - * Convert a timestamp to a human-friendly relative time. - * @param timestamp - ISO timestamp - * @returns Relative time string - */ - fromNow(timestamp: string): string { - return moment(timestamp).fromNow(); - } - - /** - * Format a timestamp for display. - * @param timestamp - ISO timestamp - * @returns Formatted date string - */ - formatDate(timestamp: string): string { - return moment(timestamp).format('MMM D YYYY hh:mm:ss A'); - } - - /** - * Get the authenticated URL for the user's icon (appends access token and cache-buster). - * @returns Authenticated URL or null if none - */ - get userIconImgUrl(): string | null { - if (!this.user?.iconUrl) return null; - return this.makeAuthenticatedUrl(this.user.iconUrl); - } - - /** - * Get the authenticated URL for the user's avatar (appends access token and cache-buster). - * @returns Authenticated URL or null if none - */ - get userAvatarImgUrl(): string | null { - if (!this.user?.avatarUrl) return null; - return this.makeAuthenticatedUrl(this.user.avatarUrl as any); - } - - /** - * Append an access token (and optional cache buster) to a URL. - * @param url - Base URL - * @returns Authenticated URL - */ - private makeAuthenticatedUrl(url: string): string { - if (!url) return ''; - const token = this.localStorageService?.getToken?.(); - if (!token) return url; - const sep = url.includes('?') ? '&' : '?'; - const dc = (this.user as any)?.lastUpdated - ? `&_dc=${(this.user as any).lastUpdated}` - : ''; - return `${url}${sep}access_token=${token}${dc}`; - } - - /** - * Update password strength indicators for the provided password. - * @param password - Candidate password - */ - passwordChanged(password: string): void { - if (password && password.length > 0) { - const score = zxcvbn( - password, - [this.user?.username, this.user?.displayName, this.user?.email].filter( - Boolean - ) as string[] - ).score; - this.passwordStrengthScore = score + 1; - this.passwordStrengthType = - this.passwordStrengthMap[score as 0 | 1 | 2 | 3 | 4].type; - this.passwordStrength = - this.passwordStrengthMap[score as 0 | 1 | 2 | 3 | 4].text; - } else { - this.passwordStrengthScore = 0; - this.passwordStrengthType = null; - this.passwordStrength = null; - } - } - - /** - * Update the user's password after simple validation. - * @param form - Optional template-driven form for validation and reset - */ - updatePassword(form?: NgForm): void { - if (!this.user?.id) return; - this.passwordStatus = { status: null, msg: null }; - - if (form && !form.valid) { - this.passwordStatus = { - status: 'danger', - msg: 'Please fix the errors in the form.' - }; - return; - } - - if (!this.newPassword || !this.newPasswordConfirm) { - this.passwordStatus = { - status: 'danger', - msg: 'Please enter and confirm the new password.' - }; - return; - } - if (this.newPassword !== this.newPasswordConfirm) { - this.passwordStatus = { - status: 'danger', - msg: 'Passwords do not match.' - }; - return; - } - - this.updatingPassword = true; - const authentication = { - password: this.newPassword, - passwordconfirm: this.newPasswordConfirm - }; - const onSuccess = () => { - this.passwordStrengthScore = 0; - this.passwordStrengthType = null; - this.passwordStrength = null; - this.newPassword = ''; - this.newPasswordConfirm = ''; - this.updatingPassword = false; - this.passwordStatus = { - status: 'success', - msg: 'Password successfully updated.' - }; - if (form) form.resetForm(); - this.changePassword = false; - this.cancelEdit(); - }; - const onError = (response: any) => { - this.updatingPassword = false; - const msg = - response?.data || response?.responseText || 'Failed to update password'; - this.passwordStatus = { status: 'danger', msg }; - }; - - const result = this.userService.updatePassword( - this.user.id, - authentication - ); - if (result && typeof result.then === 'function') { - result.then(onSuccess, onError); - } else { - try { - this.userService.updatePassword( - this.user.id, - authentication, - onSuccess, - onError - ); - } catch (e) { - onError(e); - } - } - } - - /** - * Cancel password change and clear related UI state. - */ - cancelPasswordChange(): void { - this.changePassword = false; - this.newPassword = ''; - this.newPasswordConfirm = ''; - this.passwordStrengthScore = 0; - this.passwordStrengthType = null; - this.passwordStrength = null; - this.passwordStatus = { status: null, msg: null }; - } -} diff --git a/web-app/admin/src/app/admin/admin-users/user.d.ts b/web-app/admin/src/app/admin/admin-users/user.d.ts deleted file mode 100644 index f0e55802b..000000000 --- a/web-app/admin/src/app/admin/admin-users/user.d.ts +++ /dev/null @@ -1,38 +0,0 @@ -export interface Role { - id: string; - name: string; - description?: string; - permissions: string[]; -} - -export interface UserPhone { - type: string; - number: string; -} - -export interface UserIcon { - color?: string; - contentType?: string; - size?: number; - text?: string; - type: 'create' | 'upload' | 'none'; -} - -export interface User { - id: string; - username: string; - displayName: string; - active: boolean; - enabled: boolean; - authentication: any; - createdAt?: string; - lastUpdated?: string; - role: Role; - email?: string; - avatarUrl?: string; - icon?: UserIcon | File | null; - iconUrl?: string; - phones: UserPhone[]; - recentEventIds?: number[]; - [key: string]: any; -} diff --git a/web-app/admin/src/app/admin/admin.module.ts b/web-app/admin/src/app/admin/admin.module.ts index cea1da710..1e7fdfecb 100644 --- a/web-app/admin/src/app/admin/admin.module.ts +++ b/web-app/admin/src/app/admin/admin.module.ts @@ -1,14 +1,14 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { AdminPluginTabContentComponent } from './plugin-tab/plugin-tab-content.component'; -import { AdminUsersModule } from './admin-users/admin-users.module'; -import { AdminNavComponent } from './admin-nav/admin-nav'; -import { AdminBreadcrumbModule } from './admin-breadcrumb/admin-breadcrumb.module'; +import { NgModule } from '@angular/core' +import { AdminPluginTabContentComponent } from './plugin-tab/plugin-tab-content.component' @NgModule({ - imports: [CommonModule, FormsModule, AdminUsersModule, AdminBreadcrumbModule], - declarations: [AdminPluginTabContentComponent, AdminNavComponent], - exports: [AdminPluginTabContentComponent, AdminUsersModule, AdminNavComponent] + declarations: [ + AdminPluginTabContentComponent + ], + exports: [ + AdminPluginTabContentComponent + ] }) -export class AdminModule { } +export class AdminModule { + +} \ No newline at end of file diff --git a/web-app/admin/src/app/app.module.ts b/web-app/admin/src/app/app.module.ts index c003c32d3..b625de47b 100644 --- a/web-app/admin/src/app/app.module.ts +++ b/web-app/admin/src/app/app.module.ts @@ -10,12 +10,7 @@ import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; import { ScrollingModule } from '@angular/cdk/scrolling'; import { DragDropModule } from '@angular/cdk/drag-drop'; -import { - SaturationModule, - HueModule, - CheckboardModule, - AlphaModule -} from 'ngx-color'; +import { SaturationModule, HueModule, CheckboardModule, AlphaModule } from 'ngx-color'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatBadgeModule } from '@angular/material/badge'; @@ -50,9 +45,9 @@ import { MatTooltipModule } from '@angular/material/tooltip'; import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { MatStepperModule } from '@angular/material/stepper'; -import { MatDatetimepickerModule } from '@mat-datetimepicker/core'; -import { MatMomentDatetimeModule } from '@mat-datetimepicker/moment'; -import { InputMaskModule } from '@ngneat/input-mask'; +import { MatDatetimepickerModule } from '@mat-datetimepicker/core' +import { MatMomentDatetimeModule } from '@mat-datetimepicker/moment' +import { InputMaskModule } from '@ngneat/input-mask' import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; import { ColorPickerComponent } from './color-picker/color-picker.component'; @@ -81,11 +76,7 @@ import { teamProvider, eventProvider, authenticationConfigurationServiceProvider, - userPagingServiceProvider, - deviceServiceProvider, - devicePagingServiceProvider, - loginServiceProvider, - layerServiceProvider + userPagingServiceProvider } from './upgrade/ajs-upgraded-providers'; import { @@ -110,16 +101,13 @@ import { import { FeedItemComponent } from './feed/feed-item/feed-item.component'; import { FeedItemSummaryModule } from './feed/feed-item/feed-item-summary/feed-item-summary.module'; import { AdminFeedsModule } from './admin/admin-feeds/admin-feeds.module'; -import { StaticIconModule } from '@ngageoint/mage.web-core-lib/static-icon'; -import { MageCommonModule } from '@ngageoint/mage.web-core-lib/common'; -import { AdminModule } from './admin/admin.module'; +import { StaticIconModule } from '@ngageoint/mage.web-core-lib/static-icon' +import { MageCommonModule } from '@ngageoint/mage.web-core-lib/common' +import { AdminModule } from './admin/admin.module' import { AdminSettingsComponent } from './admin/admin-settings/admin-settings.component'; import { AdminBreadcrumbModule } from './admin/admin-breadcrumb/admin-breadcrumb.module'; import { ContactInfoComponent } from './admin/admin-settings/admin-settings'; -import { - SecurityBannerComponent, - SecurityDisclaimerComponent -} from './admin/admin-settings/admin-settings'; +import { SecurityBannerComponent, SecurityDisclaimerComponent } from './admin/admin-settings/admin-settings'; import { DatetimePickerComponent } from './datetime-picker/datetime-picker.component'; import { CommonModule } from '@angular/common'; import { ObservationEditFormPickerComponent } from './observation/observation-edit/observation-edit-form-picker.component'; @@ -127,7 +115,7 @@ import { ObservationEditDiscardComponent } from './observation/observation-edit/ import { ObservationEditAttachmentComponent } from './observation/observation-edit/observation-edit-attachment/observation-edit-attachment.component'; import { ObservationEditPasswordComponent } from './observation/observation-edit/observation-edit-password/observation-edit-password.component'; import { ContactComponent } from './contact/contact.component'; -import { ContactDialogComponent } from './contact/contact-dialog.component'; +import { ContactDialogComponent } from "./contact/contact-dialog.component"; import { AdminAuthenticationOidcComponent } from './admin/admin-authentication/admin-authentication-oidc/admin-authentication-oidc.component'; import { AuthenticationDeleteComponent } from './admin/admin-authentication/admin-authentication-delete/admin-authentication-delete.component'; import { AdminAuthenticationLocalComponent } from './admin/admin-authentication/admin-authentication-local/admin-authentication-local.component'; @@ -142,15 +130,10 @@ import { AdminAuthenticationSAMLComponent } from './admin/admin-authentication/a import { ButtonPreviewComponent } from './admin/admin-authentication/admin-authentication-create/button-preview/button-preview.component'; import { AdminAuthenticationSettingsComponent } from './admin/admin-authentication/admin-authentication-settings.component'; import { AdminSettingsUnsavedComponent } from './admin/admin-settings/admin-settings-unsaved/admin-settings-unsaved.component'; -import { AdminEventFormModule } from './admin/admin-event/admin-event-form/admin-event-form.module'; +import { AdminEventFormPreviewComponent } from './admin/admin-event/admin-event-form/admin-event-form-preview/admin-event-form-preview.component'; +import { AdminEventFormPreviewDialogComponent } from './admin/admin-event/admin-event-form/admin-event-form-preview/admin-event-form-preview-dialog.component'; import { AdminMapComponent } from './admin/admin-map/admin-map.component'; -import { AdminTeamsModule } from './admin/admin-teams/admin-teams.module'; -import { AdminEventsModule } from './admin/admin-event/admin-events.module'; -import { AdminLayersModule } from './admin/admin-layers/admin-layers.module'; -import { AdminDashboardModule } from './admin/admin-dashboard/admin-dashboard.module'; -import { MatMenuModule } from '@angular/material/menu'; -import { AdminUsersModule } from './admin/admin-users/admin-users.module'; -import { ObservationModule } from './observation/observation.module'; + @NgModule({ declarations: [ @@ -158,7 +141,27 @@ import { ObservationModule } from './observation/observation.module'; DMSValidatorDirective, MGRSValidatorDirective, FeedItemComponent, + ObservationEditComponent, + ObservationEditAttachmentComponent, + ObservationEditFormComponent, + ObservationEditFormPickerComponent, + ObservationEditMultiselectComponent, + ObservationEditCheckboxComponent, + ObservationEditSelectComponent, + ObservationEditEmailComponent, + ObservationEditNumberComponent, + ObservationEditTextComponent, + ObservationEditTextareaComponent, + ObservationEditRadioComponent, + ObservationEditGeometryComponent, + ObservationEditGeometryMapComponent, + ObservationEditGeometryFormComponent, + ObservationEditDateComponent, + MapClipComponent, BootstrapComponent, + AttachmentComponent, + FilenamePipe, + AttachUploadComponent, UserAvatarComponent, AdminSettingsComponent, PasswordPolicyComponent, @@ -170,6 +173,8 @@ import { ObservationModule } from './observation/observation.module'; IconUploadComponent, ContactInfoComponent, DatetimePickerComponent, + ObservationEditDiscardComponent, + ObservationEditPasswordComponent, ContactComponent, ContactDialogComponent, AdminAuthenticationOidcComponent, @@ -181,6 +186,8 @@ import { ObservationModule } from './observation/observation.module'; ButtonPreviewComponent, AdminAuthenticationSettingsComponent, AdminSettingsUnsavedComponent, + AdminEventFormPreviewComponent, + AdminEventFormPreviewDialogComponent, AdminMapComponent ], imports: [ @@ -193,7 +200,6 @@ import { ObservationModule } from './observation/observation.module'; ReactiveFormsModule, BrowserAnimationsModule, DragDropModule, - ObservationModule, MatBadgeModule, MatBottomSheetModule, MatDialogModule, @@ -207,7 +213,6 @@ import { ObservationModule } from './observation/observation.module'; MatTooltipModule, MatTabsModule, MatButtonModule, - MatMenuModule, MatCardModule, MatGridListModule, MatProgressSpinnerModule, @@ -243,19 +248,13 @@ import { ObservationModule } from './observation/observation.module'; MatDatepickerModule, NgxMatSelectSearchModule, AdminModule, - AdminTeamsModule, - AdminUsersModule, - AdminEventsModule, - AdminLayersModule, - AdminEventFormModule, AdminFeedsModule, FeedItemSummaryModule, StaticIconModule, AdminBreadcrumbModule, MatSlideToggleModule, MatStepperModule, - InputMaskModule.forRoot(), - AdminDashboardModule + InputMaskModule.forRoot() ], providers: [ mapServiceProvider, @@ -272,18 +271,11 @@ import { ObservationModule } from './observation/observation.module'; eventProvider, authenticationConfigurationServiceProvider, userPagingServiceProvider, - deviceServiceProvider, - devicePagingServiceProvider, - loginServiceProvider, - layerServiceProvider, - { - provide: HTTP_INTERCEPTORS, - useClass: TokenInterceptorService, - multi: true - } + { provide: HTTP_INTERCEPTORS, useClass: TokenInterceptorService, multi: true } ] }) export class AppModule implements DoBootstrap { // eslint-disable-next-line @typescript-eslint/no-empty-function - public ngDoBootstrap(appRef: ApplicationRef): void { } + public ngDoBootstrap(appRef: ApplicationRef): void { + } } diff --git a/web-app/admin/src/app/core/card-navbar/card-navbar.component.html b/web-app/admin/src/app/core/card-navbar/card-navbar.component.html deleted file mode 100644 index 474672e52..000000000 --- a/web-app/admin/src/app/core/card-navbar/card-navbar.component.html +++ /dev/null @@ -1,21 +0,0 @@ - \ No newline at end of file diff --git a/web-app/admin/src/app/core/card-navbar/card-navbar.component.scss b/web-app/admin/src/app/core/card-navbar/card-navbar.component.scss deleted file mode 100644 index 9a195ad2e..000000000 --- a/web-app/admin/src/app/core/card-navbar/card-navbar.component.scss +++ /dev/null @@ -1,229 +0,0 @@ -.navbar-container { - background: white; - display: flex; - align-items: center; - padding: 1rem 1.5rem; - gap: 1.5rem; - min-height: 4rem; - - flex-direction: row !important; - flex-wrap: nowrap; -} - -.navbar-header { - flex-shrink: 0; - align-items: center; - display: flex; -} - -.navbar-title { - margin: 0; - font-size: 1.25rem; - font-weight: 600; - color: #111827; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - max-width: 300px; -} - -.search-section { - flex: 1; - min-width: 200px; - max-width: 400px; - - flex: 1 1 auto; - min-width: 0; -} - -.search-input-container { - position: relative; - width: 100%; -} - -.search-input { - width: 100%; - padding: 0.5rem 1rem; - padding-right: 3rem; - border: 1px solid #d1d5db; - border-radius: 8px; - font-size: 0.875rem; - background-color: #f9fafb; - transition: all 0.2s ease; - - &:focus { - outline: none; - border-color: #3b82f6; - background-color: white; - box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); - } - - &::placeholder { - color: #6b7280; - } -} - -.clear-search-btn { - position: absolute; - right: 0.75rem; - top: 50%; - transform: translateY(-50%); - background: none; - border: none; - padding: 0.25rem; - cursor: pointer; - color: #6b7280; - border-radius: 4px; - transition: all 0.2s ease; - - &:hover { - background-color: #e5e7eb; - color: #374151; - } - - i { - font-size: 0.875rem; - } -} - -.actions-section { - flex-shrink: 0; - display: flex; - gap: 0.75rem; - margin-left: auto; - - flex: 0 0 auto; - flex-wrap: nowrap; - white-space: nowrap; -} - -.action-button { - padding: 0.50rem 1rem; - border: 1px solid #d1d5db; - border-radius: 8px; - background: white; - color: #374151; - font-size: 0.875rem; - font-weight: 500; - cursor: pointer; - transition: all 0.2s ease; - white-space: nowrap; - - flex: 0 0 auto; - - &:hover:not(:disabled) { - background-color: #f9fafb; - border-color: #9ca3af; - } - - &:focus { - outline: none; - box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); - border-color: #3b82f6; - } - - &:disabled { - opacity: 0.5; - cursor: not-allowed; - } - - &.btn-primary { - background-color: #3b82f6; - border-color: #3b82f6; - color: white; - - &:hover:not(:disabled) { - background-color: #2563eb; - border-color: #2563eb; - } - } - - &.btn-success { - background-color: #10b981; - border-color: #10b981; - color: white; - - &:hover:not(:disabled) { - background-color: #059669; - border-color: #059669; - } - } - - &.btn-danger { - background-color: #ef4444; - border-color: #ef4444; - color: white; - - &:hover:not(:disabled) { - background-color: #dc2626; - border-color: #dc2626; - } - } -} - -@media (max-width: 768px) { - .navbar-container { - flex-direction: column; - align-items: stretch; - gap: 1rem; - padding: 1rem; - } - - .navbar-header { - justify-content: center; - } - - .navbar-title { - max-width: 100%; - text-align: center; - font-size: 1.125rem; - } - - .search-section { - max-width: 100%; - min-width: unset; - } - - .actions-section { - justify-content: center; - margin-left: 0; - flex-wrap: wrap; - } -} - -@media (max-width: 576px) { - .navbar-container { - gap: 0.75rem; - padding: 0.75rem; - } - - .navbar-title { - font-size: 1rem; - } - - .search-input { - font-size: 0.875rem; - padding: 0.625rem 0.875rem; - padding-right: 2.5rem; - } - - .action-button { - font-size: 0.875rem; - padding: 0.625rem 1.25rem; - } - - .actions-section { - gap: 0.5rem; - } -} - -@media (max-width: 480px) { - .modern-navbar .navbar-container { - flex-wrap: wrap; - } - - .modern-navbar .actions-section { - flex-wrap: wrap; - white-space: normal; - } -} \ No newline at end of file diff --git a/web-app/admin/src/app/core/card-navbar/card-navbar.component.spec.ts b/web-app/admin/src/app/core/card-navbar/card-navbar.component.spec.ts deleted file mode 100644 index f16674885..000000000 --- a/web-app/admin/src/app/core/card-navbar/card-navbar.component.spec.ts +++ /dev/null @@ -1,311 +0,0 @@ -import { ComponentFixture, TestBed, fakeAsync, tick } from '@angular/core/testing'; -import { FormsModule } from '@angular/forms'; -import { By } from '@angular/platform-browser'; - -import { CardNavbarComponent, CardActionButton } from './card-navbar.component'; - -describe('CardNavbarComponent', () => { - let component: CardNavbarComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [CardNavbarComponent], - imports: [FormsModule] - }) - .compileComponents(); - - fixture = TestBed.createComponent(CardNavbarComponent); - component = fixture.componentInstance; - }); - - describe('Component Creation', () => { - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should initialize with default values', () => { - expect(component.isSearchable).toBe(false); - expect(component.searchPlaceholder).toBe('Search...'); - expect(component.actionButtons).toEqual([]); - expect(component.debounceTime).toBe(250); - expect(component.searchTerm).toBe(''); - }); - }); - - describe('Template Rendering', () => { - beforeEach(() => { - fixture.detectChanges(); - }); - - it('should show search input when isSearchable is true', () => { - component.isSearchable = true; - fixture.detectChanges(); - - const searchContainer = fixture.debugElement.query(By.css('[data-testid="search-section"]')); - const searchInput = fixture.debugElement.query(By.css('[data-testid="search-input"]')); - - expect(searchContainer).toBeTruthy(); - expect(searchInput).toBeTruthy(); - }); - - it('should hide search input when isSearchable is false', () => { - component.isSearchable = false; - fixture.detectChanges(); - - const searchContainer = fixture.debugElement.query(By.css('[data-testid="search-section"]')); - expect(searchContainer).toBeFalsy(); - }); - - it('should display custom search placeholder', () => { - component.isSearchable = true; - component.searchPlaceholder = 'Custom placeholder'; - fixture.detectChanges(); - - const searchInput = fixture.debugElement.query(By.css('[data-testid="search-input"]')); - expect(searchInput.nativeElement.placeholder).toBe('Custom placeholder'); - }); - - it('should display action buttons when provided', () => { - const mockButtons: CardActionButton[] = [ - { label: 'Button 1', type: 'btn-primary', action: jasmine.createSpy('action1') }, - { label: 'Button 2', type: 'btn-secondary', action: jasmine.createSpy('action2') } - ]; - component.actionButtons = mockButtons; - fixture.detectChanges(); - - const buttons = fixture.debugElement.queryAll(By.css('[data-testid="action-button"]')); - expect(buttons.length).toBe(2); - expect(buttons[0].nativeElement.textContent.trim()).toBe('Button 1'); - expect(buttons[1].nativeElement.textContent.trim()).toBe('Button 2'); - }); - - it('should hide action buttons form when no buttons are provided', () => { - component.actionButtons = []; - fixture.detectChanges(); - - const actionsSection = fixture.debugElement.query(By.css('[data-testid="actions-section"]')); - expect(actionsSection).toBeFalsy(); - }); - - it('should apply correct CSS classes to action buttons', () => { - const mockButtons: CardActionButton[] = [ - { label: 'btn-primary', type: 'btn-primary', action: jasmine.createSpy() }, - { label: 'btn-secondary', type: 'btn-secondary', action: jasmine.createSpy() }, - { label: 'btn-tertiary', type: 'btn-tertiary', action: jasmine.createSpy() } - ]; - component.actionButtons = mockButtons; - fixture.detectChanges(); - - const buttons = fixture.debugElement.queryAll(By.css('[data-testid="action-button"]')); - expect(buttons[0].nativeElement.classList).toContain('btn-primary'); - expect(buttons[1].nativeElement.classList).toContain('btn-secondary'); - expect(buttons[2].nativeElement.classList).toContain('btn-tertiary'); - }); - - it('should disable buttons when disabled property is true', () => { - const mockButtons: CardActionButton[] = [ - { label: 'Enabled', type: 'btn-primary', action: jasmine.createSpy() }, - { label: 'Disabled', type: 'btn-primary', disabled: true, action: jasmine.createSpy() } - ]; - component.actionButtons = mockButtons; - fixture.detectChanges(); - - const buttons = fixture.debugElement.queryAll(By.css('[data-testid="action-button"]')); - expect(buttons[0].nativeElement.disabled).toBe(false); - expect(buttons[1].nativeElement.disabled).toBe(true); - }); - }); - - describe('Search Functionality', () => { - beforeEach(() => { - component.isSearchable = true; - fixture.detectChanges(); - }); - - it('should emit searchTermChanged when search term changes', fakeAsync(() => { - spyOn(component.searchTermChanged, 'emit'); - - component.onSearchChange('test search'); - tick(250); // Wait for debounce - - expect(component.searchTermChanged.emit).toHaveBeenCalledWith('test search'); - })); - - it('should debounce search term changes', fakeAsync(() => { - spyOn(component.searchTermChanged, 'emit'); - - component.onSearchChange('t'); - component.onSearchChange('te'); - component.onSearchChange('test'); - tick(100); // Before debounce completes - - expect(component.searchTermChanged.emit).not.toHaveBeenCalled(); - - tick(150); // Complete debounce - expect(component.searchTermChanged.emit).toHaveBeenCalledTimes(1); - expect(component.searchTermChanged.emit).toHaveBeenCalledWith('test'); - })); - - it('should not emit duplicate search terms', fakeAsync(() => { - spyOn(component.searchTermChanged, 'emit'); - - component.onSearchChange('test'); - tick(250); - component.onSearchChange('test'); - tick(250); - - expect(component.searchTermChanged.emit).toHaveBeenCalledTimes(1); - })); - - it('should update searchTerm property when onSearchChange is called', () => { - component.onSearchChange('new search term'); - expect(component.searchTerm).toBe('new search term'); - }); - - it('should clear search when clearSearch is called', () => { - spyOn(component.searchCleared, 'emit'); - component.searchTerm = 'some search'; - - component.clearSearch(); - - expect(component.searchTerm).toBe(''); - expect(component.searchCleared.emit).toHaveBeenCalled(); - }); - - it('should trigger clearSearch when clear button is clicked', () => { - spyOn(component, 'clearSearch'); - - const searchInput = fixture.debugElement.query(By.css('[data-testid="search-input"]')); - searchInput.nativeElement.value = 'test'; - searchInput.nativeElement.dispatchEvent(new Event('input')); - fixture.detectChanges(); - - const clearButton = fixture.debugElement.query(By.css('[data-testid="clear-search-btn"]')); - clearButton.nativeElement.click(); - - expect(component.clearSearch).toHaveBeenCalled(); - }); - - it('should trigger onSearchChange when input value changes', fakeAsync(() => { - spyOn(component, 'onSearchChange'); - - const searchInput = fixture.debugElement.query(By.css('[data-testid="search-input"]')); - searchInput.nativeElement.value = 'test input'; - searchInput.nativeElement.dispatchEvent(new Event('input')); - - fixture.detectChanges(); - tick(); - - expect(component.onSearchChange).toHaveBeenCalledWith('test input'); - })); - }); - - describe('Action Button Functionality', () => { - it('should call button action when onActionButtonClick is called', () => { - const mockAction = jasmine.createSpy('mockAction'); - const button: CardActionButton = { - label: 'Test Button', - type: 'btn-primary', - action: mockAction - }; - - component.onActionButtonClick(button); - - expect(mockAction).toHaveBeenCalled(); - }); - - it('should not throw error when button action is undefined', () => { - const button: CardActionButton = { - label: 'Test Button', - type: 'btn-primary', - action: undefined as any - }; - - expect(() => component.onActionButtonClick(button)).not.toThrow(); - }); - - it('should trigger onActionButtonClick when button is clicked', () => { - const mockAction = jasmine.createSpy('mockAction'); - const mockButtons: CardActionButton[] = [ - { label: 'Test Button', type: 'btn-primary', action: mockAction } - ]; - component.actionButtons = mockButtons; - fixture.detectChanges(); - - const button = fixture.debugElement.query(By.css('[data-testid="action-button"]')); - button.nativeElement.click(); - - expect(mockAction).toHaveBeenCalled(); - }); - }); - - describe('Lifecycle Methods', () => { - it('should set up search subscription on ngOnInit', () => { - spyOn(component.searchTermChanged, 'emit'); - - component.ngOnInit(); - - // Verify subscription is working - component.onSearchChange('test'); - expect(component.searchTerm).toBe('test'); - }); - - it('should clean up subscriptions on ngOnDestroy', () => { - const destroySpy = spyOn(component['destroy$'], 'next'); - const completeSpy = spyOn(component['destroy$'], 'complete'); - - component.ngOnDestroy(); - - expect(destroySpy).toHaveBeenCalled(); - expect(completeSpy).toHaveBeenCalled(); - }); - - it('should stop emitting search changes after ngOnDestroy', fakeAsync(() => { - spyOn(component.searchTermChanged, 'emit'); - component.ngOnInit(); - - component.ngOnDestroy(); - component.onSearchChange('test after destroy'); - tick(250); - - expect(component.searchTermChanged.emit).not.toHaveBeenCalled(); - })); - }); - - describe('Input Properties', () => { - it('should accept isSearchable input', () => { - component.isSearchable = true; - expect(component.isSearchable).toBe(true); - }); - - it('should accept searchPlaceholder input', () => { - const placeholder = 'Enter search term...'; - component.searchPlaceholder = placeholder; - expect(component.searchPlaceholder).toBe(placeholder); - }); - - it('should accept actionButtons input', () => { - const buttons: CardActionButton[] = [ - { label: 'Button', type: 'btn-primary', action: () => { } } - ]; - component.actionButtons = buttons; - expect(component.actionButtons).toBe(buttons); - }); - - it('should accept debounceTime input', () => { - component.debounceTime = 500; - expect(component.debounceTime).toBe(500); - }); - }); - - describe('Output Events', () => { - it('should have searchTermChanged output', () => { - expect(component.searchTermChanged).toBeDefined(); - }); - - it('should have searchCleared output', () => { - expect(component.searchCleared).toBeDefined(); - }); - }); -}); diff --git a/web-app/admin/src/app/core/card-navbar/card-navbar.component.ts b/web-app/admin/src/app/core/card-navbar/card-navbar.component.ts deleted file mode 100644 index d2b0b1f8b..000000000 --- a/web-app/admin/src/app/core/card-navbar/card-navbar.component.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { Component, Input, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core'; -import { Subject } from 'rxjs'; -import { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators'; - -export interface CardActionButton { - label: string; - type: 'btn-primary' | 'btn-secondary' | 'btn-tertiary'; - disabled?: boolean; - action: () => void; -} - -/** - * A reusable card navbar component that provides a title, optional search functionality, - * and configurable action buttons. The component handles search debouncing and emits - * events for search term changes and search clearing. - */ -@Component({ - selector: 'mage-card-navbar', - templateUrl: './card-navbar.component.html', - styleUrls: ['./card-navbar.component.scss'] -}) -export class CardNavbarComponent implements OnInit, OnDestroy { - @Input() isSearchable = false; - @Input() searchPlaceholder = 'Search...'; - @Input() actionButtons: CardActionButton[] = []; - - @Output() searchTermChanged = new EventEmitter(); - @Output() searchCleared = new EventEmitter(); - - searchTerm: string = ''; - debounceTime = 250; - - private searchSubject$ = new Subject(); - private destroy$ = new Subject(); - - constructor() { } - - /** - * Sets up the search subject with debouncing and change detection. - */ - ngOnInit(): void { - this.searchSubject$.pipe( - debounceTime(this.debounceTime), - distinctUntilChanged(), - takeUntil(this.destroy$) - ).subscribe(searchTerm => { - this.searchTermChanged.emit(searchTerm); - }); - } - - /** - * Component destruction lifecycle hook - */ - ngOnDestroy(): void { - this.destroy$.next(); - this.destroy$.complete(); - } - - /** - * Clears the search input and emits the searchCleared event - */ - clearSearch(): void { - this.searchTerm = ''; - this.searchSubject$.next(''); - this.searchCleared.emit(); - } - - /** - * Handles action button click events - * - * @param button - The action button that was clicked - */ - onActionButtonClick(button: CardActionButton): void { - if (button.action) { - button.action(); - } - } - - /** - * Handles search input changes - * - * @param term - The new search term entered by the user - */ - onSearchChange(term: string): void { - this.searchTerm = term; - this.searchSubject$.next(term); - } -} diff --git a/web-app/admin/src/app/core/core.module.ts b/web-app/admin/src/app/core/core.module.ts deleted file mode 100644 index 062732836..000000000 --- a/web-app/admin/src/app/core/core.module.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatIconModule } from '@angular/material/icon'; -import { MatButtonModule } from '@angular/material/button'; -import { MatTableModule } from '@angular/material/table'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatPaginatorModule } from '@angular/material/paginator'; - -import { CardNavbarComponent } from './card-navbar/card-navbar.component'; -import { SearchModalComponent } from './search-modal/search-modal.component'; - -@NgModule({ - declarations: [ - CardNavbarComponent, - SearchModalComponent - ], - imports: [ - CommonModule, - FormsModule, - MatDialogModule, - MatIconModule, - MatButtonModule, - MatTableModule, - MatProgressSpinnerModule, - MatPaginatorModule - ], - providers: [], - exports: [ - CardNavbarComponent, - SearchModalComponent - ] -}) -export class CoreModule { } \ No newline at end of file diff --git a/web-app/admin/src/app/core/search-modal/search-modal.component.html b/web-app/admin/src/app/core/search-modal/search-modal.component.html deleted file mode 100644 index 6a0dbc980..000000000 --- a/web-app/admin/src/app/core/search-modal/search-modal.component.html +++ /dev/null @@ -1,47 +0,0 @@ -
-
-

Search and Select

-
- -
-
- - - - - - - {{ column.label }} - - -
- {{ getColumnValue(item, column) }} -
-
-
- - - - -
- -
- No results found -
- - - -
-
- -
- - -
-
\ No newline at end of file diff --git a/web-app/admin/src/app/core/search-modal/search-modal.component.scss b/web-app/admin/src/app/core/search-modal/search-modal.component.scss deleted file mode 100644 index 14cc2d57b..000000000 --- a/web-app/admin/src/app/core/search-modal/search-modal.component.scss +++ /dev/null @@ -1,158 +0,0 @@ -.results-container { - flex: 1; - overflow: hidden; - display: flex; - flex-direction: column; - border: 1px solid #e5e7eb; - border-radius: 12px; - background-color: white; - min-height: 280px; - - .search-results-table { - flex: 1; - - ::ng-deep .mat-header-cell { - background-color: #f9fafb; - border-bottom: 1px solid #e5e7eb; - color: #374151; - font-weight: 600; - font-size: 0.875rem; - text-transform: uppercase; - letter-spacing: 0.05em; - padding: 1rem 1.25rem; - height: 48px; - } - - ::ng-deep .mat-cell { - padding: 1rem 1.25rem; - border-bottom: 1px solid #f3f4f6; - color: #111827; - height: 56px; // Reduced from 70px - } - - ::ng-deep .mat-row { - transition: background-color 0.15s ease; - cursor: pointer; - - &:hover { - background-color: #f9fafb; - } - - &.selected { - background-color: #eff6ff; - border-left: 4px solid #3b82f6; - border-color: #dbeafe; - } - - &.selected:hover { - background-color: #dbeafe; - } - } - - .content-cell { - user-select: none; - - .item-content { - .item-title { - font-weight: 500; - margin-bottom: 0.5rem; - color: #111827; - font-size: 1rem; - } - - .item-subtitle { - font-size: 0.875rem; - color: #6b7280; - } - } - - .column-content { - font-size: 0.875rem; - color: #111827; - line-height: 1.4; - padding: 0.25rem 0; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - max-width: 100%; - } - } - - .column-header { - font-weight: 600; - color: #374151; - font-size: 0.875rem; - text-transform: uppercase; - letter-spacing: 0.05em; - } - } - - .no-results { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 2.5rem 2rem; - gap: 1rem; - color: #9ca3af; - min-height: 150px; - - i { - font-size: 2.5rem; - color: #d1d5db; - } - - span { - font-size: 0.875rem; - font-weight: 500; - } - } -} - -::ng-deep .search-modal-dialog { - .mat-paginator { - border-top: 1px solid #e5e7eb; - background-color: #f9fafb; - color: #374151; - min-height: 48px; - - .mat-paginator-container { - padding: 0.5rem 1rem; - min-height: 48px; - } - - .mat-paginator-page-size-label, - .mat-paginator-range-label { - font-size: 0.75rem; - color: #6b7280; - line-height: 1.2; - } - - .mat-select-value { - font-size: 0.75rem; - color: #374151; - } - } - - .mat-dialog-container { - padding: 0; - border-radius: 12px; - box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); - } - - .mat-dialog-actions { - padding: 0; - margin: 0; - } - - .mat-dialog-content { - overflow: hidden; - } - - .mat-dialog-title { - font-size: 1.25rem; - font-weight: 700; - color: #111827; - margin: 0; - } -} \ No newline at end of file diff --git a/web-app/admin/src/app/core/search-modal/search-modal.component.spec.ts b/web-app/admin/src/app/core/search-modal/search-modal.component.spec.ts deleted file mode 100644 index 89679cd01..000000000 --- a/web-app/admin/src/app/core/search-modal/search-modal.component.spec.ts +++ /dev/null @@ -1,494 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { MatTableModule } from '@angular/material/table'; -import { MatPaginatorModule, PageEvent } from '@angular/material/paginator'; -import { MatIconModule } from '@angular/material/icon'; -import { MatButtonModule } from '@angular/material/button'; -import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { of, throwError } from 'rxjs'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; - -import { SearchModalComponent, SearchModalData, SearchModalResult } from './search-modal.component'; - -@Component({ - selector: 'mage-card-navbar', - template: '
Mock Card Navbar
' -}) -class MockCardNavbarComponent { - @Input() title?: string; - @Input() isSearchable = false; - @Input() searchPlaceholder = 'Search...'; - @Output() searchTermChanged = new EventEmitter(); - @Output() searchCleared = new EventEmitter(); -} - -describe('SearchModalComponent', () => { - let component: SearchModalComponent; - let fixture: ComponentFixture; - let mockDialogRef: jasmine.SpyObj>; - let mockSearchFunction: jasmine.Spy; - - const mockSearchData: SearchModalData = { - title: 'Test Search Modal', - searchPlaceholder: 'Search for items...', - teamId: 'team-123', - searchFunction: jasmine.createSpy('searchFunction'), - columns: [ - { - key: 'name', - label: 'Name', - displayFunction: (item: any) => item.name, - width: '200px' - }, - { - key: 'email', - label: 'Email', - displayFunction: (item: any) => item.email - } - ], - selectedItem: null - }; - - const mockSearchResults = { - items: [ - { id: 1, name: 'John Doe', email: 'john@example.com' }, - { id: 2, name: 'Jane Smith', email: 'jane@example.com' }, - { id: 3, name: 'Bob Johnson', email: 'bob@example.com' } - ] - }; - - beforeEach(async () => { - mockDialogRef = jasmine.createSpyObj('MatDialogRef', ['close']); - mockSearchFunction = jasmine.createSpy('searchFunction').and.returnValue(of(mockSearchResults)); - mockSearchData.searchFunction = mockSearchFunction; - - await TestBed.configureTestingModule({ - declarations: [ - SearchModalComponent, - MockCardNavbarComponent - ], - imports: [ - MatTableModule, - MatPaginatorModule, - MatIconModule, - MatButtonModule, - NoopAnimationsModule - ], - providers: [ - { provide: MatDialogRef, useValue: mockDialogRef }, - { provide: MAT_DIALOG_DATA, useValue: mockSearchData } - ] - }).compileComponents(); - - fixture = TestBed.createComponent(SearchModalComponent); - component = fixture.componentInstance; - }); - - describe('Component Initialization', () => { - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should initialize with correct data', () => { - expect(component.data).toEqual(mockSearchData); - expect(component.columns).toEqual(mockSearchData.columns); - expect(component.displayedColumns).toEqual(['name', 'email']); - expect(component.selectedItem).toBeNull(); - }); - - it('should initialize with default values', () => { - expect(component.loading).toBeFalse(); - expect(component.pageIndex).toBe(0); - expect(component.pageSize).toBe(5); - expect(component.totalCount).toBe(0); - expect(component.pageSizeOptions).toEqual([5]); - expect(component.currentSearchTerm).toBe(''); - }); - - it('should call search on init', () => { - spyOn(component, 'search'); - component.ngOnInit(); - expect(component.search).toHaveBeenCalled(); - }); - }); - - describe('Search Functionality', () => { - beforeEach(() => { - fixture.detectChanges(); - }); - - it('should perform search with correct parameters', () => { - component.currentSearchTerm = 'test'; - component.pageIndex = 1; - component.pageSize = 10; - - component.search(); - - expect(mockSearchFunction).toHaveBeenCalledWith('test', 1, 10); - }); - - it('should perform search with empty string when no search term', () => { - component.currentSearchTerm = ''; - component.search(); - - expect(mockSearchFunction).toHaveBeenCalledWith('', 0, 5); - }); - - it('should update data source and total count on successful search', () => { - component.search(); - - expect(component.dataSource.data).toEqual(mockSearchResults.items); - expect(component.totalCount).toBe(3); - expect(component.loading).toBeFalse(); - }); - - it('should handle search results without items property', () => { - mockSearchFunction.and.returnValue(of(mockSearchResults.items)); - - component.search(); - - expect(component.dataSource.data).toEqual(mockSearchResults.items); - expect(component.totalCount).toBe(3); - }); - - it('should handle search error', () => { - const consoleErrorSpy = spyOn(console, 'error'); - mockSearchFunction.and.returnValue(throwError('Search failed')); - - component.search(); - - expect(component.loading).toBeFalse(); - expect(component.dataSource.data).toEqual([]); - expect(component.totalCount).toBe(0); - expect(consoleErrorSpy).toHaveBeenCalledWith('Search error:', 'Search failed'); - }); - - it('should set loading to true during search', () => { - component.search(); - expect(component.loading).toBeFalse(); // Should be false after synchronous test completion - }); - }); - - describe('Search Term Handling', () => { - beforeEach(() => { - fixture.detectChanges(); - spyOn(component, 'search'); - }); - - it('should update search term and trigger search on search term changed', () => { - component.onSearchTermChanged('new search'); - - expect(component.currentSearchTerm).toBe('new search'); - expect(component.pageIndex).toBe(0); - expect(component.search).toHaveBeenCalled(); - }); - - it('should clear search term and trigger search on search cleared', () => { - component.currentSearchTerm = 'existing search'; - component.pageIndex = 2; - - component.onSearchCleared(); - - expect(component.currentSearchTerm).toBe(''); - expect(component.pageIndex).toBe(0); - expect(component.search).toHaveBeenCalled(); - }); - }); - - describe('Pagination', () => { - beforeEach(() => { - fixture.detectChanges(); - spyOn(component, 'search'); - }); - - it('should update page index and trigger search on page change', () => { - const pageEvent: PageEvent = { - pageIndex: 2, - pageSize: 5, - length: 20, - previousPageIndex: 1 - }; - - component.onPageChange(pageEvent); - - expect(component.pageIndex).toBe(2); - expect(component.search).toHaveBeenCalled(); - }); - }); - - describe('Item Selection', () => { - beforeEach(() => { - fixture.detectChanges(); - }); - - it('should check if item is selected correctly', () => { - const item = mockSearchResults.items[0]; - component.selectedItem = item; - - expect(component.isSelected(item)).toBeTrue(); - expect(component.isSelected(mockSearchResults.items[1])).toBeFalse(); - }); - - it('should disable submit button when no item is selected', () => { - component.selectedItem = null; - fixture.detectChanges(); - - const confirmButton = fixture.debugElement.nativeElement.querySelector('[data-testid="confirm-button"]'); - expect(confirmButton.disabled).toBeTrue(); - }); - - it('should toggle selection - select item when none selected', () => { - const item = mockSearchResults.items[0]; - component.selectedItem = null; - - component.toggleSelection(item); - - expect(component.selectedItem).toBe(item); - }); - - it('should toggle selection - deselect item when already selected', () => { - const item = mockSearchResults.items[0]; - component.selectedItem = item; - - component.toggleSelection(item); - - expect(component.selectedItem).toBeNull(); - }); - - it('should toggle selection - select different item when another is selected', () => { - const item1 = mockSearchResults.items[0]; - const item2 = mockSearchResults.items[1]; - component.selectedItem = item1; - - component.toggleSelection(item2); - - expect(component.selectedItem).toBe(item2); - }); - - it('should handle row click and prevent default', () => { - const item = mockSearchResults.items[0]; - const mockEvent = jasmine.createSpyObj('MouseEvent', ['preventDefault']); - spyOn(component, 'toggleSelection'); - - component.onRowClick(item, mockEvent); - - expect(mockEvent.preventDefault).toHaveBeenCalled(); - expect(component.toggleSelection).toHaveBeenCalledWith(item); - }); - }); - - describe('Item Comparison', () => { - it('should compare items by id when both have ids', () => { - const item1 = { id: 1, name: 'John' }; - const item2 = { id: 1, name: 'Different Name' }; - const item3 = { id: 2, name: 'Jane' }; - - component.selectedItem = item1; - - expect(component.isSelected(item2)).toBeTrue(); // Same id - expect(component.isSelected(item3)).toBeFalse(); // Different id - }); - - it('should compare items by reference when no ids', () => { - const item1 = { name: 'John' }; - const item2 = { name: 'John' }; - - component.selectedItem = item1; - - expect(component.isSelected(item1)).toBeTrue(); // Same reference - expect(component.isSelected(item2)).toBeFalse(); // Different reference - }); - }); - - describe('Column Utilities', () => { - beforeEach(() => { - fixture.detectChanges(); - }); - - it('should get column value using display function', () => { - const item = mockSearchResults.items[0]; - const column = mockSearchData.columns[0]; - - const value = component.getColumnValue(item, column); - - expect(value).toBe('John Doe'); - }); - - it('should find column by key', () => { - const column = component.getColumnByKey('name'); - - expect(column).toBe(mockSearchData.columns[0]); - expect(column?.label).toBe('Name'); - }); - - it('should return undefined for non-existent column key', () => { - const column = component.getColumnByKey('nonexistent'); - - expect(column).toBeUndefined(); - }); - }); - - describe('Selection Count', () => { - beforeEach(() => { - fixture.detectChanges(); - }); - - it('should return 1 when item is selected', () => { - component.selectedItem = mockSearchResults.items[0]; - - expect(component.getSelectedCount()).toBe(1); - }); - - it('should return 0 when no item is selected', () => { - component.selectedItem = null; - - expect(component.getSelectedCount()).toBe(0); - }); - }); - - describe('Modal Actions', () => { - beforeEach(() => { - fixture.detectChanges(); - }); - - it('should close dialog with selected item on confirm', () => { - const selectedItem = mockSearchResults.items[0]; - component.selectedItem = selectedItem; - - component.onConfirm(); - - const expectedResult: SearchModalResult = { - selectedItem: selectedItem - }; - expect(mockDialogRef.close).toHaveBeenCalledWith(expectedResult); - }); - - it('should close dialog with null selected item when none selected', () => { - component.selectedItem = null; - - component.onConfirm(); - - const expectedResult: SearchModalResult = { - selectedItem: null - }; - expect(mockDialogRef.close).toHaveBeenCalledWith(expectedResult); - }); - }); - - describe('Component Destruction', () => { - it('should complete destroy subject on destroy', () => { - const destroySpy = spyOn(component['destroy$'], 'next'); - const completeSpy = spyOn(component['destroy$'], 'complete'); - - component.ngOnDestroy(); - - expect(destroySpy).toHaveBeenCalled(); - expect(completeSpy).toHaveBeenCalled(); - }); - }); - - describe('Template Integration', () => { - beforeEach(() => { - fixture.detectChanges(); - }); - - it('should display title in card navbar', () => { - const cardNavbar = fixture.debugElement.query(directive => directive.name === 'mage-card-navbar'); - expect(cardNavbar).toBeTruthy(); - }); - - it('should display table with correct columns', () => { - const table = fixture.debugElement.nativeElement.querySelector('[data-testid="search-results-table"]'); - expect(table).toBeTruthy(); - }); - - it('should show no results message when no data', () => { - component.dataSource.data = []; - fixture.detectChanges(); - - const noResults = fixture.debugElement.nativeElement.querySelector('[data-testid="no-results"]'); - expect(noResults).toBeTruthy(); - expect(noResults.textContent.trim()).toBe('No results found'); - }); - - it('should show paginator when totalCount > 0', () => { - component.totalCount = 10; - fixture.detectChanges(); - - const paginator = fixture.debugElement.nativeElement.querySelector('[data-testid="paginator"]'); - expect(paginator).toBeTruthy(); - }); - - it('should disable confirm button when no selection', () => { - component.selectedItem = null; - fixture.detectChanges(); - - const confirmButton = fixture.debugElement.nativeElement.querySelector('[data-testid="confirm-button"]'); - expect(confirmButton.disabled).toBeTrue(); - }); - - it('should enable confirm button when item is selected', () => { - component.selectedItem = mockSearchResults.items[0]; - fixture.detectChanges(); - - const confirmButton = fixture.debugElement.nativeElement.querySelector('[data-testid="confirm-button"]'); - expect(confirmButton.disabled).toBeFalse(); - }); - }); - - describe('Edge Cases', () => { - beforeEach(() => { - fixture.detectChanges(); - }); - - it('should handle empty search results', () => { - mockSearchFunction.and.returnValue(of({ items: [] })); - - component.search(); - - expect(component.dataSource.data).toEqual([]); - expect(component.totalCount).toBe(0); - }); - - it('should handle search results with null items', () => { - mockSearchFunction.and.returnValue(of({ items: null })); - - component.search(); - - expect(component.dataSource.data).toEqual([]); - expect(component.totalCount).toBe(0); - }); - - it('should handle search results without items property', () => { - const directResults = [{ id: 1, name: 'Test' }]; - mockSearchFunction.and.returnValue(of(directResults)); - - component.search(); - - expect(component.dataSource.data).toEqual(directResults); - expect(component.totalCount).toBe(1); - }); - - it('should handle items without ids in comparison', () => { - const item1 = { name: 'Test1' }; - const item2 = { name: 'Test2' }; - - component.selectedItem = item1; - - expect(component.isSelected(item1)).toBeTrue(); - expect(component.isSelected(item2)).toBeFalse(); - }); - - it('should handle column with no display function gracefully', () => { - const columnWithoutFunction = { - key: 'test', - label: 'Test', - displayFunction: undefined as any - }; - - expect(() => { - component.getColumnValue({ name: 'test' }, columnWithoutFunction); - }).toThrow(); - }); - }); -}); diff --git a/web-app/admin/src/app/core/search-modal/search-modal.component.ts b/web-app/admin/src/app/core/search-modal/search-modal.component.ts deleted file mode 100644 index 62e4581b5..000000000 --- a/web-app/admin/src/app/core/search-modal/search-modal.component.ts +++ /dev/null @@ -1,218 +0,0 @@ -import { Component, Inject, OnInit, OnDestroy } from '@angular/core'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { Subject, Observable } from 'rxjs'; -import { takeUntil } from 'rxjs/operators'; -import { MatTableDataSource } from '@angular/material/table'; -import { PageEvent } from '@angular/material/paginator'; - -export interface SearchModalColumn { - key: string; - label: string; - displayFunction: (item: any) => string; - width?: string; -} - -export interface SearchModalData { - title: string; - searchPlaceholder: string; - teamId?: string; - searchFunction: (searchTerm: string, page: number, pageSize: number) => Observable; - columns: SearchModalColumn[]; - selectedItem?: any; -} - -export interface SearchModalResult { - selectedItem: any; -} - -/** - * A reusable modal component for searching and selecting items from a paginated list. - * Provides a searchable table interface with customizable columns and search functionality. - * Used for selecting users, events, or other entities to add to teams or perform other operations. - */ -@Component({ - selector: 'app-search-modal', - templateUrl: './search-modal.component.html', - styleUrls: ['./search-modal.component.scss'] -}) -export class SearchModalComponent implements OnInit, OnDestroy { - dataSource = new MatTableDataSource(); - displayedColumns: string[] = []; - columns: SearchModalColumn[] = []; - - loading = false; - pageIndex = 0; - pageSize = 5; - totalCount = 0; - pageSizeOptions = [5]; - - selectedItem: any = null; - currentSearchTerm = ''; - - private destroy$ = new Subject(); - - /** - * Component constructor. Initializes the modal with provided data and sets up columns. - * @param dialogRef - Reference to the Material dialog for closing and returning results - * @param data - Configuration data including search function, columns, and modal settings - */ - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: SearchModalData - ) { - if (data.selectedItem) { - this.selectedItem = data.selectedItem; - } - - this.columns = data.columns; - this.displayedColumns = data.columns.map(col => col.key); - } - - /** - * Performs the initial search to populate the modal with data. - */ - ngOnInit(): void { - this.search(); - } - - /** - * Component destruction lifecycle hook. - */ - ngOnDestroy(): void { - this.destroy$.next(); - this.destroy$.complete(); - } - - /** - * Executes a search using the provided search function. - */ - search(): void { - const searchTerm = this.currentSearchTerm || ''; - this.loading = true; - - this.data.searchFunction(searchTerm, this.pageIndex, this.pageSize) - .pipe(takeUntil(this.destroy$)) - .subscribe({ - next: (results) => { - this.loading = false; - this.dataSource.data = results.items || results || []; - this.totalCount = results.totalCount || this.dataSource.data.length; - }, - error: (error) => { - this.loading = false; - console.error('Search error:', error); - this.dataSource.data = []; - this.totalCount = 0; - } - }); - } - - /** - * Updates the current page index and triggers a new search. - * @param event - The pagination event containing the new page information - */ - onPageChange(event: PageEvent): void { - this.pageIndex = event.pageIndex; - this.search(); - } - - /** - * Checks if the given item is currently selected. - * @param item - The item to check for selection status - * @returns True if the item is selected, false otherwise - */ - isSelected(item: any): boolean { - return this.selectedItem && this.isSameItem(this.selectedItem, item); - } - - /** - * Toggles the selection state of an item. - * @param item - The item to toggle selection for - */ - toggleSelection(item: any): void { - if (this.isSelected(item)) { - this.selectedItem = null; - } else { - this.selectedItem = item; - } - } - - /** - * Handles row click events to toggle item selection. - * @param item - The item in the clicked row - * @param event - The mouse event to prevent default behavior - */ - onRowClick(item: any, event: MouseEvent): void { - event.preventDefault(); - this.toggleSelection(item); - } - - /** - * Compares two items to determine if they are the same. - * @param item1 - The first item to compare - * @param item2 - The second item to compare - * @returns if the items are the same - */ - private isSameItem(item1: any, item2: any): boolean { - // Compare by id if available, otherwise by reference - if (item1.id && item2.id) { - return item1.id === item2.id; - } - return item1 === item2; - } - - /** - * Gets the display value for a specific column and item. - * @param item - The data item to get the value from - * @param column - The column configuration containing the display function - * @returns The formatted display string for the column - */ - getColumnValue(item: any, column: SearchModalColumn): string { - return column.displayFunction(item); - } - - /** - * Finds a column configuration by its key. - * @param key - The key of the column to find - * @returns The column configuration if found, undefined otherwise - */ - getColumnByKey(key: string): SearchModalColumn | undefined { - return this.columns.find(col => col.key === key); - } - - /** - * Updates the current search term, resets pagination, and triggers a new search. - * @param searchTerm - The new search term to filter results by - */ - onSearchTermChanged(searchTerm: string): void { - this.currentSearchTerm = searchTerm; - this.pageIndex = 0; - this.search(); - } - - /** - * Resets the search term to empty, resets pagination, and triggers a new search. - */ - onSearchCleared(): void { - this.currentSearchTerm = ''; - this.pageIndex = 0; - this.search(); - } - - /** - * Confirms the selection and closes the modal. - */ - onConfirm(): void { - this.dialogRef.close({ - selectedItem: this.selectedItem - } as SearchModalResult); - } - - /** - * Gets the count of currently selected items. - * @returns The number of selected items (0 or 1 for single selection) - */ - getSelectedCount(): number { - return this.selectedItem ? 1 : 0; - } -} diff --git a/web-app/admin/src/app/geometry/geometry.pipe.ts b/web-app/admin/src/app/geometry/geometry.pipe.ts index 094484d07..bdc04658f 100644 --- a/web-app/admin/src/app/geometry/geometry.pipe.ts +++ b/web-app/admin/src/app/geometry/geometry.pipe.ts @@ -1,5 +1,5 @@ import { Inject, Pipe, PipeTransform } from '@angular/core' -import { center as turfCenter } from '@turf/center' +import * as turfCenter from '@turf/center' import { Feature, Point } from 'geojson' import * as mgrs from 'mgrs' import { LocalStorageService } from '../upgrade/ajs-upgraded-providers' diff --git a/web-app/admin/src/app/logins/logins.component.html b/web-app/admin/src/app/logins/logins.component.html deleted file mode 100644 index ba3b6d1de..000000000 --- a/web-app/admin/src/app/logins/logins.component.html +++ /dev/null @@ -1,184 +0,0 @@ -
-
Logins
-
- -
-
-
- -
- - diff --git a/web-app/admin/src/app/logins/logins.component.scss b/web-app/admin/src/app/logins/logins.component.scss deleted file mode 100644 index d0173540c..000000000 --- a/web-app/admin/src/app/logins/logins.component.scss +++ /dev/null @@ -1,398 +0,0 @@ -:host { - display: block; -} - -.section-table-title { - font-size: 1rem; - font-weight: 600; - padding: 1rem 1.5rem 0.5rem; - color: #111827; - width: 100%; -} - -.integrated-navbar { - border-bottom: 2px solid #e5e7eb; - - .login-filters { - padding: 0.75rem 1.5rem; - } - - .filter-section { - display: none; - flex-wrap: wrap; - align-items: flex-end; - gap: 1.25rem; - - &.expanded { - display: flex; - } - } - - .form-group { - display: flex; - flex-direction: column; - gap: 0.25rem; - } - - .filter-label { - font-size: 0.75rem; - font-weight: 600; - color: #6b7280; - } - - .form-input { - height: 36px; - padding: 0 0.75rem; - border: 1px solid #d1d5db; - border-radius: 0.5rem; - background: #fff; - color: #111827; - font-size: 0.875rem; - } - - .date-range-inputs { - display: flex; - align-items: center; - gap: 0.5rem; - } - - .date-input { - width: 180px; - } - - .date-separator { - color: #6b7280; - font-size: 0.875rem; - } - - .results-select { - width: 100px; - } - - .user-input { - min-width: 260px; - } - - .suggestions { - position: absolute; - margin-top: 36px; - background: #fff; - border: 1px solid #e5e7eb; - border-radius: 8px; - box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), - 0 4px 6px -2px rgba(0, 0, 0, 0.05); - max-height: 240px; - overflow-y: auto; - z-index: 10; - width: 260px; - - .suggestion-item { - padding: 8px 12px; - cursor: pointer; - - &:hover { - background: #f3f4f6; - } - } - } -} - -.table-scroll.login-table-scroll { - height: calc( - var(--row-height, 44px) * var(--min-page-size, 5) + - 44px - ); - max-height: calc( - var(--row-height, 44px) * var(--min-page-size, 5) + - 44px - ); - overflow-y: auto; - overflow-x: hidden; - -webkit-overflow-scrolling: touch; - overscroll-behavior: contain; - border-bottom: 1px solid #e5e7eb; -} - -.login-items { - display: flex; - flex-direction: column; -} - -.login-item { - border-bottom: 1px solid #f1f5f9; - - &:last-child { - border-bottom: none; - } - - .login-content { - display: flex; - align-items: center; - gap: 1rem; - padding: 1rem 1.5rem; - transition: background-color 0.2s ease; - - &:hover { - background-color: #f8fafc; - } - } - - .login-icon { - flex-shrink: 0; - width: 2.5rem; - height: 2.5rem; - display: flex; - align-items: center; - justify-content: center; - background-color: #f3f4f6; - border-radius: 8px; - color: #6b7280; - - i { - font-size: 1.25rem; - } - } - - .login-info { - flex: 1; - min-width: 0; - - .login-primary { - font-size: 0.875rem; - font-weight: 600; - color: #111827; - display: flex; - align-items: center; - gap: 0.5rem; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - - .login-device { - color: #374151; - - a { - color: #3b82f6; - text-decoration: none; - - &:hover { - text-decoration: underline; - } - } - - &.unknown { - color: #9ca3af; - - i { - margin-right: 0.25rem; - } - } - } - - .login-secondary { - font-size: 0.75rem; - color: #6b7280; - line-height: 1.4; - } - } -} - -.empty-state { - display: flex; - align-items: center; - justify-content: center; - padding: 3rem 2rem; - min-height: 200px; - - .empty-state-content { - text-align: center; - - .empty-state-icon { - font-size: 3rem; - color: #9ca3af; - margin-bottom: 1rem; - display: block; - } - - .empty-state-text { - font-size: 1.1rem; - color: #6b7280; - font-weight: 500; - } - } -} - -.login-pagination { - display: flex; - justify-content: space-between; - gap: 0.5rem; - padding: 0.75rem 1.5rem; - background: #f9fafb; - border-top: 1px solid #e5e7eb; - - .action-button { - display: inline-flex; - align-items: center; - gap: 0.5rem; - padding: 0.5rem 1rem; - font-size: 0.875rem; - font-weight: 600; - border: 1px solid #d1d5db; - border-radius: 0.5rem; - background-color: #fff; - color: #374151; - cursor: pointer; - transition: all 0.2s ease; - text-decoration: none; - white-space: nowrap; - - &:hover:not(:disabled) { - background-color: #f9fafb; - border-color: #9ca3af; - } - - &:disabled { - opacity: 0.5; - cursor: not-allowed; - } - } -} - -.logins-table { - width: 100%; - border-collapse: collapse; - font-size: 0.9rem; - table-layout: fixed; - - thead th, - tfoot tr { - position: sticky; - } - - thead th { - top: 0; - } - - tfoot tr { - bottom: 0; - } - - th, - td { - font-size: 12px; - text-align: left; - padding: 0.35rem 0.75rem; - border-bottom: 1px solid #f1f5f9; - vertical-align: middle; - color: #111827; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - - tbody td { - height: var(--row-height, 44px); - } - - thead th, tfoot tr { - background: #f9fafb; - border-bottom: 2px solid #e5e7eb; - z-index: 1; - height: 44px; - } - - tbody tr:first-of-type td { - padding-top: 10px; - } - - tbody tr:hover { - background: #f8fafc; - } - - .login-device i { - margin-right: 0.25rem; - } - - .login-device.unknown { - color: #9ca3af; - } -} - -.input-with-clear { - position: relative; - display: inline-block; - - .form-input { - padding-right: 3rem; - } - - .clear-btn { - position: absolute; - right: 0.75rem; - top: 50%; - transform: translateY(-50%); - background: none; - border: none; - padding: 0.25rem; - cursor: pointer; - color: #6b7280; - border-radius: 4px; - transition: all 0.2s ease; - font-size: 0.875rem; - line-height: 1; - - &:hover { - background-color: #e5e7eb; - color: #374151; - } - } -} - -.filter-toggle { - display: inline-flex; - align-items: center; - justify-content: center; - height: 36px; - width: 36px; - font-size: 20px; - cursor: pointer; - color: #3f51b5; - border-radius: 4px; - transition: background-color 0.2s ease; - margin-left: 8px; - transform: translateY(2px); - border: 1px solid #ccc; - - &:hover { - background-color: rgba(63, 81, 181, 0.08); - } -} - -.filter-header { - display: flex; - justify-content: space-between; - align-items: center; -} - -.filter-toggle-wrapper { - display: flex; - justify-content: flex-end; - margin-top: 7px; - - button { - display: inline-flex; - align-items: center; - gap: 6px; - height: 36px; - font-size: 13px; - border: none; - box-shadow: none; - text-transform: none; - } -} - -.next-button { - display: flex; - justify-self: flex-end; -} diff --git a/web-app/admin/src/app/logins/logins.component.spec.ts b/web-app/admin/src/app/logins/logins.component.spec.ts deleted file mode 100644 index 7d2cd058f..000000000 --- a/web-app/admin/src/app/logins/logins.component.spec.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { ComponentFixture, TestBed, fakeAsync, tick } from '@angular/core/testing'; -import { FormsModule } from '@angular/forms'; -import { LoginsComponent } from './logins.component'; -import { - UserService, - DeviceService, - LoginService, - UserPagingService, - DevicePagingService, -} from 'admin/src/app/upgrade/ajs-upgraded-providers'; - -describe('LoginsComponent', () => { - let component: LoginsComponent; - let fixture: ComponentFixture; - const mockState = { go: jasmine.createSpy('go') }; - - const mockInjector = { - get: (token: string) => (token === '$state' ? mockState : null) - }; - - const mockLoginService = { - query: jasmine.createSpy('query').and.returnValue(Promise.resolve({ - logins: [], - next: undefined, - prev: undefined - })) - }; - - const mockUserPaging = { - constructDefault: jasmine.createSpy('constructDefault').and.returnValue({}), - refresh: jasmine.createSpy('refresh').and.returnValue(Promise.resolve()), - users: jasmine.createSpy('users').and.returnValue([]), - search: jasmine.createSpy('search').and.returnValue(Promise.resolve([])) - }; - - const mockDevicePaging = { - constructDefault: jasmine.createSpy('constructDefault').and.returnValue({}), - refresh: jasmine.createSpy('refresh').and.returnValue(Promise.resolve()), - devices: jasmine.createSpy('devices').and.returnValue([]), - search: jasmine.createSpy('search').and.returnValue(Promise.resolve([])) - }; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [FormsModule], - declarations: [LoginsComponent], - providers: [ - { provide: '$injector', useValue: mockInjector }, - { provide: LoginService, useValue: mockLoginService }, - { provide: UserPagingService, useValue: mockUserPaging }, - { provide: DevicePagingService, useValue: mockDevicePaging }, - // Unused in current spec but required by DI graph - { provide: UserService, useValue: {} }, - { provide: DeviceService, useValue: {} } - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(LoginsComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should call loginService on init and set empty state', fakeAsync(() => { - expect(mockLoginService.query).toHaveBeenCalled(); - tick(); - expect(component.loginPage).toBeTruthy(); - expect(component.loginPage.logins.length).toBe(0); - })); - - it('iconClass should return appropriate classes', () => { - expect(component.iconClass({ appVersion: 'Web Client', userAgent: '' } as any)).toContain('fa-desktop'); - expect(component.iconClass({ userAgent: 'Android' } as any)).toContain('fa-android'); - expect(component.iconClass({ userAgent: 'iOS' } as any)).toContain('fa-apple'); - expect(component.iconClass({ userAgent: 'Other' } as any)).toContain('fa-mobile'); - }); -}); diff --git a/web-app/admin/src/app/logins/logins.component.ts b/web-app/admin/src/app/logins/logins.component.ts deleted file mode 100644 index f50f677d9..000000000 --- a/web-app/admin/src/app/logins/logins.component.ts +++ /dev/null @@ -1,387 +0,0 @@ -import { Component, OnInit, Inject, Input } from '@angular/core'; -import * as moment from "moment"; -import * as _ from "underscore"; -import { - UserService, - DeviceService, - LoginService, - UserPagingService, - DevicePagingService, -} from "admin/src/app/upgrade/ajs-upgraded-providers"; -import { User } from "core-lib-src/user"; -import { - Device, - Login, - LoginFilter, - LoginPage, - DevicesResponse, - UsersResponse, -} from "admin/src/@types/dashboard/admin-dashboard"; - -@Component({ - selector: 'mage-logins', - templateUrl: './logins.component.html', - styleUrls: ['./logins.component.scss'] -}) -/** - * Admin/Dashboard component for viewing and filtering login activity by user, device, and date. - */ -export class LoginsComponent implements OnInit { - @Input() devices: Device[] = []; - @Input() users: User[] = []; - @Input() userId?: string; - - login = { - startDateOpened: false, - endDateOpened: false, - startDate: null, - endDate: null, - }; - - loginPage: LoginPage; - loginResultsLimit: number = 10; - loginSearchResults: User[] = []; - loginDeviceSearchResults: Device[] = []; - firstLogin: Login; - showPrevious: boolean = false; - showNext: boolean = false; - - filter: LoginFilter = {}; - user: User = null; - device: Device[] = []; - deviceText: string = ''; - userText: string = ''; - - toggleFilters = false; - - private userStateAndData: UsersResponse; - private userState: keyof UsersResponse = 'all'; - private deviceStateAndData: DevicesResponse; - private deviceState: keyof DevicesResponse = 'all'; - - private $state: any; - - constructor( - @Inject(UserService) private userService: any, - @Inject(DeviceService) private deviceService: any, - @Inject(LoginService) private loginService: any, - @Inject(UserPagingService) private userPagingService: any, - @Inject(DevicePagingService) private devicePagingService: any, - @Inject('$injector') private $injector: any, - ) { - this.$state = this.$injector.get('$state'); - } - - /** - * Initialize filters, suggestion sources, and load the initial login page. - */ - ngOnInit(): void { - if (this.userId) { - this.filter.user = { id: this.userId } as any; - } - - this.initUserSourceIfNeeded(); - this.initDeviceSourceIfNeeded(); - - this.loadInitialLogins(); - } - - /** Initialize backing user list using paging service when not supplied by parent */ - private initUserSourceIfNeeded() { - if ((this.users?.length || 0) > 0 || this.userId) return; - this.userStateAndData = this.userPagingService.constructDefault(); - this.userPagingService.refresh(this.userStateAndData).then(() => { - const initial = this.userPagingService.users(this.userStateAndData[this.userState]); - this.users = initial || []; - }); - } - - /** Initialize backing device list using paging service when not supplied by parent */ - private initDeviceSourceIfNeeded() { - if ((this.devices?.length || 0) > 0) { - this.loginDeviceSearchResults = this.devices.slice(); - return; - } - this.deviceStateAndData = this.devicePagingService.constructDefault(); - this.devicePagingService.refresh(this.deviceStateAndData).then(() => { - const initial = this.devicePagingService.devices(this.deviceStateAndData[this.deviceState]); - this.loginDeviceSearchResults = initial || []; - }); - } - - /** - * Load initial login data. - */ - loadInitialLogins() { - this.loginService - .query({ filter: this.filter, limit: this.loginResultsLimit }) - .then((loginPage: LoginPage) => { - this.loginPage = loginPage; - if (loginPage.logins.length) { - this.firstLogin = loginPage.logins[0]; - this.showNext = !!loginPage.next; - this.showPrevious = !!loginPage.prev; - } - }); - } - - /** - * Navigate to a specific login page URL. - * @param url URL of the login page. - */ - pageLogin(url: string) { - if (!url) return; - - this.loginService - .query({ url, filter: this.filter, limit: this.loginResultsLimit }) - .then((loginPage) => { - if (loginPage) { - this.loginPage = loginPage; - this.showNext = !!loginPage.next; - this.showPrevious = !!loginPage.prev; - } - }); - } - - /** - * Filter logins based on selected user, device, and date range. - */ - async filterLogins() { - if (this.userId) { - this.filter.user = { id: this.userId } as any; - } else { - this.filter.user = this.user as any; - } - - if (this.device && this.device.length > 0) { - this.filter.deviceIds = this.device.map((d) => d.id).join(","); - } else { - this.filter.deviceIds = null; - } - - this.filter.startDate = this.login.startDate; - if (this.login.endDate) { - this.filter.endDate = moment(this.login.endDate).endOf("day").toDate(); - } else { - this.filter.endDate = null; - } - - const hasUser = !!(this.filter.user && (this.filter.user as any).id); - const hasDevice = !!(this.filter.deviceIds && this.filter.deviceIds.length); - const hasDate = !!(this.filter.startDate || this.filter.endDate); - if (!hasUser && !hasDevice && !hasDate) { - this.loadInitialLogins(); - return; - } - - this.loginService - .query({ filter: this.filter, limit: this.loginResultsLimit }) - .then((loginPage) => { - this.loginPage = loginPage; - this.showNext = !!loginPage.next; - this.showPrevious = !!loginPage.prev; - }); - } - - /** Input change for user search (only when userId not locked) */ - onUserInputChange(value: string | User) { - if (this.userId) return; // ignore when locked to a user - let searchValue: string = - typeof value === "string" ? value : value?.displayName || ""; - this.searchLoginsAgainstUsers(searchValue); - } - - /** Bound to user text input */ - onUserSearchChange(term: string) { - this.userText = term; - this.user = null; - this.onUserInputChange(term); - if (!term) { - this.loginSearchResults = []; - this.filterLogins(); - } - } - - /** Device search input change - search suggestions only, no login query */ - async onDeviceSearchChange(term: string) { - this.deviceText = term; - this.device = []; - - if (!term) { - this.loginDeviceSearchResults = []; - this.filterLogins(); - return; - } - - if (this.deviceStateAndData) { - const devices: Device[] = await this.devicePagingService.search( - this.deviceStateAndData[this.deviceState], - term, - null - ); - this.loginDeviceSearchResults = devices || []; - return; - } - - if (this.devices?.length) { - const lower = term.toLowerCase(); - this.loginDeviceSearchResults = this.devices.filter(d => - String(d.uid || '').toLowerCase().includes(lower) || - String(d.userAgent || '').toLowerCase().includes(lower) - ).slice(0, 20); - } - } - - /** Select a user from suggestions */ - selectUser(u: User) { - this.user = u; - this.userText = this.displayUser(u); - this.loginSearchResults = []; - this.filterLogins(); - } - - /** Select a device from suggestions */ - selectDevice(d: Device) { - this.device = [d]; - this.deviceText = String(d?.uid ?? ''); - this.loginDeviceSearchResults = []; - this.filterLogins(); - } - - /** - * Search logins against users by a search string. - */ - searchLoginsAgainstUsers(searchString: string | null) { - if (this.userId) return Promise.resolve([]); - - if (this.userStateAndData) { - const term = !searchString || searchString === '.*' ? '' : searchString; - return this.userPagingService - .search(this.userStateAndData[this.userState], term) - .then((users: User[]) => { - this.loginSearchResults = (users || []).slice(0, 10); - return this.loginSearchResults; - }); - } - - if (!searchString || searchString === ".*") { - this.loginSearchResults = (this.users || []).slice(0, 10); - return Promise.resolve(this.loginSearchResults); - } - - const filteredUsers = (this.users || []).filter(user => - user.displayName && user.displayName.toLowerCase().includes(searchString.toLowerCase()) - ); - - this.loginSearchResults = filteredUsers.slice(0, 10); - - return Promise.resolve(this.loginSearchResults); - } - - /** Clear device filter and reload login data. */ - clearDeviceFilter() { - this.device = []; - this.deviceText = ''; - this.filterLogins(); - } - - /** Clear user filter and reload login data. */ - clearUserFilter() { - if (this.userId) return; // no-op when locked - this.user = null; - this.userText = ''; - this.onUserInputChange(""); - this.filterLogins(); - } - - /** Clear the user search input and selected user */ - onClearUserInput() { - if (this.userId) return; // locked to a user - this.userText = ''; - this.user = null; - this.loginSearchResults = []; - this.filterLogins(); - } - - /** Clear the device search input and selection */ - onClearDeviceInput() { - this.deviceText = ''; - this.device = []; - this.loginDeviceSearchResults = []; - this.filterLogins(); - } - - /** Display helpers */ - /** - * Display label for a user option. - * @param user User item - * @returns Display name or empty string - */ - displayUser(user: User): string { - return user && user.displayName ? user.displayName : ""; - } - - /** - * Display label for a device option. - * @param device Device item - * @returns UID or empty string - */ - displayDevice(device: Device): string | number { - return device && device.uid ? device.uid : ""; - } - - /** Date filter changed */ - dateFilterChanged() { - this.filterLogins(); - } - - /** Results limit changed */ - loginResultsLimitChanged() { - this.filterLogins(); - } - - /** Icon class helper */ - iconClass(device: Device): string { - if (!device) return "fa fa-mobile admin-generic-icon-xs"; - if ((device as any).iconClass) return (device as any).iconClass as any; - - const userAgent = (device.userAgent || "").toLowerCase(); - if (device.appVersion === "Web Client") - return "fa fa-desktop admin-desktop-icon-xs"; - if (userAgent.includes("android")) - return "fa fa-android admin-android-icon-xs"; - if (userAgent.includes("ios")) return "fa fa-apple admin-apple-icon-xs"; - return "fa fa-mobile admin-generic-icon-xs"; - } - - /** Navigation helpers */ - /** - * Navigate to the admin user details page. - * @param user Selected user - */ - gotoUser(user: User) { - this.$state.go('admin.user', { userId: (user as any).id }); - } - - /** - * Navigate to the admin device details page. - * @param device Selected device - */ - gotoDevice(device: Device) { - this.$state.go('admin.device', { deviceId: (device as any).id }); - } - - /** Relative and formatted timestamp helpers */ - fromNow(timestamp: string | Date): string { - return moment(timestamp).fromNow(); - } - - formatDate(timestamp: string | Date): string { - return moment(timestamp).format('MMM D YYYY hh:mm:ss A'); - } - - /** Permission helper */ - hasPermission(permission: string): boolean { - return _.contains(this.userService.myself?.role?.permissions || [], permission); - } -} diff --git a/web-app/admin/src/app/logins/logins.module.ts b/web-app/admin/src/app/logins/logins.module.ts deleted file mode 100644 index 82c1c48fa..000000000 --- a/web-app/admin/src/app/logins/logins.module.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { LoginsComponent } from './logins.component'; -import { MatToolbarModule } from '@angular/material/toolbar'; -import { MatIconModule } from '@angular/material/icon'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatSelectModule } from '@angular/material/select'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatNativeDateModule } from '@angular/material/core'; -import { MatTableModule } from '@angular/material/table'; - -@NgModule({ - declarations: [LoginsComponent], - imports: [ - CommonModule, - FormsModule, - MatToolbarModule, - MatIconModule, - MatFormFieldModule, - MatInputModule, - MatButtonModule, - MatCardModule, - MatSelectModule, - MatDatepickerModule, - MatAutocompleteModule, - MatNativeDateModule, - MatTableModule - ], - exports: [LoginsComponent], -}) -export class LoginsModule { } diff --git a/web-app/admin/src/app/map/clip/clip.component.ts b/web-app/admin/src/app/map/clip/clip.component.ts index d798bd1f2..57acb68dc 100644 --- a/web-app/admin/src/app/map/clip/clip.component.ts +++ b/web-app/admin/src/app/map/clip/clip.component.ts @@ -129,8 +129,7 @@ export class MapClipComponent implements OnInit, OnChanges, OnDestroy { let bounds = this.layer.getBounds() if (this.accuracy && this.accuracy.radius > 0) { - this.accuracyLayer = new Circle(this.accuracy.latlng, { - radius: this.accuracy.radius, + this.accuracyLayer = new Circle(this.accuracy.latlng, this.accuracy.radius, { color: this.accuracy.color, fillColor: this.accuracy.color, fillOpacity: 0.15, diff --git a/web-app/admin/src/app/observation/attachment/attachment-upload/attachment-upload.component.spec.ts b/web-app/admin/src/app/observation/attachment/attachment-upload/attachment-upload.component.spec.ts index 296b7fef6..0bbaac689 100644 --- a/web-app/admin/src/app/observation/attachment/attachment-upload/attachment-upload.component.spec.ts +++ b/web-app/admin/src/app/observation/attachment/attachment-upload/attachment-upload.component.spec.ts @@ -2,13 +2,6 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { AttachUploadComponent } from './attachment-upload.component'; -import { CommonModule } from '@angular/common'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatIconModule } from '@angular/material/icon'; -import { MatCardModule } from '@angular/material/card'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatListModule } from '@angular/material/list'; // for mat-nav-list describe('AttachUploadComponent', () => { let component: AttachUploadComponent; @@ -16,18 +9,10 @@ describe('AttachUploadComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [ - HttpClientTestingModule, - CommonModule, - MatPaginatorModule, - MatIconModule, - MatCardModule, - MatProgressSpinnerModule, - MatDividerModule, - MatListModule - ], + imports: [HttpClientTestingModule], declarations: [AttachUploadComponent] - }).compileComponents(); + }) + .compileComponents(); })); beforeEach(() => { diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-checkbox/observation-edit-checkbox.component.spec.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-checkbox/observation-edit-checkbox.component.spec.ts index 68ea56d82..f5493e717 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-checkbox/observation-edit-checkbox.component.spec.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-checkbox/observation-edit-checkbox.component.spec.ts @@ -68,34 +68,28 @@ describe('ObservationEditCheckboxComponent', () => { const label = checkbox.querySelector('.mat-checkbox-label') expect(label.textContent).toContain('*') }) - - it('should be not checked', async () => { - component.definition.value = false; - fixture.detectChanges(); - - await fixture.whenStable(); - - const checkboxDebugEl = fixture.debugElement.query(By.directive(MatCheckbox)); - expect(checkboxDebugEl).withContext('MatCheckbox not found').toBeTruthy(); - - const checkbox = checkboxDebugEl.componentInstance as MatCheckbox; - expect(checkbox.checked).withContext('Checkbox should be not checked').toBeFalse(); - }); - - - it('should be checked', async () => { - component.definition.value = true; - fixture.detectChanges(); - - await fixture.whenStable(); - - const checkboxDebugEl = fixture.debugElement.query(By.directive(MatCheckbox)); - expect(checkboxDebugEl).withContext('MatCheckbox not found').toBeTruthy(); - - const checkbox = checkboxDebugEl.componentInstance as MatCheckbox; - expect(checkbox.checked).withContext('Checkbox should be checked').toBeTrue(); - }); - + + it('should not be checked', (done) => { + component.definition.value = false + fixture.detectChanges() + + fixture.whenStable().then(() => { + const checkbox = fixture.debugElement.query(By.directive(MatCheckbox)).componentInstance + expect(checkbox.checked).toBeFalsy + done(); + }); + }) + + it('should be checked', (done) => { + component.definition.value = true + fixture.detectChanges() + + fixture.whenStable().then(() => { + const checkbox = fixture.debugElement.query(By.directive(MatCheckbox)).componentInstance + expect(checkbox.checked).toBeTruthy + done(); + }); + }) it('should show error on invalid and touched', async () => { const checkboxes = await loader.getAllHarnesses(MatCheckboxHarness); diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-form.component.html b/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-form.component.html index 986acf29b..81d244d32 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-form.component.html +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-form.component.html @@ -2,24 +2,19 @@
GEOMETRY - Point - Line - Polygon + Point + Line + Polygon + None
MANUAL EDIT - Lat/Lng - MGRS - DMS + Lat/Lng + MGRS + DMS
@@ -28,15 +23,13 @@
Latitude - +
Longitude - +
@@ -47,8 +40,7 @@
MGRS - + Invalid MGRS
@@ -60,16 +52,26 @@
Latitude DMS - + Invalid DMS latitude
Longitude DMS - + Invalid DMS longitude
@@ -78,7 +80,6 @@
- +
\ No newline at end of file diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-form.component.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-form.component.ts index e2b6a994e..9b10274d9 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-form.component.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-form.component.ts @@ -17,7 +17,7 @@ export class MGRSValidatorDirective implements Validator { let error: ValidationErrors | null try { mgrs.toPoint(control.value) - } catch (e) { + } catch(e) { error = { mgrs: { value: control.value @@ -60,7 +60,7 @@ type DMSFormValue = Partial<{ [DimensionKey.Latitude]: string, [DimensionKey.Lon templateUrl: './observation-edit-geometry-form.component.html', styleUrls: ['./observation-edit-geometry-form.component.scss'], providers: [ - { provide: NG_VALIDATORS, useExisting: MGRSValidatorDirective, multi: true }, + { provide: NG_VALIDATORS, useExisting: MGRSValidatorDirective, multi: true }, { provide: NG_VALIDATORS, useExisting: DMSValidatorDirective, multi: true } ] }) @@ -97,7 +97,8 @@ export class ObservationEditGeometryFormComponent implements OnChanges, OnInit { @Inject(MapService) private mapService: any, @Inject(GeometryService) private geometryService: any, @Inject(LocalStorageService) private localStorageService: any, - private snackBar: MatSnackBar) { + private snackBar: MatSnackBar) + { this.coordinateSystem = this.localStorageService.getCoordinateSystemEdit() } @@ -212,7 +213,7 @@ export class ObservationEditGeometryFormComponent implements OnChanges, OnInit { this.dmsForm.setValue(formValue, { emitEvent: true }) return } - const [first, second] = coords.sort((a, b) => a instanceof DMSCoordinate ? -1 : (typeof b === 'number' ? 0 : 1)) + const [ first, second ] = coords.sort((a, b) => a instanceof DMSCoordinate ? -1 : (typeof b === 'number' ? 0 : 1)) if (typeof first === 'number') { // must both be numbers - assume latitude first const latDMS = DMSCoordinate.fromDecimalDegrees(first, DimensionKey.Latitude) @@ -248,7 +249,7 @@ export class ObservationEditGeometryFormComponent implements OnChanges, OnInit { if (this.mgrsModel.control.invalid) { return } - const [lon, lat] = mgrs.toPoint(this.mgrs) + const [ lon, lat ] = mgrs.toPoint(this.mgrs) this.editCurrentCoordinates('mgrs', lat, lon) } @@ -274,6 +275,14 @@ export class ObservationEditGeometryFormComponent implements OnChanges, OnInit { this.feature.geometry.coordinates = [] this.feature.geometry.type = 'Polygon' break; + default: + this.latitude = null + this.longitude = null + this.mgrs = null + this.dmsForm.setValue({ [DimensionKey.Latitude]: '', [DimensionKey.Longitude]: '' }, { emitEvent: false }) + delete this.feature.geometry.type + this.featureEdit.cancel() + break; } if (shapeType) { this.onEditShape() @@ -286,16 +295,16 @@ export class ObservationEditGeometryFormComponent implements OnChanges, OnInit { editCurrentCoordinates(from: CoordinateSystemKey, lat: number, lon: number): void { this.coordinateEditSource = from - let coordinates = [...this.feature.geometry.coordinates] + let coordinates = [ ...this.feature.geometry.coordinates ] if (this.feature.geometry.type === 'Point') { - coordinates = [lon, lat] + coordinates = [ lon, lat ] } else if (this.feature.geometry.type === 'LineString') { - coordinates[this.selectedVertexIndex] = [lon, lat] + coordinates[this.selectedVertexIndex] = [ lon, lat ] } else if (this.feature.geometry.type === 'Polygon') { if (coordinates[0]) { - coordinates[0][this.selectedVertexIndex] = [lon, lat] + coordinates[0][this.selectedVertexIndex] = [ lon, lat ] } } ensurePolygonClosed(this.feature, coordinates) @@ -323,7 +332,7 @@ export class ObservationEditGeometryFormComponent implements OnChanges, OnInit { this.coordinateEditSource = null if (from !== 'mgrs') { this.mgrs = this.toMgrs(this.feature) - this.mgrsModel.control.setValue(this.mgrs, { emitEvent: false, emitViewToModelChange: false, emitModelToViewChange: true }) + this.mgrsModel.control.setValue(this.mgrs, {emitEvent:false, emitViewToModelChange:false, emitModelToViewChange:true}) } if (from !== 'dms') { this.dmsForm.setValue({ @@ -338,10 +347,10 @@ function ensurePolygonClosed(feature, coordinates) { // Ensure first and last points are the same for polygon if (feature.geometry.type === 'Polygon') { if (feature.editedVertex === 0) { - coordinates[0][coordinates[0].length - 1] = [...coordinates[0][0]] + coordinates[0][coordinates[0].length - 1] = [ ...coordinates[0][0] ] } else if (feature.editedVertex === coordinates[0].length - 1) { - coordinates[0][0] = [...coordinates[0][coordinates[0].length - 1]] + coordinates[0][0] = [ ...coordinates[0][coordinates[0].length - 1] ] } } } diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit.component.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit.component.ts index 9deb4441e..5cf466773 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit.component.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit.component.ts @@ -1,130 +1,97 @@ -import { animate, style, transition, trigger } from "@angular/animations"; -import { CdkDragDrop, moveItemInArray } from "@angular/cdk/drag-drop"; -import { DOCUMENT } from "@angular/common"; -import { - Component, - ElementRef, - EventEmitter, - Inject, - Input, - OnChanges, - OnInit, - Output, - QueryList, - SimpleChanges, - ViewChild, - ViewChildren, -} from "@angular/core"; -import { - UntypedFormArray, - UntypedFormBuilder, - UntypedFormControl, - UntypedFormGroup, - Validators, -} from "@angular/forms"; -import { DomSanitizer } from "@angular/platform-browser"; -import { first } from "rxjs/operators"; -import { - EventService, - FilterService, - LocalStorageService, - MapService, - ObservationService, - UserService, -} from "../../../app/upgrade/ajs-upgraded-providers"; -import { ObservationEditFormPickerComponent } from "./observation-edit-form-picker.component"; -import * as moment from "moment"; -import { ObservationEditDiscardComponent } from "./observation-edit-discard/observation-edit-discard.component"; -import { - MatSnackBar, - MatSnackBarRef, - SimpleSnackBar, -} from "@angular/material/snack-bar"; -import { MatIconRegistry } from "@angular/material/icon"; -import { MatDialog } from "@angular/material/dialog"; -import { MatBottomSheet } from "@angular/material/bottom-sheet"; -import { - AttachmentService, - AttachmentUploadEvent, - AttachmentUploadStatus, -} from "../attachment/attachment.service"; -import { FileUpload } from "../attachment/attachment-upload/attachment-upload.component"; -import { AttachmentAction } from "./observation-edit-attachment/observation-edit-attachment-action"; -import { Observation } from "src/app/filter/filter.types"; - -export type ObservationFormControl = UntypedFormControl & { definition: any }; +import { animate, style, transition, trigger } from '@angular/animations' +import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop' +import { DOCUMENT } from '@angular/common' +import { Component, ElementRef, EventEmitter, Inject, Input, OnChanges, OnInit, Output, QueryList, SimpleChanges, ViewChild, ViewChildren } from '@angular/core' +import { UntypedFormArray, UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms' +import { DomSanitizer } from '@angular/platform-browser' +import { first } from 'rxjs/operators' +import { EventService, FilterService, LocalStorageService, MapService, ObservationService, UserService } from '../../../app/upgrade/ajs-upgraded-providers' +import { ObservationEditFormPickerComponent } from './observation-edit-form-picker.component' +import * as moment from 'moment'; +import { ObservationEditDiscardComponent } from './observation-edit-discard/observation-edit-discard.component' +import { MatSnackBar, MatSnackBarRef, SimpleSnackBar } from '@angular/material/snack-bar' +import { MatIconRegistry } from '@angular/material/icon' +import { MatDialog } from '@angular/material/dialog' +import { MatBottomSheet } from '@angular/material/bottom-sheet' +import { AttachmentService, AttachmentUploadEvent, AttachmentUploadStatus } from '../attachment/attachment.service' +import { FileUpload } from '../attachment/attachment-upload/attachment-upload.component' +import { AttachmentAction } from './observation-edit-attachment/observation-edit-attachment-action' + +export type ObservationFormControl = UntypedFormControl & { definition: any } @Component({ - selector: "observation-edit", - templateUrl: "./observation-edit.component.html", - styleUrls: ["./observation-edit.component.scss"], + selector: 'observation-edit', + templateUrl: './observation-edit.component.html', + styleUrls: ['./observation-edit.component.scss'], animations: [ - trigger("error", [ - transition(":enter", [ + trigger('error', [ + transition(':enter', [ style({ height: 0, opacity: 0 }), - animate("250ms", style({ height: "*", opacity: 1 })), - ]), - transition(":leave", [ - animate("250ms", style({ height: 0, opacity: 0 })), + animate('250ms', style({ height: '*', opacity: 1 })), ]), + transition(':leave', [ + animate('250ms', style({ height: 0, opacity: 0 })) + ]) ]), - trigger("mask", [ - transition(":enter", [ + trigger('mask', [ + transition(':enter', [ style({ opacity: 0 }), - animate("250ms", style({ opacity: 0.2 })), + animate('250ms', style({ opacity: .2 })), ]), - transition(":leave", [animate("250ms", style({ opacity: 0 }))]), - ]), - ], + transition(':leave', [ + animate('250ms', style({ opacity: 0 })) + ]) + ]) + ] }) export class ObservationEditComponent implements OnInit, OnChanges { - @Input() preview: boolean; - @Input() observation: Observation; - attachments = []; + @Input() preview: boolean + @Input() observation: any + attachments =[] - @Output() close = new EventEmitter(); + @Output() close = new EventEmitter() - @ViewChild("editContent", { static: true }) editContent: ElementRef; - @ViewChild("dragHandle", { static: true }) dragHandle: ElementRef; - @ViewChildren("form") formElements: QueryList; + @ViewChild('editContent', { static: true }) editContent: ElementRef + @ViewChild('dragHandle', { static: true }) dragHandle: ElementRef + @ViewChildren('form') formElements: QueryList - event: Event; - formGroup: UntypedFormGroup; - formDefinitions: any; + event: any + formGroup: UntypedFormGroup + formDefinitions: any timestampDefinition = { - title: "", - type: "date", - name: "timestamp", - required: true, - }; + title: '', + type: 'date', + name: 'timestamp', + required: true + } geometryDefinition = { - title: "Location", - type: "geometry", - name: "geometry", - required: true, - }; + title: 'Location', + type: 'geometry', + name: 'geometry', + required: true + } - mask = false; - saving = false; - error: any; + mask = false + saving = false + error: any - uploads: FileUpload[] = []; - attachmentUrl: string; + uploads: FileUpload[] = [] + attachmentUrl: string - isNewObservation: boolean; - canDeleteObservation: boolean; - observationForm = {}; - formOptions = { expand: false }; + isNewObservation: boolean + canDeleteObservation: boolean + observationForm = {} + formOptions = { expand: false } - initialObservation: any; - geometryStyle: any; + initialObservation: any + geometryStyle: any - primaryField: any; - primaryFieldValue: string; - secondaryField: any; - secondaryFieldValue: string; + primaryField: any + primaryFieldValue: string + secondaryField: any + secondaryFieldValue: string - formRemoveSnackbar: MatSnackBarRef; + formRemoveSnackbar: MatSnackBarRef constructor( sanitizer: DomSanitizer, @@ -140,113 +107,89 @@ export class ObservationEditComponent implements OnInit, OnChanges { @Inject(FilterService) private filterService: any, @Inject(EventService) private eventService: any, @Inject(ObservationService) private observationService: any, - @Inject(LocalStorageService) private localStorageService: any - ) { - matIconRegistry.addSvgIcon( - "handle", - sanitizer.bypassSecurityTrustResourceUrl("assets/images/handle-24px.svg") - ); + @Inject(LocalStorageService) private localStorageService: any) { + + matIconRegistry.addSvgIcon('handle', sanitizer.bypassSecurityTrustResourceUrl('assets/images/handle-24px.svg')); } ngOnInit(): void { - if (this.observation.id === "new") { - this.formOptions.expand = true; + if (this.observation.id === 'new') { + this.formOptions.expand = true } - this.canDeleteObservation = - this.observation.id !== "new" && - (this.hasEventUpdatePermission() || - this.isCurrentUsersObservation() || - this.hasUpdatePermissionsInEventAcl()); + this.canDeleteObservation = this.observation.id !== 'new' && + (this.hasEventUpdatePermission() || this.isCurrentUsersObservation() || this.hasUpdatePermissionsInEventAcl()) - this.attachmentService.upload$.subscribe((event) => - this.onAttachmentUpload(event) - ); + this.attachmentService.upload$.subscribe(event => this.onAttachmentUpload(event)) } ngOnChanges(changes: SimpleChanges): void { - if (changes.observation && changes.observation.currentValue) { - this.event = this.eventService.getEventById(this.observation.eventId); - this.formDefinitions = this.eventService - .getFormsForEvent(this.event) - .reduce((map, form) => { - map[form.id] = form; - return map; - }, {}); - - this.isNewObservation = this.observation.id === "new"; - this.initialObservation = JSON.parse(JSON.stringify(this.observation)); + if (changes.observation && changes.observation.currentValue) { + this.event = this.eventService.getEventById(this.observation.eventId) + this.formDefinitions = this.eventService.getFormsForEvent(this.event).reduce((map, form) => { + map[form.id] = form + return map + }, {}) + + this.isNewObservation = this.observation.id === 'new' + this.initialObservation = JSON.parse(JSON.stringify(this.observation)) if (this.observation.style) { - this.geometryStyle = JSON.parse(JSON.stringify(this.observation.style)); + this.geometryStyle = JSON.parse(JSON.stringify(this.observation.style)) } if (this.isNewObservation) { - this.mapService.addFeaturesToLayer([this.observation], "observations"); + this.mapService.addFeaturesToLayer([this.observation], 'observations') } - this.toFormGroup(this.observation); - this.updatePrimarySecondary(); + this.toFormGroup(this.observation) + this.updatePrimarySecondary() } } hasEventUpdatePermission(): boolean { - return this.userService.myself.role.permissions.includes( - "DELETE_OBSERVATION" - ); + return this.userService.myself.role.permissions.includes('DELETE_OBSERVATION') } isCurrentUsersObservation(): boolean { - return this.observation.userId === this.userService.myself.id; + return this.observation.userId === this.userService.myself.id } hasUpdatePermissionsInEventAcl(): boolean { - const myAccess = - this.filterService.getEvent().acl[this.userService.myself.id] || {}; - const aclPermissions = myAccess["permissions"] || []; - return aclPermissions.includes("update"); + const myAccess = this.filterService.getEvent().acl[this.userService.myself.id] || {} + const aclPermissions = myAccess.permissions || [] + return aclPermissions.includes('update') } token(): string { - return this.localStorageService.getToken(); + return this.localStorageService.getToken() } // TODO multi-form build out validators here as well for each form control - toFormGroup(observation: Observation): void { - const timestampControl = new UntypedFormControl( - moment(observation.properties.timestamp).toDate(), - Validators.required - ); - const geometryControl = new UntypedFormControl( - observation.geometry, - Validators.required - ); - - const formArray = new UntypedFormArray([]); - const observationForms = observation.properties.forms || []; - observationForms.forEach((observationForm) => { - const formDefinition = this.formDefinitions[observationForm.formId]; + toFormGroup(observation: any): void { + const timestampControl = new UntypedFormControl(moment(observation.properties.timestamp).toDate(), Validators.required); + const geometryControl = new UntypedFormControl(observation.geometry, Validators.required); + + const formArray = new UntypedFormArray([]) + const observationForms = observation.properties.forms || [] + observationForms.forEach(observationForm => { + const formDefinition = this.formDefinitions[observationForm.formId] const fieldGroup = new UntypedFormGroup({ id: new UntypedFormControl(observationForm.id), - formId: new UntypedFormControl(formDefinition.id), - }); + formId: new UntypedFormControl(formDefinition.id) + }) formDefinition.fields - .filter((field) => !field.archived) + .filter(field => !field.archived) .sort((a, b) => a.id - b.id) - .forEach((field) => { - const value = this.isNewObservation - ? field.value - : observationForm[field.name]; - const fieldControl = new UntypedFormControl( - value, - field.required ? Validators.required : null - ); - fieldGroup.addControl(field.name, fieldControl); - }); + .forEach(field => { + const value = this.isNewObservation ? field.value : observationForm[field.name] + const fieldControl = new UntypedFormControl(value, field.required ? Validators.required : null) + fieldGroup.addControl(field.name, fieldControl) + }) - formArray.push(fieldGroup); - }); + formArray.push(fieldGroup) + }) this.formGroup = this.formBuilder.group({ id: observation.id, @@ -255,325 +198,248 @@ export class ObservationEditComponent implements OnInit, OnChanges { geometry: geometryControl, properties: new UntypedFormGroup({ timestamp: timestampControl, - forms: formArray, - }), - }); - - if ( - observation.properties.forms.length === 0 && - this.hasForms() && - observation.id === "new" - ) { - this.pickForm(); + forms: formArray + }) + }) + + if (observation.properties.forms.length === 0 && this.hasForms() && observation.id === 'new') { + this.pickForm() } } updatePrimarySecondary(): void { - const forms = this.formGroup - .get("properties") - .get("forms") as UntypedFormArray; + const forms = this.formGroup.get('properties').get('forms') as UntypedFormArray if (forms.length) { - const primaryFormGroup = forms.at(0) as UntypedFormGroup; - const definition = - this.formDefinitions[primaryFormGroup.get("formId").value]; + const primaryFormGroup = forms.at(0) as UntypedFormGroup + const definition = this.formDefinitions[primaryFormGroup.get('formId').value] - let primaryFieldValue; + let primaryFieldValue if (primaryFormGroup.contains(definition.primaryFeedField)) { - this.primaryField = definition.fields.find( - (field) => field.name === definition.primaryFeedField - ); - primaryFieldValue = primaryFormGroup.get( - definition.primaryFeedField - ).value; + this.primaryField = definition.fields.find(field => field.name === definition.primaryFeedField) + primaryFieldValue = primaryFormGroup.get(definition.primaryFeedField).value } - let secondaryFieldValue; + let secondaryFieldValue if (primaryFormGroup.contains(definition.secondaryFeedField)) { - this.secondaryField = definition.fields.find( - (field) => field.name === definition.secondaryFeedField - ); - secondaryFieldValue = primaryFormGroup.get( - definition.secondaryFeedField - ).value; + this.secondaryField = definition.fields.find(field => field.name === definition.secondaryFeedField) + secondaryFieldValue = primaryFormGroup.get(definition.secondaryFeedField).value } - if ( - (this.primaryField && primaryFieldValue !== this.primaryFieldValue) || - (this.secondaryField && - secondaryFieldValue !== this.secondaryFieldValue) - ) { - this.primaryFieldValue = this.primaryField ? primaryFieldValue : null; - this.secondaryFieldValue = this.secondaryField - ? secondaryFieldValue - : null; - - const observation = this.formGroup.value; - - const style = this.observationService.getObservationStyleForForm( - observation, - this.event, - definition - ); - observation.style = style; - this.geometryStyle = style; - - this.mapService.updateFeatureForLayer(observation, "Observations"); + if ((this.primaryField && primaryFieldValue !== this.primaryFieldValue) || + ((this.secondaryField && secondaryFieldValue !== this.secondaryFieldValue))) { + this.primaryFieldValue = this.primaryField ? primaryFieldValue : null + this.secondaryFieldValue = this.secondaryField ? secondaryFieldValue : null + + const observation = this.formGroup.value + + const style = this.observationService.getObservationStyleForForm(observation, this.event, definition) + observation.style = style + this.geometryStyle = style + + this.mapService.updateFeatureForLayer(observation, 'Observations') } } } save(): void { if (this.formRemoveSnackbar) { - this.formRemoveSnackbar.dismiss(); + this.formRemoveSnackbar.dismiss() } - this.saving = true; - this.uploads = []; + this.saving = true + this.uploads = [] // TODO look at this: this is a hack that will be corrected when we pull ids from the server - const form = this.formGroup.getRawValue(); + const form = this.formGroup.getRawValue() const id = form.id; - if (form.id === "new") { - delete form.id; + if (form.id === 'new') { + delete form.id } - this.eventService.saveObservation(form).then( - (observation) => { - // If this feature was added to the map as a new observation, remove it - // as the event service will add it back to the map based on it new id - // if it passes the current filter. - if (id === "new") { - this.mapService.removeFeatureFromLayer({ id: id }, "observations"); - } + this.eventService.saveObservation(form).then(observation => { + // If this feature was added to the map as a new observation, remove it + // as the event service will add it back to the map based on it new id + // if it passes the current filter. + if (id === 'new') { + this.mapService.removeFeatureFromLayer({ id: id }, 'observations') + } - this.error = null; - this.observation = observation; - this.formGroup.get("id").setValue(observation.id); - - form.properties.forms.forEach((form) => { - const formDefinition = this.formDefinitions[form.formId]; - Object.keys(form).forEach((fieldName) => { - const fieldDefinition = formDefinition.fields.find( - (field) => field.name === fieldName - ); - const value = form[fieldName]; - if ( - fieldDefinition && - fieldDefinition.type === "attachment" && - Array.isArray(value) - ) { - value.forEach((fieldAttachment) => { - const attachment = observation.attachments.find( - (attachment) => { - return ( - !attachment.url && - attachment.name === fieldAttachment.name && - attachment.contentType == fieldAttachment.contentType - ); - } - ); - - if ( - fieldAttachment.file && - fieldAttachment.action === AttachmentAction.ADD && - attachment - ) { - fieldAttachment.attachmentId = attachment.id; - this.uploads.push(attachment); - } + this.error = null + this.observation = observation + this.formGroup.get('id').setValue(observation.id) + + form.properties.forms.forEach(form => { + const formDefinition = this.formDefinitions[form.formId]; + Object.keys(form).forEach(fieldName => { + const fieldDefinition = formDefinition.fields.find(field => field.name === fieldName); + const value = form[fieldName]; + if (fieldDefinition && fieldDefinition.type === 'attachment' && Array.isArray(value)) { + value.forEach(fieldAttachment => { + const attachment = observation.attachments.find(attachment => { + return !attachment.url && + attachment.name === fieldAttachment.name && + attachment.contentType == fieldAttachment.contentType }); - } - }); - }); - if (this.uploads.length) { - this.attachmentUrl = observation.url; - } else { - this.close.emit(this.observation); - } - }, - (err) => { - this.formGroup.markAllAsTouched(); + if (fieldAttachment.file && fieldAttachment.action === AttachmentAction.ADD && attachment) { + fieldAttachment.attachmentId = attachment.id + this.uploads.push(attachment) + } + }) + } + }) + }) - if (id === "new") { - this.observation.id = "new"; - } + if (this.uploads.length) { + this.attachmentUrl = observation.url + } else { + this.close.emit(this.observation) + } + }, err => { + this.formGroup.markAllAsTouched() - this.saving = false; - this.error = { - message: err.data.message, - }; + if (id === 'new') { + this.observation.id = 'new' + } + + this.saving = false; + this.error = { + message: err.data.message } - ); + }) } cancel(): void { this.observation.geometry = this.initialObservation.geometry; - if (this.observation.id !== "new") { - this.mapService.updateFeatureForLayer(this.observation, "observations"); + if (this.observation.id !== 'new') { + this.mapService.updateFeatureForLayer(this.observation, 'observations') } else { - this.mapService.removeFeatureFromLayer(this.observation, "observations"); + this.mapService.removeFeatureFromLayer(this.observation, 'observations') } if (this.formRemoveSnackbar) { - this.formRemoveSnackbar.dismiss(); + this.formRemoveSnackbar.dismiss() } - this.dialog - .open(ObservationEditDiscardComponent, { - width: "300px", - autoFocus: false, - position: { left: "75px" }, - }) - .afterClosed() - .subscribe((result) => { - if (result === "discard") { - this.close.emit(); - } - }); + this.dialog.open(ObservationEditDiscardComponent, { + width: '300px', + autoFocus: false, + position: { left: '75px' } + }).afterClosed().subscribe(result => { + if (result === 'discard') { + this.close.emit() + } + }) } hasForms(): boolean { - const definitions = this.formDefinitions || {}; - return Object.keys(definitions).length > 0; + const definitions = this.formDefinitions || {} + return Object.keys(definitions).length > 0 } onGeometryEdit(event): void { - this.mask = event.action === "edit"; + this.mask = event.action === 'edit'; if (this.mask) { const elementBounds = event.source.nativeElement.getBoundingClientRect(); - const parentBounds = - this.editContent.nativeElement.getBoundingClientRect(); - if ( - elementBounds.top < parentBounds.top || - elementBounds.bottom > parentBounds.bottom - ) { - event.source.nativeElement.scrollIntoView({ - behavior: "smooth", - block: "nearest", - }); + const parentBounds = this.editContent.nativeElement.getBoundingClientRect(); + if (elementBounds.top < parentBounds.top || elementBounds.bottom > parentBounds.bottom) { + event.source.nativeElement.scrollIntoView({ behavior: "smooth", block: "nearest" }); } } } pickForm(): void { - this.formOptions.expand = true; - this.bottomSheet - .open(ObservationEditFormPickerComponent, { - panelClass: "feed-panel", - }) - .afterDismissed() - .subscribe((form) => { - if (!form) return; + this.formOptions.expand = true + this.bottomSheet.open(ObservationEditFormPickerComponent, { + panelClass: 'feed-panel' + }).afterDismissed().subscribe(form => { + if (!form) return + + const fieldsGroup = new UntypedFormGroup({ + formId: new UntypedFormControl(form.id) + }); - const fieldsGroup = new UntypedFormGroup({ - formId: new UntypedFormControl(form.id), + form.fields + .filter(field => !field.archived) + .sort((a, b) => a.id - b.id) + .forEach(field => { + const fieldControl = new UntypedFormControl(field.value, field.required ? Validators.required : null) + fieldsGroup.addControl(field.name, fieldControl) }); - form.fields - .filter((field) => !field.archived) - .sort((a, b) => a.id - b.id) - .forEach((field) => { - const fieldControl = new UntypedFormControl( - field.value, - field.required ? Validators.required : null - ); - fieldsGroup.addControl(field.name, fieldControl); - }); - - ( - this.formGroup.get("properties").get("forms") as UntypedFormArray - ).push(fieldsGroup); - - this.formElements.changes - .pipe(first()) - .subscribe((queryList: QueryList) => { - queryList.last.nativeElement.scrollIntoView({ behavior: "smooth" }); - }); - }); + (this.formGroup.get('properties').get('forms') as UntypedFormArray).push(fieldsGroup); + + this.formElements.changes.pipe(first()).subscribe((queryList: QueryList) => { + queryList.last.nativeElement.scrollIntoView({ behavior: 'smooth' }) + }) + }) } removeForm(formGroup: UntypedFormGroup): void { - const formArray = this.formGroup - .get("properties") - .get("forms") as UntypedFormArray; - const index = formArray.controls.indexOf(formGroup); - formArray.removeAt(index); + const formArray = this.formGroup.get('properties').get('forms') as UntypedFormArray + const index = formArray.controls.indexOf(formGroup) + formArray.removeAt(index) - this.formRemoveSnackbar = this.snackBar.open("Form Deleted", "UNDO", { + this.formRemoveSnackbar = this.snackBar.open('Form Deleted', 'UNDO', { duration: 5000, - panelClass: "form-remove-snackbar", - }); + panelClass: 'form-remove-snackbar', + }) this.formRemoveSnackbar.onAction().subscribe(() => { - formArray.insert(index, formGroup); - }); + formArray.insert(index, formGroup) + }) } reorderForm(event: CdkDragDrop): void { - if (event.currentIndex === event.previousIndex) return; + if (event.currentIndex === event.previousIndex) return - const forms = ( - this.formGroup.get("properties").get("forms") as UntypedFormArray - ).controls; - moveItemInArray(forms, event.previousIndex, event.currentIndex); + const forms = (this.formGroup.get('properties').get('forms') as UntypedFormArray).controls + moveItemInArray(forms, event.previousIndex, event.currentIndex) // re-calculate primary/secondary based new first form if (event.currentIndex === 0 || event.previousIndex === 0) { - this.updatePrimarySecondary(); + this.updatePrimarySecondary() } } dragStart(event: DragEvent): void { - this.document.body.classList.add("item-drag"); + this.document.body.classList.add('item-drag') } dragEnd(event: DragEvent): void { - this.document.body.classList.remove("item-drag"); + this.document.body.classList.remove('item-drag') } private onAttachmentUpload(event: AttachmentUploadEvent): void { switch (event.status) { case AttachmentUploadStatus.COMPLETE: { - this.eventService.addAttachmentToObservation( - this.observation, - event.response - ); - - this.uploads = this.uploads.filter( - (attachment) => attachment.id !== event.upload.attachmentId - ); + this.eventService.addAttachmentToObservation(this.observation, event.response) + + this.uploads = this.uploads.filter(attachment => attachment.id !== event.upload.attachmentId) if (this.uploads.length === 0) { - this.saving = false; - this.close.emit(this.observation); + this.saving = false + this.close.emit(this.observation) } break; } case AttachmentUploadStatus.ERROR: { - this.snackBar.open(event.response?.error, null, { duration: 4000 }); + this.snackBar.open(event.response?.error, null, { duration: 4000 }) - const formArray = this.formGroup - .get("properties") - .get("forms") as UntypedFormArray; + const formArray = this.formGroup.get('properties').get('forms') as UntypedFormArray formArray.controls.forEach((formGroup: UntypedFormGroup) => { - const formId = formGroup.get("formId").value; + const formId = formGroup.get('formId').value const formDefinition = this.formDefinitions[formId]; - Object.keys(formGroup.controls).forEach((fieldName) => { - const fieldDefinition = formDefinition.fields.find( - (field) => field.name === fieldName - ); - if (fieldDefinition && fieldDefinition.type === "attachment") { - let attachments = formGroup.get(fieldName).value || []; - attachments = attachments.filter( - (attachment) => - attachment.attachmentId !== event.upload.attachmentId - ); - formGroup.get(fieldName).setValue(attachments); + Object.keys(formGroup.controls).forEach(fieldName => { + const fieldDefinition = formDefinition.fields.find(field => field.name === fieldName); + if (fieldDefinition && fieldDefinition.type === 'attachment') { + let attachments = formGroup.get(fieldName).value || [] + attachments = attachments.filter(attachment => attachment.attachmentId !== event.upload.attachmentId) + formGroup.get(fieldName).setValue(attachments) } - }); - }); + }) + }) this.saving = false; break; diff --git a/web-app/admin/src/app/observation/observation.module.ts b/web-app/admin/src/app/observation/observation.module.ts deleted file mode 100644 index e35264525..000000000 --- a/web-app/admin/src/app/observation/observation.module.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { DragDropModule } from '@angular/cdk/drag-drop'; - -// Material Modules -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatBottomSheetModule } from '@angular/material/bottom-sheet'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatChipsModule } from '@angular/material/chips'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatGridListModule } from '@angular/material/grid-list'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatListModule } from '@angular/material/list'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatRadioModule } from '@angular/material/radio'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSliderModule } from '@angular/material/slider'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { MatToolbarModule } from '@angular/material/toolbar'; -import { MatDatetimepickerModule } from '@mat-datetimepicker/core'; -import { MatMomentDatetimeModule } from '@mat-datetimepicker/moment'; -import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; -import { InputMaskModule } from '@ngneat/input-mask'; - -// Geometry Module -import { GeometryModule } from '../geometry/geometry.module'; -import { MomentModule } from '../moment/moment.module'; -import { MapClipComponent } from '../map/clip/clip.component'; - -// Observation Components -import { - ObservationEditCheckboxComponent, - ObservationEditDateComponent, - ObservationEditSelectComponent, - ObservationEditEmailComponent, - ObservationEditGeometryComponent, - ObservationEditGeometryFormComponent, - ObservationEditGeometryMapComponent, - ObservationEditMultiselectComponent, - ObservationEditNumberComponent, - ObservationEditRadioComponent, - ObservationEditTextComponent, - ObservationEditTextareaComponent, - ObservationEditFormComponent, - ObservationEditComponent -} from './observation-edit/observation-edit'; - -import { ObservationEditFormPickerComponent } from './observation-edit/observation-edit-form-picker.component'; -import { ObservationEditAttachmentComponent } from './observation-edit/observation-edit-attachment/observation-edit-attachment.component'; -import { ObservationEditPasswordComponent } from './observation-edit/observation-edit-password/observation-edit-password.component'; -import { ObservationEditDiscardComponent } from './observation-edit/observation-edit-discard/observation-edit-discard.component'; -import { AttachmentComponent } from './attachment/attachment.component'; -import { AttachUploadComponent } from './attachment/attachment-upload/attachment-upload.component'; -import { FilenamePipe } from '../filename/filename.pipe'; - -@NgModule({ - declarations: [ - ObservationEditComponent, - ObservationEditAttachmentComponent, - ObservationEditFormComponent, - ObservationEditFormPickerComponent, - ObservationEditMultiselectComponent, - ObservationEditCheckboxComponent, - ObservationEditSelectComponent, - ObservationEditEmailComponent, - ObservationEditNumberComponent, - ObservationEditTextComponent, - ObservationEditTextareaComponent, - ObservationEditRadioComponent, - ObservationEditGeometryComponent, - ObservationEditGeometryMapComponent, - ObservationEditGeometryFormComponent, - ObservationEditDateComponent, - ObservationEditPasswordComponent, - ObservationEditDiscardComponent, - MapClipComponent, - AttachmentComponent, - AttachUploadComponent, - FilenamePipe - ], - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - DragDropModule, - MatAutocompleteModule, - MatBottomSheetModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatChipsModule, - MatDatepickerModule, - MatDialogModule, - MatDividerModule, - MatFormFieldModule, - MatGridListModule, - MatIconModule, - MatInputModule, - MatListModule, - MatProgressBarModule, - MatProgressSpinnerModule, - MatRadioModule, - MatSelectModule, - MatSliderModule, - MatSnackBarModule, - MatTooltipModule, - MatToolbarModule, - MatDatetimepickerModule, - MatMomentDatetimeModule, - NgxMatSelectSearchModule, - InputMaskModule, - GeometryModule, - MomentModule - ], - exports: [ - ObservationEditComponent, - ObservationEditAttachmentComponent, - ObservationEditFormComponent, - ObservationEditFormPickerComponent, - ObservationEditMultiselectComponent, - ObservationEditCheckboxComponent, - ObservationEditSelectComponent, - ObservationEditEmailComponent, - ObservationEditNumberComponent, - ObservationEditTextComponent, - ObservationEditTextareaComponent, - ObservationEditRadioComponent, - ObservationEditGeometryComponent, - ObservationEditGeometryMapComponent, - ObservationEditGeometryFormComponent, - ObservationEditDateComponent, - ObservationEditPasswordComponent, - ObservationEditDiscardComponent, - MapClipComponent, - AttachmentComponent, - AttachUploadComponent, - FilenamePipe - ] -}) -export class ObservationModule { } diff --git a/web-app/admin/src/app/shared/utils/password.utils.spec.ts b/web-app/admin/src/app/shared/utils/password.utils.spec.ts deleted file mode 100644 index 1ebee2574..000000000 --- a/web-app/admin/src/app/shared/utils/password.utils.spec.ts +++ /dev/null @@ -1,248 +0,0 @@ -import { FormControl } from '@angular/forms'; -import * as zxcvbnModule from '@zxcvbn-ts/core'; -import { - createPasswordPolicyValidator, - confirmPasswordValidator, - evaluatePasswordStrength, - getPasswordTooltip -} from './password.utils'; -import { passwordStrengthScores } from 'src/app/entities/entities.password'; - -describe('Password Utilities', () => { - const basePolicy = { - passwordMinLengthEnabled: true, - passwordMinLength: 8, - minCharsEnabled: false, - minChars: 0, - lowLettersEnabled: true, - lowLetters: 1, - highLettersEnabled: true, - highLetters: 1, - numbersEnabled: true, - numbers: 1, - specialCharsEnabled: true, - specialChars: 1, - maxConCharsEnabled: true, - maxConChars: 3, - restrictSpecialCharsEnabled: true, - restrictSpecialChars: '!@#', - helpTextTemplate: { - passwordMinLength: 'be at least # characters long', - minChars: 'contain at least # letters', - lowLetters: 'have at least # lowercase letter(s)', - highLetters: 'have at least # uppercase letter(s)', - numbers: 'contain at least # number(s)', - specialChars: 'contain at least # special character(s)', - maxConChars: 'have no more than # consecutive characters', - restrictSpecialChars: 'use only these special characters: #' - } - }; - - const makePolicy = (override: Partial = {}) => ({ - ...basePolicy, - ...override - }); - - describe('createPasswordPolicyValidator', () => { - it('returns null when password is empty', () => { - const control = new FormControl(''); - const validator = createPasswordPolicyValidator(makePolicy(), () => {}); - expect(validator(control as any)).toBeNull(); - }); - - it('flags password shorter than minimum length', () => { - const control = new FormControl('Short1!'); - const validator = createPasswordPolicyValidator(makePolicy({ maxConCharsEnabled: false }), () => {}); - expect(validator(control as any)).toEqual({ passwordMinLength: true }); - }); - - it('flags password missing lowercase characters', () => { - const control = new FormControl('PASSWORD123!'); - const validator = createPasswordPolicyValidator( - makePolicy({ maxConCharsEnabled: false }), - () => {} - ); - expect(validator(control as any)).toEqual({ lowLetters: true }); - }); - - it('flags password missing uppercase characters', () => { - const control = new FormControl('password123!'); - const validator = createPasswordPolicyValidator( - makePolicy({ maxConCharsEnabled: false }), - () => {} - ); - expect(validator(control as any)).toEqual({ highLetters: true }); - }); - - it('flags password missing numeric characters', () => { - const control = new FormControl('Password!x'); - const validator = createPasswordPolicyValidator( - makePolicy({ maxConCharsEnabled: false }), - () => {} - ); - expect(validator(control as any)).toEqual({ numbers: true }); - }); - - it('flags password missing special characters', () => { - const control = new FormControl('Password12x'); - const validator = createPasswordPolicyValidator( - makePolicy({ maxConCharsEnabled: false }), - () => {} - ); - expect(validator(control as any)).toEqual({ specialChars: true }); - }); - - it('flags password exceeding maximum consecutive letter limit', () => { - const control = new FormControl('AAAAA1x!'); - const validator = createPasswordPolicyValidator(makePolicy(), () => {}); - expect(validator(control as any)).toEqual({ maxConChars: true }); - }); - - it('flags password containing disallowed special characters', () => { - const control = new FormControl('Abcde1$fg!'); - const validator = createPasswordPolicyValidator( - makePolicy({ maxConCharsEnabled: false }), - () => {} - ); - expect(validator(control as any)).toEqual({ restrictSpecialChars: true }); - }); - - it('returns null when all enabled requirements are satisfied', () => { - const control = new FormControl('Abc1!xyz'); - const validator = createPasswordPolicyValidator( - makePolicy({ maxConCharsEnabled: false }), - () => {} - ); - expect(validator(control as any)).toBeNull(); - }); - - it('flags password below minimum letter count when enabled', () => { - const policy = makePolicy({ - minCharsEnabled: true, - minChars: 6, - maxConCharsEnabled: false - }); - const control = new FormControl('A1!abcx12'); - const validator = createPasswordPolicyValidator(policy, () => {}); - expect(validator(control as any)).toEqual({ minChars: true }); - }); - - it('aggregates multiple errors when multiple checks fail', () => { - const control = new FormControl('shortxx'); - const validator = createPasswordPolicyValidator( - makePolicy({ maxConCharsEnabled: false }), - () => {} - ); - expect(validator(control as any)).toEqual({ - passwordMinLength: true, - highLetters: true, - numbers: true, - specialChars: true - }); - }); - - it('provides human-readable error messages', () => { - const messages: string[] = []; - const control = new FormControl('pass'); - const validator = createPasswordPolicyValidator( - makePolicy({ maxConCharsEnabled: false }), - (errs) => { - messages.splice(0, messages.length, ...errs); - } - ); - validator(control as any); - expect( - messages.some((m) => m.toLowerCase().includes('characters long')) - ).toBeTrue(); - expect( - messages.some((m) => m.toLowerCase().includes('uppercase')) - ).toBeTrue(); - expect( - messages.some((m) => m.toLowerCase().includes('number')) - ).toBeTrue(); - expect( - messages.some((m) => m.toLowerCase().includes('special character')) - ).toBeTrue(); - }); - - it('returns null when optional fields are absent and remaining rules pass', () => { - const { minCharsEnabled, minChars, helpTextTemplate, ...rest } = - basePolicy as any; - const slimPolicy: any = { - ...rest, - helpTextTemplate: { ...basePolicy.helpTextTemplate }, - maxConCharsEnabled: false - }; - const control = new FormControl('Abc1!xyz'); - const validator = createPasswordPolicyValidator(slimPolicy, () => {}); - expect(validator(control as any)).toBeNull(); - }); - }); - - describe('confirmPasswordValidator', () => { - it('returns an error when values do not match', () => { - const getPassword = () => 'ValidPassword123!'; - const control = new FormControl('DifferentPassword123!'); - const validator = confirmPasswordValidator(getPassword); - expect(validator(control as any)).toEqual({ match: true }); - }); - - it('returns null when values match', () => { - const getPassword = () => 'ValidPassword123!'; - const control = new FormControl('ValidPassword123!'); - const validator = confirmPasswordValidator(getPassword); - expect(validator(control as any)).toBeNull(); - }); - }); - - describe('evaluatePasswordStrength', () => { - it('returns the lowest score for an empty password', () => { - const result = evaluatePasswordStrength(''); - expect(result).toEqual(passwordStrengthScores[0]); - }); - - it('maps zxcvbn score to the corresponding strength', () => { - const pwd = 'Str0ng!P@ssw0rd'; - const expected = - passwordStrengthScores[zxcvbnModule.zxcvbn(pwd, []).score]; - const result = evaluatePasswordStrength(pwd); - expect(result).toEqual(expected); - }); - - it('includes username in the zxcvbn evaluation', () => { - const pwd = 'something'; - const user = 'user1'; - const expected = - passwordStrengthScores[zxcvbnModule.zxcvbn(pwd, [user]).score]; - const result = evaluatePasswordStrength(pwd, user); - expect(result).toEqual(expected); - }); - }); - - describe('getPasswordTooltip', () => { - it('includes all enabled policy lines', () => { - const tooltip = getPasswordTooltip(makePolicy()); - expect(tooltip).toContain('• At least 8 characters'); - expect(tooltip).toContain('• Minimum 1 lowercase letter(s)'); - expect(tooltip).toContain('• Minimum 1 uppercase letter(s)'); - expect(tooltip).toContain('• Minimum 1 number(s)'); - expect(tooltip).toContain('• Minimum 1 special character(s)'); - expect(tooltip).toContain('• Max 3 repeated characters'); - expect(tooltip).toContain('• Allowed: !@#'); - }); - - it('excludes disabled rules', () => { - const tooltip = getPasswordTooltip( - makePolicy({ minCharsEnabled: false }) - ); - expect(tooltip).not.toContain('letters'); - }); - - it('includes minimum letters requirement when enabled', () => { - const tooltip = getPasswordTooltip( - makePolicy({ minCharsEnabled: true, minChars: 5 }) - ); - expect(tooltip).toContain('• At least 5 letters'); - }); - }); -}); diff --git a/web-app/admin/src/app/shared/utils/password.utils.ts b/web-app/admin/src/app/shared/utils/password.utils.ts deleted file mode 100644 index df5a50311..000000000 --- a/web-app/admin/src/app/shared/utils/password.utils.ts +++ /dev/null @@ -1,164 +0,0 @@ -import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms'; -import { PasswordPolicy } from 'src/app/ingress/authentication/@types/signup'; -import { zxcvbn } from '@zxcvbn-ts/core'; -import { - PasswordStrength, - passwordStrengthScores -} from 'src/app/entities/entities.password'; - -/** - * Creates a password policy validator based on the provided policy. - * Validates password according to the rules defined in the policy and updates error messages. - * - * @param {PasswordPolicy} policy - The password policy that defines the validation rules. - * @param {Function} updateErrors - A callback function to update the list of error messages. - * @param {string} [username] - An optional username to check against (used by zxcvbn for password strength evaluation). - * @returns {ValidatorFn} A validator function for validating the password control. - */ -export function createPasswordPolicyValidator( - policy: PasswordPolicy, - updateErrors: (errors: string[]) => void, - username?: string -): ValidatorFn { - return (control: AbstractControl): ValidationErrors | null => { - const password = control.value; - if (!password) return null; - - const templates = policy.helpTextTemplate; - const currentErrors: string[] = []; - const errors: ValidationErrors = {}; - - const rules = [ - { - enabled: policy.passwordMinLengthEnabled, - valid: password.length >= policy.passwordMinLength, - key: 'passwordMinLength', - template: templates.passwordMinLength, - value: policy.passwordMinLength - }, - { - enabled: policy.lowLettersEnabled, - valid: (password.match(/[a-z]/g) || []).length >= policy.lowLetters, - key: 'lowLetters', - template: templates.lowLetters, - value: policy.lowLetters - }, - { - enabled: policy.minCharsEnabled, - valid: (password.match(/[a-z]/gi) || []).length >= policy.minChars, - key: 'minChars', - template: templates.minChars, - value: policy.minChars - }, - { - enabled: policy.highLettersEnabled, - valid: (password.match(/[A-Z]/g) || []).length >= policy.highLetters, - key: 'highLetters', - template: templates.highLetters, - value: policy.highLetters - }, - { - enabled: policy.numbersEnabled, - valid: (password.match(/[0-9]/g) || []).length >= policy.numbers, - key: 'numbers', - template: templates.numbers, - value: policy.numbers - }, - { - enabled: policy.specialCharsEnabled, - valid: (password.match(/[^a-zA-Z0-9]/g) || []).length >= policy.specialChars, - key: 'specialChars', - template: templates.specialChars, - value: policy.specialChars - } - ]; - - for (const rule of rules) { - if (rule.enabled && !rule.valid) { - errors[rule.key] = true; - currentErrors.push(`Must ${rule.template?.replace('#', rule.value.toString())}`); - } - } - - if (policy.maxConCharsEnabled) { - const regex = new RegExp(`[a-zA-Z]{${policy.maxConChars + 1},}`); - if (regex.test(password)) { - errors.maxConChars = true; - currentErrors.push(`Must ${templates.maxConChars?.replace('#', policy.maxConChars.toString())}`); - } - } - - if (policy.restrictSpecialCharsEnabled) { - const allowed = policy.restrictSpecialChars.split(''); - const specials = password.match(/[^a-zA-Z0-9]/g) || []; - if (specials.some((char) => !allowed.includes(char))) { - errors.restrictSpecialChars = true; - currentErrors.push(`Must ${templates.restrictSpecialChars?.replace('#', policy.restrictSpecialChars)}`); - } - } - - updateErrors(currentErrors); - return Object.keys(errors).length ? errors : null; - }; -} - -/** - * Validates if the confirmed password matches the original password. - * - * @param {Function} getPassword - A function to retrieve the original password value. - * @returns {ValidatorFn} A validator function to confirm the password match. - */ -export function confirmPasswordValidator(getPassword: () => string): ValidatorFn { - return (control: AbstractControl): ValidationErrors | null => { - return control.value !== getPassword() ? { match: true } : null; - }; -} - -/** - * Evaluates the strength of the provided password using the zxcvbn library. - * - * @param {string} password - The password to evaluate. - * @param {string} [username] - An optional username to be considered during evaluation. - * @returns {PasswordStrength} The evaluated password strength. - */ -export function evaluatePasswordStrength(password: string, username?: string): PasswordStrength { - const score = password ? zxcvbn(password, username ? [username] : []).score : 0; - return passwordStrengthScores[score]; -} - -/** - * Generates a tooltip string based on the password policy, outlining the required password strength rules. - * - * @param {PasswordPolicy} policy - The password policy to base the tooltip on. - * @returns {string} The generated tooltip text. - */ -export function getPasswordTooltip(policy: PasswordPolicy): string { - const rules: string[] = []; - - if (policy.passwordMinLengthEnabled) { - rules.push(`• At least ${policy.passwordMinLength} characters`); - } - if (policy.minCharsEnabled) { - rules.push(`• At least ${policy.minChars} letters`); - } - if (policy.lowLettersEnabled) { - rules.push(`• Minimum ${policy.lowLetters} lowercase letter(s)`); - } - if (policy.highLettersEnabled) { - rules.push(`• Minimum ${policy.highLetters} uppercase letter(s)`); - } - if (policy.numbersEnabled) { - rules.push(`• Minimum ${policy.numbers} number(s)`); - } - if (policy.specialCharsEnabled) { - rules.push(`• Minimum ${policy.specialChars} special character(s)`); - } - if (policy.maxConCharsEnabled) { - rules.push(`• Max ${policy.maxConChars} repeated characters`); - } - if (policy.restrictSpecialCharsEnabled) { - rules.push(`• Allowed: ${policy.restrictSpecialChars}`); - } - - return rules.join('\n'); -} diff --git a/web-app/admin/src/app/upgrade/ajs-upgraded-providers.ts b/web-app/admin/src/app/upgrade/ajs-upgraded-providers.ts index e65480ed1..5566439b8 100644 --- a/web-app/admin/src/app/upgrade/ajs-upgraded-providers.ts +++ b/web-app/admin/src/app/upgrade/ajs-upgraded-providers.ts @@ -12,10 +12,6 @@ export const Team = new InjectionToken('Team'); export const Event = new InjectionToken('Event'); export const AuthenticationConfigurationService = new InjectionToken('AuthenticationConfigurationService'); export const UserPagingService = new InjectionToken('UserPagingService'); -export const DeviceService = new InjectionToken('DeviceService'); -export const DevicePagingService = new InjectionToken('DevicePagingService'); -export const LoginService = new InjectionToken('LoginService'); -export const LayerService = new InjectionToken('LayerService'); export function mapServiceFactory(i: any): any { @@ -160,39 +156,3 @@ export const userPagingServiceProvider = { useFactory: userPagingServiceFactory, deps: ['$injector'] }; - -export function deviceServiceFactory(i: any): any { - return i.get('DeviceService'); -} -export const deviceServiceProvider = { - provide: DeviceService, - useFactory: deviceServiceFactory, - deps: ['$injector'] -}; - -export function devicePagingServiceFactory(i: any): any { - return i.get('DevicePagingService'); -} -export const devicePagingServiceProvider = { - provide: DevicePagingService, - useFactory: devicePagingServiceFactory, - deps: ['$injector'] -}; - -export function loginServiceFactory(i: any): any { - return i.get('LoginService'); -} -export const loginServiceProvider = { - provide: LoginService, - useFactory: loginServiceFactory, - deps: ['$injector'] -}; - -export function layerServiceFactory(i: any): any { - return i.get('LayerService'); -} -export const layerServiceProvider = { - provide: LayerService, - useFactory: layerServiceFactory, - deps: ['$injector'] -}; \ No newline at end of file diff --git a/web-app/admin/src/ng1/admin/admin.component.js b/web-app/admin/src/ng1/admin/admin.component.js index 1ef91f718..24ba9a671 100644 --- a/web-app/admin/src/ng1/admin/admin.component.js +++ b/web-app/admin/src/ng1/admin/admin.component.js @@ -9,12 +9,8 @@ class AdminController { this.$transitions = $transitions; this.pluginService = pluginService; this.UserPagingService = UserPagingService; - this.DevicePagingService = DevicePagingService;this.pluginActive = false; + this.DevicePagingService = DevicePagingService; - this.pluginActiveChanged = function (event) { - this.pluginActive = !!event; - }; - this.userState = 'inactive'; this.inactiveUsers = []; const defaultUserQueries = this.UserPagingService.constructDefault(); diff --git a/web-app/admin/src/ng1/admin/admin.dashboard.component.js b/web-app/admin/src/ng1/admin/admin.dashboard.component.js new file mode 100644 index 000000000..bbe8cc24a --- /dev/null +++ b/web-app/admin/src/ng1/admin/admin.dashboard.component.js @@ -0,0 +1,294 @@ +"use strict"; + +import _ from 'underscore'; +import moment from 'moment'; + +class AdminDashboardController { + constructor($state, $filter, UserService, DeviceService, DevicePagingService, LoginService, Event, Layer, UserPagingService) { + this.$state = $state; + this._$filter = $filter; + this._UserService = UserService; + this._DeviceService = DeviceService; + this._LoginService = LoginService; + this._Event = Event; + this._Layer = Layer; + this.UserPagingService = UserPagingService; + this.DevicePagingService = DevicePagingService; + + this.userSearch = ''; + this.userState = 'inactive'; + this.inactiveUsers = []; + this.stateAndData = this.UserPagingService.constructDefault(); + this.loginSearchResults = []; + + this.deviceStateAndData = this.DevicePagingService.constructDefault(); + this.deviceState = 'unregistered'; + this.deviceSearch = ''; + this.unregisteredDevices = []; + this.loginDeviceSearchResults = []; + } + + $onInit() { + this.filter = {}; + this.user = null; + this.device = null; + this.login = { + startDateOpened: false, + endDateOpened: false + }; + + this.firstLogin = null; + this.showPrevious = false; + this.showNext = true; + + this.DevicePagingService.refresh(this.deviceStateAndData).then(() => { + this.unregisteredDevices = this.DevicePagingService.devices(this.deviceStateAndData[this.deviceState]); + }); + + this._Event.count(data => { + this.eventCount = data.count; + }); + + this._Layer.count(data => { + this.layerCount = data.count; + }); + + this._LoginService.query({ limit: this.loginResultsLimit }).then(loginPage => { + this.loginPage = loginPage; + if (loginPage.logins.length) { + this.firstLogin = loginPage.logins[0]; + } + }); + + this.UserPagingService.refresh(this.stateAndData).then(() => { + this.inactiveUsers = this.UserPagingService.users(this.stateAndData[this.userState]); + }); + } + + count() { + return this.UserPagingService.count(this.stateAndData[this.userState]); + } + + hasNext() { + return this.UserPagingService.hasNext(this.stateAndData[this.userState]); + } + + next() { + this.UserPagingService.next(this.stateAndData[this.userState]).then(users => { + this.inactiveUsers = users; + }); + } + + hasPrevious() { + return this.UserPagingService.hasPrevious(this.stateAndData[this.userState]); + } + + previous() { + this.UserPagingService.previous(this.stateAndData[this.userState]).then(users => { + this.inactiveUsers = users; + }); + } + + deviceCount() { + return this.DevicePagingService.count(this.deviceStateAndData[this.deviceState]); + } + + hasNextDevice() { + return this.DevicePagingService.hasNext(this.deviceStateAndData[this.deviceState]); + } + + nextDevice() { + this.DevicePagingService.next(this.deviceStateAndData[this.deviceState]).then(devices => { + this.unregisteredDevices = devices; + }); + } + + hasPreviousDevice() { + return this.DevicePagingService.hasPrevious(this.deviceStateAndData[this.deviceState]); + } + + previousDevice() { + this.DevicePagingService.previous(this.deviceStateAndData[this.deviceState]).then(devices => { + this.unregisteredDevices = devices; + }); + } + + search() { + this.UserPagingService.search(this.stateAndData[this.userState], this.userSearch).then(users => { + this.inactiveUsers = users; + }); + } + + searchDevices() { + this.DevicePagingService.search(this.deviceStateAndData[this.deviceState], this.deviceSearch).then(devices => { + if (devices.length > 0) { + this.unregisteredDevices = devices; + } else { + this.DevicePagingService.search(this.deviceStateAndData[this.deviceState], this.deviceSearch, this.deviceSearch).then(devices => { + this.unregisteredDevices = devices; + }); + } + }); + } + + searchLoginsAgainstUsers(searchString) { + if (searchString == null) { + searchString = '.*'; + } + + return this.UserPagingService.search(this.stateAndData['all'], searchString).then(users => { + this.loginSearchResults = users; + + if (this.loginSearchResults.length == 0) { + const noUser = { + displayName: "No Results Found" + } + this.loginSearchResults.push(noUser); + } + + return this.loginSearchResults; + }); + } + + searchLoginsAgainstDevices(searchString) { + if (searchString == null) { + searchString = '.*'; + } + + return this.DevicePagingService.search(this.deviceStateAndData['all'], searchString).then(devices => { + this.loginDeviceSearchResults = devices; + + if (this.loginDeviceSearchResults.length == 0) { + const noDevice = { + userAgent: "No Results Found" + } + this.loginDeviceSearchResults.push(noDevice); + } + + return this.loginDeviceSearchResults; + }); + } + + iconClass(device) { + if (!device) return; + + if (device.iconClass) return device.iconClass; + + var userAgent = device.userAgent || ""; + + if (device.appVersion === 'Web Client') { + device.iconClass = 'fa-desktop admin-desktop-icon-xs'; + } else if (userAgent.toLowerCase().indexOf("android") !== -1) { + device.iconClass = 'fa-android admin-android-icon-xs'; + } else if (userAgent.toLowerCase().indexOf("ios") !== -1) { + device.iconClass = 'fa-apple admin-apple-icon-xs'; + } else { + device.iconClass = 'fa-mobile admin-generic-icon-xs'; + } + + return device.iconClass; + } + + gotoUser(user) { + this.$state.go('admin.user', { userId: user.id }); + } + + gotoDevice(device) { + this.$state.go('admin.device', { deviceId: device.id }); + } + + hasPermission(permission) { + return _.contains(this._UserService.myself.role.permissions, permission); + } + + activateUser($event, user) { + $event.stopPropagation(); + + user.active = true; + + this._UserService.updateUser(user.id, user, () => { + this.UserPagingService.refresh(this.stateAndData).then(() => { + this.inactiveUsers = this.UserPagingService.users(this.stateAndData[this.userState]); + }); + this.onUserActivated({ + $event: { + user: user + } + }); + }); + } + + registerDevice($event, device) { + $event.stopPropagation(); + + device.registered = true; + this._DeviceService.updateDevice(device).then(device => { + this.DevicePagingService.refresh(this.deviceStateAndData).then(() => { + this.unregisteredDevices = this.DevicePagingService.devices(this.deviceStateAndData[this.deviceState]); + }); + this.onDeviceEnabled({ + $event: { + user: device + } + }); + }); + } + + pageLogin(url) { + this._LoginService.query({ url: url, filter: this.filter, limit: this.loginResultsLimit }).then(loginPage => { + + if (loginPage.logins.length) { + this.loginPage = loginPage; + this.showNext = loginPage.logins.length !== 0; + this.showPrevious = loginPage.logins[0].id !== this.firstLogin.id; + } + }); + } + + filterLogins() { + this.filter.user = this.user; + this.filter.device = this.device; + this.filter.startDate = this.login.startDate; + if (this.login.endDate) { + this.filter.endDate = moment(this.login.endDate).endOf('day').toDate(); + } + this._LoginService.query({ filter: this.filter, limit: this.loginResultsLimit }).then(loginPage => { + this.showNext = loginPage.logins.length !== 0; + this.showPrevious = false; + this.loginPage = loginPage; + }); + } + + openLoginStart($event) { + $event.preventDefault(); + $event.stopPropagation(); + + this.login.startDateOpened = true; + } + + openLoginEnd($event) { + $event.preventDefault(); + $event.stopPropagation(); + + this.login.endDateOpened = true; + } + + dateFilterChanged() { + this.filterLogins(); + } + + loginResultsLimitChanged() { + this.filterLogins(); + } +} + +AdminDashboardController.$inject = ['$state', '$filter', 'UserService', 'DeviceService', 'DevicePagingService', 'LoginService', 'Event', 'Layer', 'UserPagingService']; + +export default { + template: require('./admin.dashboard.html'), + bindings: { + onUserActivated: '&', + onDeviceEnabled: '&' + }, + controller: AdminDashboardController, +}; diff --git a/web-app/admin/src/ng1/admin/admin.dashboard.html b/web-app/admin/src/ng1/admin/admin.dashboard.html new file mode 100644 index 000000000..9d5613402 --- /dev/null +++ b/web-app/admin/src/ng1/admin/admin.dashboard.html @@ -0,0 +1,248 @@ +
+
+ +
+
+ +
+
+ +

MAGE Access

+
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+ +
+ + {{user.displayName}} + + + Activate + +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+ +
+ + {{d.user.displayName}} + ({{d.uid}}) + + + Register + +
+
+
+
+
+
+
+
+
+
+
+
+ +
+ +
+
+ +
+
+
+
+
+
+ +
+
+
+ +
+ {{login.timestamp | moment:'fromNow'}} + ({{login.timestamp | moment:'MMM D YYYY hh:mm:ss A'}}) +
+
+
+
+
+
+
+
+ +
+
+
+
\ No newline at end of file diff --git a/web-app/admin/src/ng1/admin/admin.html b/web-app/admin/src/ng1/admin/admin.html index c6176740c..54f4015a9 100644 --- a/web-app/admin/src/ng1/admin/admin.html +++ b/web-app/admin/src/ng1/admin/admin.html @@ -1,24 +1,11 @@ - - - -
- -
+
+ on-user-activated="$ctrl.userActivated($event)" + on-device-registered="$ctrl.deviceRegistered($event)" + on-device-unregistered="$ctrl.deviceUnregistered($event)">
diff --git a/web-app/admin/src/ng1/admin/devices/device.edit.html b/web-app/admin/src/ng1/admin/devices/device.edit.html index d0b693d2c..86a84cb30 100644 --- a/web-app/admin/src/ng1/admin/devices/device.edit.html +++ b/web-app/admin/src/ng1/admin/devices/device.edit.html @@ -1,104 +1,62 @@ -
- -
- Devices -
-
- / -
- -
- / -
-
- {{ $ctrl.device.id ? 'Edit' : 'New' }} +
+
+ +
-

- Edit device -

+

Edit device

New device

-
+
+
+
- - MAC address, or some sort of unique identifier for your - device. + + MAC address, or some sort of unique identifier for your device.
- +
- - + typeahead-loading="$ctrl.pocs" typeahead-no-results="noSearchResults" class="form-control" + typeahead-min-length="0" ng-model-options="{ debounce: 1000 }"> +
No Results Found
- Cancel - Save + Cancel + Save
-
+
\ No newline at end of file diff --git a/web-app/admin/src/ng1/admin/devices/device.html b/web-app/admin/src/ng1/admin/devices/device.html index f732bfcc3..f95e61f25 100644 --- a/web-app/admin/src/ng1/admin/devices/device.html +++ b/web-app/admin/src/ng1/admin/devices/device.html @@ -1,13 +1,9 @@ -
- -
- Devices -
-
- / -
-
- {{$ctrl.device.id}} +
+
+
diff --git a/web-app/admin/src/ng1/admin/devices/devices.html b/web-app/admin/src/ng1/admin/devices/devices.html index fcf17af36..d8301408d 100644 --- a/web-app/admin/src/ng1/admin/devices/devices.html +++ b/web-app/admin/src/ng1/admin/devices/devices.html @@ -1,7 +1,8 @@ -
- -
- Devices +
+
+
diff --git a/web-app/admin/src/ng1/admin/events/event.access.component.js b/web-app/admin/src/ng1/admin/events/event.access.component.js new file mode 100644 index 000000000..a31ce415c --- /dev/null +++ b/web-app/admin/src/ng1/admin/events/event.access.component.js @@ -0,0 +1,205 @@ +"use strict"; + +import _ from 'underscore'; + +class AdminEventAccessController { + constructor($state, $stateParams, $q, $filter, Event, EventAccess, UserService, UserPagingService) { + this.$state = $state; + this.$stateParams = $stateParams; + this.$q = $q; + this.$filter = $filter; + this.Event = Event; + this.EventAccess = EventAccess; + this.UserService = UserService; + this.UserPagingService = UserPagingService; + + this.eventMembers = []; + + //This is the list of users returned from a search + this.nonMemberSearchResults = []; + this.isSearching = false; + this.userState = 'all'; + this.nonAclUserState = this.userState + '.nonacl'; + this.memberSearch = ''; + this.stateAndData = this.UserPagingService.constructDefault(); + + this.roles = [{ + name: 'GUEST', + title: 'Guest', + description: 'Read only access to this event.' + }, { + name: 'MANAGER', + title: 'Manager', + description: 'Read and Update access to this event.' + }, { + name: 'OWNER', + title: 'Owner', + description: 'Read, Update and Delete access to this event.' + }]; + + this.nonMember = { + role: this.roles[0] + }; + + // For some reason angular is not calling into filter function with correct context + this.filterMembers = this._filterMembers.bind(this); + } + + $onInit() { + this.$q.all({ event: this.Event.get({ id: this.$stateParams.eventId, populate: false }).$promise }).then(result => { + + let clone = JSON.parse(JSON.stringify(this.stateAndData[this.userState])); + this.stateAndData[this.nonAclUserState] = clone; + delete this.stateAndData['active']; + delete this.stateAndData['inactive']; + delete this.stateAndData['disabled']; + + let aclIds = Object.keys(result.event.acl); + let allIds = aclIds.concat(result.event.userIds); + + this.stateAndData[this.userState].userFilter.in = { _id: Object.keys(result.event.acl) }; + this.stateAndData[this.userState].countFilter.in = { _id: Object.keys(result.event.acl) }; + this.stateAndData[this.nonAclUserState].userFilter.nin = { _id: allIds }; + this.stateAndData[this.nonAclUserState].countFilter.nin = { _id: allIds }; + this.UserPagingService.refresh(this.stateAndData).then(() => { + this.refreshMembers(result.event); + }); + }); + } + + _filterMembers(member) { + let filteredMembers = this.$filter('filter')([member], this.memberSearch); + return filteredMembers && filteredMembers.length; + } + + refreshMembers(event) { + this.event = event; + + let usersById = _.indexBy(this.UserPagingService.users(this.stateAndData[this.userState]), 'id'); + + this.eventMembers = _.map(this.event.acl, (access, userId) => { + let member = _.pick(usersById[userId], 'displayName', 'avatarUrl', 'lastUpdated'); + member.id = userId; + member.role = { + selected: _.find(this.roles, role => { return role.name === access.role; }) + }; + + return member; + }); + + this.owners = this.getOwners(); + } + + getOwners() { + return _.filter(this.eventMembers, member => { + return member.role.selected.name === 'OWNER'; + }); + } + + count() { + return this.UserPagingService.count(this.stateAndData[this.userState]); + } + + hasNext() { + return this.UserPagingService.hasNext(this.stateAndData[this.userState]); + } + + next() { + this.UserPagingService.next(this.stateAndData[this.userState]).then(() => { + this.refreshMembers(this.event); + }); + } + + hasPrevious() { + return this.UserPagingService.hasPrevious(this.stateAndData[this.userState]); + } + + previous() { + this.UserPagingService.previous(this.stateAndData[this.userState]).then(() => { + this.refreshMembers(this.event); + }); + } + + search() { + this.UserPagingService.search(this.stateAndData[this.userState], this.memberSearch).then(() => { + this.refreshMembers(this.event); + }); + } + + searchNonMembers(searchString) { + this.isSearching = true; + + if (searchString == null) { + searchString = '.*'; + } + + return this.UserPagingService.search(this.stateAndData[this.nonAclUserState], searchString).then(users => { + this.nonMemberSearchResults = users; + + if (this.nonMemberSearchResults.length == 0) { + let noMember = { + displayName: "No Results Found" + }; + this.nonMemberSearchResults.push(noMember); + } + + this.isSearching = false; + return this.nonMemberSearchResults; + }); + } + + addMember() { + this.EventAccess.update({ + eventId: this.event.id, + userId: this.nonMember.selected.id, + role: this.nonMember.role.name + }, event => { + delete this.nonMember.selected; + + this.stateAndData[this.userState].userFilter.in = { _id: Object.keys(event.acl) }; + this.stateAndData[this.userState].countFilter.in = { _id: Object.keys(event.acl) }; + + this.UserPagingService.refresh(this.stateAndData).then(() => { + this.refreshMembers(event); + }); + }); + } + + removeMember(member) { + this.EventAccess.delete({ + eventId: this.event.id, + userId: member.id + }, event => { + this.stateAndData[this.userState].userFilter.in = { _id: Object.keys(event.acl) }; + this.stateAndData[this.userState].countFilter.in = { _id: Object.keys(event.acl) }; + + this.UserPagingService.refresh(this.stateAndData).then(() => { + this.refreshMembers(event); + }); + }); + } + + updateRole(member, role) { + this.EventAccess.update({ + eventId: this.event.id, + userId: member.id, + role: role.name + }, event => { + this.UserPagingService.refresh(this.stateAndData).then(() => { + this.refreshMembers(event); + }); + }); + } + + gotoUser(member) { + this.$state.go('admin.user', { userId: member.id }); + } + +} + +AdminEventAccessController.$inject = ['$state', '$stateParams', '$q', '$filter', 'Event', 'EventAccess', 'UserService', 'UserPagingService']; + +export default { + template: require('./event.access.html'), + controller: AdminEventAccessController +}; \ No newline at end of file diff --git a/web-app/admin/src/ng1/admin/events/event.access.html b/web-app/admin/src/ng1/admin/events/event.access.html new file mode 100644 index 000000000..3a0629a71 --- /dev/null +++ b/web-app/admin/src/ng1/admin/events/event.access.html @@ -0,0 +1,117 @@ +
+
+ +
+
+ +
+
+
+ +

{{$ctrl.event.name}} Access

+ +
+ +

Add a new member to {{$ctrl.event.name}}

+ +
+
+ +
+ +
+ + {{$select.selected.title}} + +
+ +
+
+
+ +
+ +
+
+ +
+
+ +
+ +
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+ {{member.displayName}} + {{member.email}} +
+
+ +
+
+
+ Owner +
+
+ +
+
+ + {{$select.selected.title}} + + +
+ +
+
+
+ +
+ +
+
+
+ +
+
+
+
+
+
\ No newline at end of file diff --git a/web-app/admin/src/ng1/admin/events/event.component.js b/web-app/admin/src/ng1/admin/events/event.component.js new file mode 100644 index 000000000..32109a4ca --- /dev/null +++ b/web-app/admin/src/ng1/admin/events/event.component.js @@ -0,0 +1,559 @@ +"use strict"; + +import _ from 'underscore'; + +class AdminEventController { + constructor($state, $stateParams, $filter, $q, $uibModal, LocalStorageService, UserService, Event, Team, Layer) { + this.$state = $state; + this.$stateParams = $stateParams; + this.$filter = $filter; + this.$q = $q; + this.$uibModal = $uibModal; + this.UserService = UserService; + this.Event = Event; + this.Team = Team; + this.Layer = Layer; + + this.token = LocalStorageService.getToken(); + + this.showArchivedForms = false; + + this.loadingMembers = false; + this.membersPageIndex = 0; + this.membersPageSize = 5; + this.membersPage = { + items: [], + totalCount: 0, + } + + this.loadingNonMembers = false; + this.nonMembersPageIndex = 0; + this.nonMembersPageSize = 5; + this.nonMembersPage = { + items: [], + totalCount: 0, + } + + this.loadingTeams = false; + this.teamsPageIndex = 0; + this.teamsPageSize = 2; + this.teamsPage = { + items: [], + totalCount: 0, + } + + this.loadingNonTeams = false; + this.nonTeamsPageIndex = 0; + this.nonTeamsPageSize = 5; + this.nonTeamsPage = { + items: [], + totalCount: 0, + } + + this.eventMembers = []; + this.teamsInEvent = []; + + this.editLayers = false; + + this.eventLayers = []; + this.layersPage = 0; + this.layersPerPage = 5; + this.layerSearch = null; + + this.nonLayers = []; + this.nonLayersPage = 0; + this.nonLayersPerPage = 2; + this.nonLayerSearch = null; + + this.layers = []; + + this.eventTeam; + + // For some reason angular is not calling into filter function with correct context + this.filterLayers = this.filterLayers.bind(this); + this.filterNonLayers = this.filterNonLayers.bind(this); + } + + $onInit() { + this.$q.all({ + teams: this.Team.query({ populate: false }).$promise, + layers: this.Layer.query().$promise, + event: this.Event.get({ id: this.$stateParams.eventId, populate: false }).$promise + }) + .then(result => { + const teamsById = _.indexBy(result.teams, 'id'); + + this.layers = result.layers; + const layersById = _.indexBy(result.layers, 'id'); + + this.event = result.event; + + const eventTeamId = _.find(this.event.teamIds, teamId => { + if (teamsById[teamId]) { + return teamsById[teamId].teamEventId === this.event.id; + } + }); + this.eventTeam = teamsById[eventTeamId]; + + this.getMembersPage(); + this.getNonMembersPage(); + this.getTeamsPage(); + this.getNonTeamsPage(); + + const teamIdsInEvent = _.filter(this.event.teamIds, teamId => { + if (teamsById[teamId]) { + return teamsById[teamId].teamEventId !== this.event.id; + } + }); + this.teamsInEvent = _.map(teamIdsInEvent, teamId => { return teamsById[teamId]; }); + + this.teamsNotInEvent = _.filter(result.teams, team => { + return this.event.teamIds.indexOf(team.id) === -1 && !team.teamEventId; + }); + + this.layer = {}; + this.eventLayers = _.chain(this.event.layerIds) + .filter(layerId => { + return layersById[layerId]; + }) + .map(layerId => { + return layersById[layerId]; + }).value(); + + this.nonLayers = _.filter(this.layers, layer => { + return this.event.layerIds.indexOf(layer.id) === -1; + }); + + const myAccess = this.event.acl[this.UserService.myself.id]; + const aclPermissions = myAccess ? myAccess.permissions : []; + + this.hasReadPermission = _.contains(this.UserService.myself.role.permissions, 'READ_EVENT_ALL') || _.contains(aclPermissions, 'read'); + this.hasUpdatePermission = _.contains(this.UserService.myself.role.permissions, 'UPDATE_EVENT') || _.contains(aclPermissions, 'update'); + this.hasDeletePermission = _.contains(this.UserService.myself.role.permissions, 'DELETE_EVENT') || _.contains(aclPermissions, 'delete'); + }); + } + + getMembersPage() { + this.loadingMembers = true; + this.Event.getMembers({ + id: this.$stateParams.eventId, + page: this.membersPageIndex, + page_size: this.membersPageSize, + total: true, + term: this.memberSearchTerm + }, page => { + this.loadingMembers = false; + this.membersPage = page; + }); + } + + getNonMembersPage() { + this.loadingNonMembers = true; + this.Event.getNonMembers({ + id: this.$stateParams.eventId, + page: this.nonMembersPageIndex, + page_size: this.nonMembersPageSize, + total: true, + term: this.nonMemberSearchTerm + }, page => { + this.loadingNonMembers = false; + this.nonMembersPage = page; + }); + } + + addMember($event, user) { + $event.stopPropagation(); + + this.nonMember = null; + this.eventTeam.userIds.push(user.id); + this.eventTeam.$save(() => { + this.getMembersPage(); + this.getNonMembersPage(); + }); + } + + removeMember($event, user) { + $event.stopPropagation(); + + this.eventTeam.userIds = _.reject(this.eventTeam.userIds, u => { return user.id === u; }); + this.eventTeam.$save(() => { + this.getMembersPage(); + this.getNonMembersPage(); + }); + } + + hasNextMember() { + return (this.membersPageIndex + 1) * this.membersPageSize < this.membersPage.totalCount; + } + + hasPreviousMember() { + return this.membersPageIndex > 0 && this.membersPage.totalCount > 0; + } + + nextMemberPage() { + if (this.hasNextMember()) { + this.membersPageIndex++; + this.getMembersPage(); + } + } + + previousMemberPage() { + if (this.hasPreviousMember()) { + this.membersPageIndex--; + this.getMembersPage(); + } + } + + searchMembers() { + this.membersPageIndex = 0; + this.getMembersPage() + } + + hasNextNonMember() { + return (this.nonMembersPageIndex + 1) * this.nonMembersPageSize < this.nonMembersPage.totalCount + } + + hasPreviousNonMember() { + return this.nonMembersPageIndex > 0 && this.nonMembersPage.totalCount > 0; + } + + nextNonMemberPage() { + if (this.hasNextNonMember()) { + this.nonMembersPageIndex++; + this.getNonMembersPage(); + } + } + + previousNonMemberPage() { + if (this.hasPreviousNonMember()) { + this.nonMembersPageIndex--; + this.getNonMembersPage(); + } + } + + searchNonMembers() { + this.nonMembersPageIndex = 0; + this.getNonMembersPage(); + } + + getTeamsPage() { + this.loadingTeams = true; + this.Event.getTeams({ + id: this.$stateParams.eventId, + omit_event_teams: true, + page: this.teamsPageIndex, + page_size: this.teamsPageSize, + total: true, + term: this.teamSearchTerm + }, page => { + this.loadingTeams = false; + this.teamsPage = page; + }); + } + + getNonTeamsPage() { + this.loadingNonTeams = true; + this.Event.getNonTeams({ + id: this.$stateParams.eventId, + omit_event_teams: true, + page: this.nonTeamsPageIndex, + page_size: this.nonTeamsPageSize, + total: true, + term: this.nonTeamSearchTerm + }, page => { + this.loadingNonTeams = false; + this.nonTeamsPage = page; + }); + } + + filterLayers(layer) { + let filteredLayers = this.eventLayers; + if (this.layerSearch) { + filteredLayers = this.$filter('filter')([layer], this.layerSearch); + } + + return filteredLayers && filteredLayers.length; + } + + filterNonLayers(layer) { + let filteredNonLayers = this.nonLayers; + if (this.nonLayerSearch) { + filteredNonLayers = this.$filter('filter')([layer], this.nonLayerSearch); + } + + return filteredNonLayers && filteredNonLayers.length; + } + + normalize(item) { + return { + id: item.id, + description: item.email || item.description, + name: item.name || item.displayName, + type: item.name ? 'team' : 'user' + }; + } + + addTeam($event, team) { + $event.stopPropagation(); + + this.nonMember = null; + this.event.teamIds.push(team.id); + this.teamsInEvent.push(team); + this.teamsNotInEvent = _.reject(this.teamsNotInEvent, oldTeam => { return oldTeam.id === team.id; }); + + this.Event.addTeam({ id: this.event.id }, team).$promise.then(() => { + this.getTeamsPage(); + this.getNonTeamsPage(); + }); + + } + + removeTeam($event, team) { + $event.stopPropagation(); + + this.event.teamIds = _.reject(this.event.teamIds, teamId => { return teamId === team.id; }); + this.teamsNotInEvent.push(team); + this.teamsInEvent = _.reject(this.teamsInEvent, oldTeam => { return oldTeam.id === team.id; }); + + this.Event.removeTeam({ id: this.event.id, teamId: team.id }).$promise.then(() => { + this.getTeamsPage(); + this.getNonTeamsPage(); + }); + } + + + hasNextTeam() { + return (this.teamsPageIndex + 1) * this.teamsPageSize < this.teamsPage.totalCount; + } + + hasPreviousTeam() { + return this.teamsPageIndex > 0 && this.teamsPage.totalCount > 0; + } + + nextTeamPage() { + if (this.hasNextTeam()) { + this.teamsPageIndex++; + this.getTeamsPage(); + } + } + + previousTeamPage() { + if (this.hasPreviousTeam()) { + this.teamsPageIndex--; + this.getTeamsPage(); + } + } + + searchTeams() { + this.teamsPageIndex = 0; + this.getTeamsPage() + } + + hasNextNonTeam() { + return (this.nonTeamsPageIndex + 1) * this.nonTeamsPageSize < this.nonTeamsPage.totalCount + } + + hasPreviousNonTeam() { + return this.nonTeamsPageIndex > 0 && this.nonTeamsPage.totalCount > 0; + } + + nextNonTeamPage() { + if (this.hasNextNonTeam()) { + this.nonTeamsPageIndex++; + this.getNonTeamsPage(); + } + } + + previousNonTeamPage() { + if (this.hasPreviousNonTeam()) { + this.nonTeamsPageIndex--; + this.getNonTeamsPage(); + } + } + + searchNonTeams() { + this.nonTeamsPageIndex = 0; + this.getNonTeamsPage(); + } + + addLayer($event, layer) { + $event.stopPropagation(); + + this.layer = {}; + this.event.layerIds.push(layer.id); + this.eventLayers.push(layer); + this.nonLayers = _.reject(this.nonLayers, l => { return l.id === layer.id; }); + + this.Event.addLayer({ id: this.event.id }, layer); + } + + removeLayer($event, layer) { + this.event.layerIds = _.reject(this.event.layerIds, layerId => { return layerId === layer.id; }); + this.eventLayers = _.reject(this.eventLayers, l => { return l.id === layer.id; }); + this.nonLayers.push(layer); + + this.Event.removeLayer({ id: this.event.id, layerId: layer.id }); + } + + saveFormRestrictions() { + this.restrictions.minObservationForms.$setValidity('formsMax', true); + this.restrictions.maxObservationForms.$setValidity('formsMin', true); + + const forms = this.event.forms || []; + const totalMin = forms.reduce((total, form) => total += form.min, 0); + if (this.event.maxObservationForms && totalMin > this.event.maxObservationForms) { + this.restrictions.maxObservationForms.$setValidity('formsMin', false); + } + + if (forms.every(form => form.max != null)) { + const totalMax = forms.reduce((total, form) => total += form.max, 0) + if (this.event.minObservationForms && this.event.minObservationForms > totalMax) { + this.restrictions.minObservationForms.$setValidity('formsMax', false); + } + } + + if (this.restrictions.$invalid) return; + + const event = new this.Event({ + id: this.event.id, + forms: this.event.forms, + minObservationForms: this.event.minObservationForms, + maxObservationForms: this.event.maxObservationForms, + }) + event.$save(() => { + delete this.restrictionsError; + this.restrictions.$setPristine(); + }, response => { + if (response.status === 500) { + restrictionsError + this.restrictionsError = { + message: response.data + }; + } else if (response.data && response.data.message) { + this.restrictionsError = { + errors: response.data.errors + }; + } + }); + } + + editEvent(event) { + this.$state.go('admin.eventEdit', { eventId: event.id }); + } + + editAccess(event) { + this.$state.go('admin.eventAccess', { eventId: event.id }); + } + + editForm(event, form) { + this.$state.go('admin.formEdit', { eventId: event.id, formId: form.id }); + } + + gotoMember(member) { + if (member.username) { + this.$state.go('admin.user', { userId: member.id }); + } else { + this.$state.go('admin.team', { teamId: member.id }); + } + } + + gotoLayer(layer) { + this.$state.go('admin.layer', { layerId: layer.id }); + } + + completeEvent(event) { + event.complete = true; + event.$save(updatedEvent => { + this.event = updatedEvent; + }); + } + + activateEvent(event) { + event.complete = false; + event.$save(() => { + event.complete = false; + }); + } + + createForm() { + this.formCreateOpen = { opened: true }; + } + + onFormCreateClose(form) { + this.formCreateOpen = { opened: false }; + if (form.id) { + this.$state.go('admin.formEdit', { eventId: this.event.id, formId: form.id }); + } else { + this.$state.go('admin.fieldsCreate', { eventId: this.event.id, form: form }); + } + } + + moveFormUp($event, form) { + $event.stopPropagation(); + + let forms = this.event.forms; + let from = forms.indexOf(form); + let to = from - 1; + if (!this.showArchivedForms) { + for (; to >= 0; to--) { + if (!forms[to].archived) { + break; + } + } + } + + forms.splice(to, 0, forms.splice(from, 1)[0]); + + this.event.$save(); + } + + moveFormDown($event, form) { + $event.stopPropagation(); + + let forms = this.event.forms; + let from = forms.indexOf(form); + let to = from + 1; + if (!this.showArchivedForms) { + for (; from < forms.length; to++) { + if (!forms[to].archived) { + break; + } + } + } + + forms.splice(to, 0, forms.splice(from, 1)[0]); + + this.event.$save(); + } + + preview($event, form) { + $event.stopPropagation(); + this.previewForm = form; + } + + closePreview() { + this.previewForm = null; + } + + deleteEvent() { + let modalInstance = this.$uibModal.open({ + resolve: { + event: () => { + return this.event; + } + }, + component: "adminEventDelete" + }); + + modalInstance.result.then(() => { + this.$state.go('admin.events'); + }); + } +} + +AdminEventController.$inject = ['$state', '$stateParams', '$filter', '$q', '$uibModal', 'LocalStorageService', 'UserService', 'Event', 'Team', 'Layer']; + +export default { + template: require('./event.html'), + controller: AdminEventController +}; diff --git a/web-app/admin/src/ng1/admin/events/event.edit.component.js b/web-app/admin/src/ng1/admin/events/event.edit.component.js index 9d504edde..c05d0b7f7 100644 --- a/web-app/admin/src/ng1/admin/events/event.edit.component.js +++ b/web-app/admin/src/ng1/admin/events/event.edit.component.js @@ -7,17 +7,15 @@ class AdminEventEditController { $onInit() { if (this.$stateParams.eventId) { - this.Event.get({ id: this.$stateParams.eventId }, event => { + this.Event.get({id: this.$stateParams.eventId}, event => { this.event = new this.Event({ id: event.id, name: event.name, - description: event.description, - // noGeometry: !!event.noGeometry + description: event.description }); }); } else { this.event = new this.Event(); - this.event.noGeometry = false; } } diff --git a/web-app/admin/src/ng1/admin/events/event.edit.html b/web-app/admin/src/ng1/admin/events/event.edit.html index b5c0a6235..3818301bc 100644 --- a/web-app/admin/src/ng1/admin/events/event.edit.html +++ b/web-app/admin/src/ng1/admin/events/event.edit.html @@ -1,20 +1,14 @@ -
- -
- Events -
-
- / -
- -
- / -
-
- {{ $ctrl.event.id ? 'Edit' : 'New' }} +
+
+ +
@@ -25,44 +19,36 @@

Edit event: {{$ctrl.event.name}}

New event

-
+
+
- +
- -
-
- +
{{$ctrl.error.message}}
-
  • - {{value.message}} -
  • +
  • {{value.message}}
  • +
    -
    \ No newline at end of file +
    diff --git a/web-app/admin/src/ng1/admin/events/event.html b/web-app/admin/src/ng1/admin/events/event.html new file mode 100644 index 000000000..2e5a764ad --- /dev/null +++ b/web-app/admin/src/ng1/admin/events/event.html @@ -0,0 +1,583 @@ + + +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +

    Event: {{$ctrl.event.name}}

    +
    +
    +

    + + +

    +
    +
    +
    + +
    +
    +
    +
    + Name:  +
    +
    + {{$ctrl.event.name}} +
    +
    + +
    +
    + Description:  +
    +
    + {{$ctrl.event.description}} +
    +
    +
    + +
    +
    +
    + Complete Event +

    Marking an event as complete will remove it as a selectable event. The event is + not destroyed and can be changed back to an active state at any time.

    + +
    +
    + +
    +
    + Activate Event +

    Marking an event as active will show it as a selectable event on clients. At that + point users can contribute observations and locations to the event.

    + +
    +
    + +
    +
    + Delete Event +

    Deleting an event will remove all event information including observation and location + data. This cannot be undone, and all event data will be unrecoverable.

    + +
    +
    +
    + +
    + +
    + +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + +
    +
    + {{user.displayName}} + ({{user.username}}) +
    +
    {{user.email}}
    +
    + Add Member +
    +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    Loading
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + {{user.displayName}} + ({{user.username}}) +
    +
    {{user.email}}
    +
    + Remove Member +
    +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    Loading
    +
    + +
    +
    +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    + +
    +
    + {{team.name}} +
    +
    {{team.description}}
    +
    + Add Team +
    +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    Loading
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + {{team.name}} +
    +
    {{team.description}}
    +
    + Remove Team +
    +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    Loading
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + {{layer.name}} +
    +
    {{layer.description}}
    +
    + Add Layer +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    + {{layer.name}} + + + + +
    +
    +
    +
    + {{layer.description}} +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    Forms
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    + {{form.name}} (Archived) +
    +
    + {{form.description}} +
    +
    +
    + + + +
    +
    + +
    + + + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    Form Restrictions
    +
    +
    +
    +
    +
    + + +

    Minimum number of forms that must be present in an observation for this event

    +

    Value cannot be negative.

    +

    Value cannot be greater than 'Max Forms Per Observation'

    +

    The minimum forms per observation must be equal to or less than the sum of the maximum of all individual forms.

    + +
    +
    + + +

    Limit the total number of forms that can be added to an observation for this event

    +

    Value must be greater than 0

    +

    The maximum forms per observation must be equal to or greater than the sum of the minimum of all individual forms.

    +
    +
    +
    + +
    +
    +
    +

    Add restrictions to individual forms that include the minimum number times a form must be present in an observation, and/or the maximum number times this form can be present in an observation.

    +
    +
    +
    + +
    +
    +
    + {{form.name}} +
    +
    +
    + + +
    +
    + + +

    Cannot exceed the maximum number of forms per observation of {{$ctrl.event.maxObservationForms}}

    +
    +
    +
    Min must be greater than 0
    +
    Min greater than Max
    +
    +
    +
    +
    + +
    +
    Form Restriction Error
    +

    {{$ctrl.restrictionsError.message}}

    +
      +
    • {{error.message}}
    • +
    +
    + +
    + +
    +
    +
    +
    +
    +
    + + diff --git a/web-app/admin/src/ng1/admin/events/events.component.js b/web-app/admin/src/ng1/admin/events/events.component.js index 834c42f39..e6f9fb537 100644 --- a/web-app/admin/src/ng1/admin/events/events.component.js +++ b/web-app/admin/src/ng1/admin/events/events.component.js @@ -9,12 +9,10 @@ class AdminEventsController { this.UserService = UserService; this.events = []; - this.totalEvents = 0; this.filter = 'active'; // possible values all, active, complete this.page = 0; this.itemsPerPage = 10; this.eventSearch = ''; - this.searchTimeout = null; this.projection = { name: true, @@ -22,70 +20,57 @@ class AdminEventsController { acl: true, complete: true }; - } - $onInit() { - this.loadEvents(); + // For some reason angular is not calling into filter function with correct context + this.filterEvents = this._filterEvents.bind(this); + this.filterComplete = this._filterComplete.bind(this); } - loadEvents() { - const params = { - state: this.filter, - populate: false, - projection: JSON.stringify(this.projection), - page: this.page, - page_size: this.itemsPerPage, - includePagination: true - }; - - if (this.eventSearch && this.eventSearch.trim()) { - params.term = this.eventSearch.trim(); - } - - this.Event.queryWithPagination(params, (response) => { - this.events = response.items || []; - this.totalEvents = response.totalCount || 0; - }); + $onInit() { + this.Event.query( + { + state: 'all', + populate: false, + projection: JSON.stringify(this.projection) + }, + (events) => { + this.events = events; + } + ); } handleSearchChange() { - if (this.searchTimeout) { - clearTimeout(this.searchTimeout); - } - this.searchTimeout = setTimeout(() => { - this.page = 0; - this.loadEvents(); - }, 300); - } - - handleFilterChange() { - this.page = 0; - this.loadEvents(); - } + const filtered = this.events.filter((event) => this._filterEvents(event)); - handlePageChange() { - this.loadEvents(); + // If there are filtered results, reset to page 0, else keep the current page + this.page = filtered.length > 0 ? 0 : this.page; } - nextPage() { - if ((this.page + 1) * this.itemsPerPage < this.totalEvents) { - this.page++; - this.loadEvents(); + _filterEvents(event) { + const searchTerm = this.eventSearch.trim().toLowerCase(); + if (!searchTerm) { + return true; } - } - - previousPage() { - if (this.page > 0) { - this.page--; - this.loadEvents(); + const nameMatches = event.name.toLowerCase().includes(searchTerm); + const descriptionMatches = + event.description && event.description.toLowerCase().includes(searchTerm); + return nameMatches || descriptionMatches; + } + + _filterComplete(event) { + switch (this.filter) { + case 'all': + return true; + case 'active': + return !event.complete; + case 'complete': + return event.complete; } } reset() { this.page = 0; this.eventSearch = ''; - this.filter = 'active'; - this.loadEvents(); } newEvent() { diff --git a/web-app/admin/src/ng1/admin/events/events.html b/web-app/admin/src/ng1/admin/events/events.html index 0a4c6cd38..fdc8196b5 100644 --- a/web-app/admin/src/ng1/admin/events/events.html +++ b/web-app/admin/src/ng1/admin/events/events.html @@ -1,7 +1,8 @@ -
    - -
    - Events +
    +
    +
    @@ -9,18 +10,39 @@
    @@ -57,7 +88,10 @@
    -
    +
    @@ -67,12 +101,18 @@
    {{e.description}}
    - -
    @@ -83,10 +123,20 @@ @@ -95,4 +145,4 @@
    -
    \ No newline at end of file +
    diff --git a/web-app/admin/src/ng1/admin/events/forms/feed/feed.edit.html b/web-app/admin/src/ng1/admin/events/forms/feed/feed.edit.html index c42177fc9..2755bf986 100644 --- a/web-app/admin/src/ng1/admin/events/forms/feed/feed.edit.html +++ b/web-app/admin/src/ng1/admin/events/forms/feed/feed.edit.html @@ -1,48 +1,18 @@ -
    - -
    - Events -
    -
    - / -
    - -
    - / -
    - -
    - / -
    -
    - Feed Configuration - - (unsaved changes) +
    +
    +
    -

    - Edit Feed Configuration for form: {{$ctrl.form.name}} -

    +

    Edit Feed Configuration for form: {{$ctrl.form.name}}

    @@ -64,21 +34,10 @@

    - - {{$select.selected.title}} - -
    + + {{$select.selected.title}} + +
    @@ -89,21 +48,10 @@

    - - {{$select.selected.title}} - -
    + + {{$select.selected.title}} + +
    @@ -116,16 +64,8 @@

    Sample Observation Feed

    -
    - +
    +
    @@ -135,29 +75,10 @@

    Sample Observation Feed

    - - - + + +
    -
    +

    \ No newline at end of file diff --git a/web-app/admin/src/ng1/admin/events/forms/fields/fields.edit.html b/web-app/admin/src/ng1/admin/events/forms/fields/fields.edit.html index fc3c18854..0ebfeacfd 100644 --- a/web-app/admin/src/ng1/admin/events/forms/fields/fields.edit.html +++ b/web-app/admin/src/ng1/admin/events/forms/fields/fields.edit.html @@ -1,39 +1,12 @@ -
    - -
    - Events -
    -
    - / -
    - -
    - / -
    - -
    - / -
    -
    - Fields - - (unsaved changes) +
    +
    +
    diff --git a/web-app/admin/src/ng1/admin/events/forms/form.create.component.js b/web-app/admin/src/ng1/admin/events/forms/form.create.component.js new file mode 100644 index 000000000..9208522e7 --- /dev/null +++ b/web-app/admin/src/ng1/admin/events/forms/form.create.component.js @@ -0,0 +1,69 @@ +import {dialog} from 'material-components-web'; + +class FormUploadController { + constructor($element, Form) { + this.$element = $element; + this.Form = Form; + + this.formPanel; + } + + $onChanges() { + if (this.open && this.open.opened && !this.formPanel.isOpen) { + this.form = new this.Form({ + eventId: this.event.id, + color: '#' + ('000000' + Math.floor(Math.random() * 0xFFFFFF).toString(16)).slice(-6) + }); + + this.formPanel.open(); + } + } + + $onInit() { + this.formPanel = new dialog.MDCDialog(this.$element.find('.form-create-panel')[0]); + this.formPanel.listen('MDCDialog:closing', event => { + if (event.detail.action !== 'close') { + this.onFormCreateClose({form: this.form}); + } + }); + + this.formPanel.listen('MDCDialog:opening', () => {}); + } + + formFilePicked($event) { + this.form.formArchiveFile = $event.file; + } + + upload() { + this.generalForm.$submitted = true; + if (this.generalForm.$invalid) { + return; + } + + if (this.form.formArchiveFile) { + this.form.$save({}, form => { + this.form.id = form.id; + this.formPanel.close(); + }, response => { + this.error = response.responseText; + }); + } else { + this.formPanel.close(); + } + } +} + +FormUploadController.$inject = ['$element', 'Form']; + +export default { + template: require('./form.create.html'), + bindings: { + open: '<', + event: '<', + onFormCreateClose: '&' + }, + controller: FormUploadController +}; + + + diff --git a/web-app/admin/src/ng1/admin/events/forms/form.create.html b/web-app/admin/src/ng1/admin/events/forms/form.create.html new file mode 100644 index 000000000..db0f1f40d --- /dev/null +++ b/web-app/admin/src/ng1/admin/events/forms/form.create.html @@ -0,0 +1,71 @@ +
    + +
    +
    + +
    +
    +
    +
    +
    + + + Name is required +
    +
    + + +
    + +
    + + + Color is invalid +
    + +
    +

    If you would like to create this form based on a previously archived MAGE form please upload it here.

    + + +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    +
    +
    Error Creating Form
    +
    {{$ctrl.error}}
    +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    diff --git a/web-app/admin/src/ng1/admin/events/forms/form.edit.html b/web-app/admin/src/ng1/admin/events/forms/form.edit.html index 5bb67f92c..ab6c30b4c 100644 --- a/web-app/admin/src/ng1/admin/events/forms/form.edit.html +++ b/web-app/admin/src/ng1/admin/events/forms/form.edit.html @@ -1,23 +1,10 @@ -
    - -
    - Events -
    -
    - / -
    - -
    - / -
    -
    - {{$ctrl.form.name}} +
    +
    +
    diff --git a/web-app/admin/src/ng1/admin/events/forms/index.js b/web-app/admin/src/ng1/admin/events/forms/index.js index 6c5bd9bb7..394c34890 100644 --- a/web-app/admin/src/ng1/admin/events/forms/index.js +++ b/web-app/admin/src/ng1/admin/events/forms/index.js @@ -1,11 +1,13 @@ import angular from 'angular'; +import formCreate from './form.create.component'; import formEdit from './form.edit.component'; import formEditError from './form.edit.error.component'; import formEditUnsaved from './form.edit.unsaved.component'; angular.module('mage') .component('adminEventFormEdit', formEdit) + .component('adminEventFormCreate', formCreate) .component('adminEventFormEditError', formEditError) .component('adminEventFormEditUnsaved', formEditUnsaved); diff --git a/web-app/admin/src/ng1/admin/events/forms/map/map.edit.html b/web-app/admin/src/ng1/admin/events/forms/map/map.edit.html index 970997849..e475f7122 100644 --- a/web-app/admin/src/ng1/admin/events/forms/map/map.edit.html +++ b/web-app/admin/src/ng1/admin/events/forms/map/map.edit.html @@ -1,39 +1,11 @@ -
    - -
    - Events -
    -
    - / -
    - -
    - / -
    - -
    - / -
    -
    - Map Symbology - - (unsaved changes) +
    +
    +
    diff --git a/web-app/admin/src/ng1/admin/events/index.js b/web-app/admin/src/ng1/admin/events/index.js index f1f8dc9e0..57edb4ef1 100644 --- a/web-app/admin/src/ng1/admin/events/index.js +++ b/web-app/admin/src/ng1/admin/events/index.js @@ -1,10 +1,14 @@ import angular from 'angular'; +import event from './event.component'; import events from './events.component'; -import eventDelete from './event.delete.component'; import eventEdit from './event.edit.component'; +import eventDelete from './event.delete.component'; +import eventAccess from './event.access.component'; import './forms/index.js'; angular.module('mage') + .component('adminEvent', event) .component('adminEvents', events) + .component('adminEventEdit', eventEdit) .component('adminEventDelete', eventDelete) - .component('adminEventEdit', eventEdit); + .component('adminEventAccess', eventAccess); diff --git a/web-app/admin/src/ng1/admin/index.js b/web-app/admin/src/ng1/admin/index.js index 232cfc785..e1217476f 100644 --- a/web-app/admin/src/ng1/admin/index.js +++ b/web-app/admin/src/ng1/admin/index.js @@ -1,24 +1,22 @@ import angular from 'angular'; import admin from './admin.component'; -import adminPluginTabContentBridge from './admin.plugin-tab-content-bridge.component'; +import adminTab from './admin.tab.component'; +import adminDashboard from './admin.dashboard.component'; +import adminPluginTabContentBridge from './admin.plugin-tab-content-bridge.component' import { downgradeComponent } from '@angular/upgrade/static'; import { AdminPluginTabContentComponent } from '../../app/admin/plugin-tab/plugin-tab-content.component'; -import { AdminNavComponent } from '../../app/admin/admin-nav/admin-nav'; angular .module('mage') .component('admin', admin) + .component('adminTab', adminTab) + .component('adminDashboard', adminDashboard) .component('mageAdminPluginTabContentBridge', adminPluginTabContentBridge) - .directive( - 'mageAdminPluginTabContent', - downgradeComponent({ component: AdminPluginTabContentComponent }) - ) - .directive( - 'appAdminSideNav', - downgradeComponent({ component: AdminNavComponent }) - ); + .directive('mageAdminPluginTabContent', downgradeComponent({ component: AdminPluginTabContentComponent })); +require('./users'); require('./devices'); require('./events'); require('./layers'); +require('./teams'); require('./feeds'); diff --git a/web-app/admin/src/ng1/admin/layers/layer.component.js b/web-app/admin/src/ng1/admin/layers/layer.component.js index d5cb5b09d..5a2365ae4 100644 --- a/web-app/admin/src/ng1/admin/layers/layer.component.js +++ b/web-app/admin/src/ng1/admin/layers/layer.component.js @@ -64,56 +64,38 @@ class AdminLayerController { this.updateUrlLayers(); - this.loadEvents(); - }); - } - - loadEvents(searchTerm) { - const params = { - includePagination: true, - page_size: 100 - }; - - if (searchTerm) { - params.term = searchTerm; - } - - this.Event.queryWithPagination(params, (response) => { - const events = response.items || []; - this.event = {}; - this.layerEvents = _.filter(events, (event) => { - return _.some(event.layers, (layer) => { - return this.layer.id === layer.id; + this.Event.query((events) => { + this.event = {}; + this.layerEvents = _.filter(events, (event) => { + return _.some(event.layers, (layer) => { + return this.layer.id === layer.id; + }); }); - }); - let nonLayerEvents = _.chain(events); - if ( - !_.contains(this.UserService.myself.role.permissions, 'UPDATE_EVENT') - ) { - // filter teams based on acl - nonLayerEvents = nonLayerEvents.filter((event) => { - const permissions = event.acl[this.UserService.myself.id] - ? event.acl[this.UserService.myself.id].permissions - : []; - return _.contains(permissions, 'update'); - }); - } + let nonLayerEvents = _.chain(events); + if ( + !_.contains(this.UserService.myself.role.permissions, 'UPDATE_EVENT') + ) { + // filter teams based on acl + nonLayerEvents = nonLayerEvents.filter((event) => { + const permissions = event.acl[this.UserService.myself.id] + ? event.acl[this.UserService.myself.id].permissions + : []; + return _.contains(permissions, 'update'); + }); + } - nonLayerEvents = nonLayerEvents.reject((event) => { - return _.some(event.layers, (layer) => { - return this.layer.id === layer.id; + nonLayerEvents = nonLayerEvents.reject((event) => { + return _.some(event.layers, (layer) => { + return this.layer.id === layer.id; + }); }); - }); - this.nonLayerEvents = nonLayerEvents.value(); + this.nonLayerEvents = nonLayerEvents.value(); + }); }); } - onEventSearch(searchTerm) { - this.loadEvents(searchTerm || ''); - } - $postLink() { this.uploadSnackbar = new snackbar.MDCSnackbar( document.querySelector('#upload-snackbar') @@ -131,8 +113,9 @@ class AdminLayerController { this.layer.tables.forEach((table) => { mapping.push({ table: table.name, - url: `/api/layers/${this.layer.id}/${table.name - }/{z}/{x}/{y}.png?access_token=${this.LocalStorageService.getToken()}` + url: `/api/layers/${this.layer.id}/${ + table.name + }/{z}/{x}/{y}.png?access_token=${this.LocalStorageService.getToken()}` }); }); } diff --git a/web-app/admin/src/ng1/admin/layers/layer.edit.html b/web-app/admin/src/ng1/admin/layers/layer.edit.html index 77d43ed5d..0ecd0cafd 100644 --- a/web-app/admin/src/ng1/admin/layers/layer.edit.html +++ b/web-app/admin/src/ng1/admin/layers/layer.edit.html @@ -1,23 +1,14 @@ -
    - -
    - Layers -
    -
    - / -
    - -
    - / -
    -
    - {{ $ctrl.layer.id ? 'Edit' : 'New' }} +
    +
    + +
    @@ -28,7 +19,7 @@

    Edit layer: {{$ctrl.layer.name}}

    New layer

    -
    +
    @@ -37,21 +28,11 @@

    New layer

    - +
    - +
    @@ -59,23 +40,12 @@

    New layer

    -
    - +
    +
    - +
    @@ -86,56 +56,48 @@

    New layer

    Layer Type
    - + value="Imagery" + id="imagery_option" + name="layer-type">
    - +
    - + value="Feature" + id="feature_option" + name="layer-type">
    - +
    - + value="GeoPackage" + id="geopackage_option" + name="layer-type">
    @@ -145,39 +107,24 @@

    New layer

    -
    +
    - +
    -
    -
    - +
    +
    +
    - +
    @@ -187,19 +134,18 @@

    New layer

    - + id="baseLayer_cb"/>
    - - + + d="M1.73,12.91 8.1,19.28 22.79,4.59"/>
    @@ -211,15 +157,14 @@

    New layer

    - + value="XYZ" + id="xyz_option" + name="layer-format">
    @@ -229,15 +174,14 @@

    New layer

    - + value="TMS" + id="tms_option" + name="layer-format">
    @@ -247,15 +191,14 @@

    New layer

    - + value="WMS" + id="wms_option" + name="layer-format">
    @@ -265,60 +208,42 @@

    New layer

    - + on-wms-options-update="$ctrl.wmsOptionsUpdate(options)"/> -
    - {{$ctrl.progress | filesize}} / {{$ctrl.total | - filesize}} +
    + {{$ctrl.progress | filesize}} / {{$ctrl.total | filesize}}
    +
    -
    -
    {{$ctrl.errorMessage}}
    +
    + {{$ctrl.errorMessage}} +
    - +
    +
    - +
    -
    + +
    \ No newline at end of file diff --git a/web-app/admin/src/ng1/admin/layers/layer.html b/web-app/admin/src/ng1/admin/layers/layer.html index 732b4f231..59f8eedad 100644 --- a/web-app/admin/src/ng1/admin/layers/layer.html +++ b/web-app/admin/src/ng1/admin/layers/layer.html @@ -1,13 +1,9 @@ -
    - -
    - Layers -
    -
    - / -
    -
    - {{$ctrl.layer.name}} +
    +
    +
    @@ -19,206 +15,192 @@

    Layer: {{$ctrl.layer.name}}

    -
    +

    - +

    - +


    -
    -
    +
    +
    -
    -
    - Name:  -
    -
    - {{$ctrl.layer.name}} +
    +
    + Name:  +
    +
    + {{$ctrl.layer.name}} +
    -
    -
    -
    - Type:  -
    -
    - {{$ctrl.layer.type}} +
    +
    + Type:  +
    +
    + {{$ctrl.layer.type}} +
    -
    -
    -
    - Base Layer:  -
    -
    - {{$ctrl.layer.base}} +
    +
    + Base Layer:  +
    +
    + {{$ctrl.layer.base}} +
    -
    -
    -
    - Format:  -
    -
    - {{$ctrl.layer.format}} +
    +
    + Format:  +
    +
    + {{$ctrl.layer.format}} +
    -
    -
    -
    - URL:  -
    -
    - {{$ctrl.layer.url}} +
    +
    + URL:  +
    +
    + {{$ctrl.layer.url}} +
    -
    -
    -
    - Layers:  -
    -
    - {{$ctrl.layer.wms.layers}} +
    +
    + Layers:  +
    +
    + {{$ctrl.layer.wms.layers}} +
    -
    -
    -
    - Styles:  -
    -
    - {{$ctrl.layer.wms.styles}} +
    +
    + Styles:  +
    +
    + {{$ctrl.layer.wms.styles}} +
    -
    -
    -
    - Format:  -
    -
    - {{$ctrl.layer.wms.format}} +
    +
    + Format:  +
    +
    + {{$ctrl.layer.wms.format}} +
    -
    -
    -
    - Transparent:  -
    -
    - {{$ctrl.layer.wms.transparent}} +
    +
    + Transparent:  +
    +
    + {{$ctrl.layer.wms.transparent}} +
    -
    -
    -
    - Version:  -
    -
    - {{$ctrl.layer.wms.version}} +
    +
    + Version:  +
    +
    + {{$ctrl.layer.wms.version}} +
    -
    -
    -
    - Description:  -
    -
    - {{$ctrl.layer.description}} +
    +
    + Description:  +
    +
    + {{$ctrl.layer.description}} +
    -
    -
    -
    -
    - Delete Layer -

    Deleting a layer will remove all information. This cannot be undone, and all layer - data will be unrecoverable.

    - +
    +
    +
    + Delete Layer +

    Deleting a layer will remove all information. This cannot be undone, and all layer data will be unrecoverable.

    + +
    -
    -
    -
    -
    -
    -
    -
    - + +
    -
    -
    -
    -
    -
    - - -
    Created - {{$ctrl.status[$index].features}} Features From File {{$ctrl.status[$index].name}}
    +
    +
    +
    +
    + + +
    Created {{$ctrl.status[$index].features}} Features From File {{$ctrl.status[$index].name}}
    +
    -
    -
    +
    -
    -
    - - +
    +
    + + +
    -
    -
    -
    -

    GeoPackage Validation Errors

    -
    - {{error.error}} - {{error.error}} -
    -
    -
    -
    -
    - Proceed With Layer Creation -

    The GeoPackage used to create this layer is invalid. - This layer is not currently available to any user of MAGE. You may proceed with the creation of this - layer, but be aware doing so - may result in unintended consequences including app and server crashes. -

    - +
    +
    +

    GeoPackage Validation Errors

    +
    + {{error.error}} + {{error.error}} +
    +
    +
    +
    +
    + Proceed With Layer Creation +

    The GeoPackage used to create this layer is invalid. + This layer is not currently available to any user of MAGE. You may proceed with the creation of this layer, but be aware doing so + may result in unintended consequences including app and server crashes.

    + +
    -
    -
    +
    -
    +
    @@ -240,8 +222,7 @@

    GeoPackage Validation Errors

    {{$select.selected.name}} - +
    @@ -251,10 +232,9 @@

    GeoPackage Validation Errors


    -
    - -
    +
    + +
    @@ -273,8 +253,7 @@

    GeoPackage Validation Errors

    @@ -285,12 +264,11 @@

    GeoPackage Validation Errors

    + ng-repeat="e in ($ctrl.filteredEvents = ($ctrl.layerEvents | filter:$ctrl.filterEvents)) | orderBy:'name' | offset: $ctrl.eventsPage*$ctrl.eventsPerPage | limitTo:$ctrl.eventsPerPage" >
    - +
    @@ -308,13 +286,10 @@

    GeoPackage Validation Errors

    @@ -328,8 +303,7 @@

    GeoPackage Validation Errors

    {{table.name}}
    - +
    @@ -338,8 +312,7 @@

    GeoPackage Validation Errors

    - +
    @@ -347,8 +320,7 @@

    GeoPackage Validation Errors

    Processing

    - The GeoPackage file is being optimized for maximum performance across all MAGE clients. This includes - indexing the feature layers and processing the tile layers for quick access. + The GeoPackage file is being optimized for maximum performance across all MAGE clients. This includes indexing the feature layers and processing the tile layers for quick access.
    @@ -362,23 +334,18 @@
    "{{status.layer}}" layer index
    -
    +
    -
    {{status.description}} -
    -
    +
    {{status.description}}
    +
    -
    {{status.count}} - of {{status.total}} {{status.type}}s
    +
    {{status.count}} of {{status.total}} {{status.type}}s
    diff --git a/web-app/admin/src/ng1/admin/layers/layers.html b/web-app/admin/src/ng1/admin/layers/layers.html index 875914b6e..7cf4682ce 100644 --- a/web-app/admin/src/ng1/admin/layers/layers.html +++ b/web-app/admin/src/ng1/admin/layers/layers.html @@ -1,7 +1,8 @@ -
    - -
    - Layers +
    +
    +
    diff --git a/web-app/admin/src/ng1/admin/teams/index.js b/web-app/admin/src/ng1/admin/teams/index.js new file mode 100644 index 000000000..06f7fccc7 --- /dev/null +++ b/web-app/admin/src/ng1/admin/teams/index.js @@ -0,0 +1,13 @@ +var angular = require('angular'); +import adminTeams from './teams.component'; +import adminTeam from './team.component'; +import adminTeamEdit from './team.edit.component'; +import adminTeamAccess from './team.access.component'; +import adminTeamDelete from './team.delete.component'; + +angular.module('mage') + .component('adminTeams', adminTeams) + .component('adminTeam', adminTeam) + .component('adminTeamEdit', adminTeamEdit) + .component('adminTeamAccess', adminTeamAccess) + .component('adminTeamDelete', adminTeamDelete); \ No newline at end of file diff --git a/web-app/admin/src/ng1/admin/teams/team.access.component.js b/web-app/admin/src/ng1/admin/teams/team.access.component.js new file mode 100644 index 000000000..d52076af7 --- /dev/null +++ b/web-app/admin/src/ng1/admin/teams/team.access.component.js @@ -0,0 +1,186 @@ +"use strict"; + +import _ from 'underscore'; + +class AdminTeamAccessController { + constructor($state, $stateParams, $q, $filter, Team, TeamAccess, UserPagingService) { + this.$state = $state; + this.$stateParams = $stateParams; + this.$q = $q; + this.$filter = $filter; + this.Team = Team; + this.TeamAccess = TeamAccess; + this.UserPagingService = UserPagingService; + + this.team = null; + this.teamMembers = []; + + this.nonMember = { + role: 'GUEST' + }; + + //This is the list of users returned from a search + this.nonMemberSearchResults = []; + this.isSearching = false; + + this.userState = 'all'; + this.nonAclUserState = this.userState + '.nonacl'; + this.memberSearch = ''; + + this.stateAndData = this.UserPagingService.constructDefault(); + + this.owners = []; + + // For some reason angular is not calling into filter function with correct context + this.filterMembers = this._filterMembers.bind(this); + } + + $onInit() { + this.$q.all({ team: this.Team.get({ id: this.$stateParams.teamId, populate: false }).$promise }).then(result => { + this.team = result.team; + + let clone = JSON.parse(JSON.stringify(this.stateAndData[this.userState])); + this.stateAndData[this.nonAclUserState] = clone; + + this.stateAndData[this.userState].userFilter.in = { _id: Object.keys(this.team.acl) }; + this.stateAndData[this.userState].countFilter.in = { _id: Object.keys(this.team.acl) }; + + this.UserPagingService.refresh(this.stateAndData).then(() => { + this.refreshMembers(this.team); + }); + }); + } + + refreshMembers(team) { + this.team = team; + + const usersById = _.indexBy(this.UserPagingService.users(this.stateAndData[this.userState]), 'id'); + + this.teamMembers = _.map(this.team.acl, (access, userId) => { + let member = _.pick(usersById[userId], 'displayName', 'avatarUrl', 'lastUpdated'); + member.id = userId; + member.role = access.role; + return member; + }); + + this.owners = this.getOwners(); + } + + getOwners() { + return _.filter(this.teamMembers, member => { + return member.role === 'OWNER'; + }); + } + + count() { + return this.UserPagingService.count(this.stateAndData[this.userState]); + } + + hasNext() { + return this.UserPagingService.hasNext(this.stateAndData[this.userState]); + } + + next() { + this.UserPagingService.next(this.stateAndData[this.stateAndData[this.userState]]).then(() => { + this.refreshMembers(this.team); + }); + } + + hasPrevious() { + return this.UserPagingService.hasPrevious(this.stateAndData[this.userState]); + } + + previous() { + this.UserPagingService.previous(this.stateAndData[this.userState]).then(() => { + this.refreshMembers(this.team); + }); + } + + search() { + this.UserPagingService.search(this.stateAndData[this.userState], this.memberSearch).then(() => { + this.refreshMembers(this.team); + }); + } + + searchNonMembers(searchString) { + this.isSearching = true; + + if (searchString == null) { + searchString = '.*'; + } + + return this.UserPagingService.search(this.stateAndData[this.nonAclUserState], searchString).then(users => { + this.nonMemberSearchResults = users; + + if (this.nonMemberSearchResults.length == 0) { + const noUser = { + displayName: "No Results Found" + }; + this.nonMemberSearchResults.push(noUser); + } + + this.isSearching = false; + return this.nonMemberSearchResults; + }); + } + + addMember() { + this.TeamAccess.update({ + teamId: this.team.id, + userId: this.nonMember.selected.id, + role: this.nonMember.role + }, team => { + delete this.nonMember.selected; + + this.stateAndData[this.userState].userFilter.in = { _id: Object.keys(team.acl) }; + this.stateAndData[this.userState].countFilter.in = { _id: Object.keys(team.acl) }; + + this.UserPagingService.refresh(this.stateAndData).then(() => { + this.refreshMembers(team); + }); + }); + } + + removeMember(member) { + this.TeamAccess.delete({ + teamId: this.team.id, + userId: member.id + }, team => { + + this.stateAndData[this.userState].userFilter.in = { _id: Object.keys(team.acl) }; + this.stateAndData[this.userState].countFilter.in = { _id: Object.keys(team.acl) }; + + this.UserPagingService.refresh(this.stateAndData).then(() => { + this.refreshMembers(team); + }); + }); + } + + updateRole(member, role) { + this.TeamAccess.update({ + teamId: this.team.id, + userId: member.id, + role: role + }, team => { + this.UserPagingService.refresh(this.stateAndData).then(() => { + this.refreshMembers(team); + }); + }); + } + + gotoUser(member) { + this.$state.go('admin.user', { userId: member.id }); + } + + _filterMembers(member) { + var filteredMembers = this.$filter('filter')([member], this.memberSearch); + return filteredMembers && filteredMembers.length; + } +} + +AdminTeamAccessController.$inject = ['$state', '$stateParams', '$q', '$filter', 'Team', 'TeamAccess', 'UserPagingService']; + +export default { + template: require('./team.access.html'), + controller: AdminTeamAccessController +}; \ No newline at end of file diff --git a/web-app/admin/src/ng1/admin/teams/team.access.html b/web-app/admin/src/ng1/admin/teams/team.access.html new file mode 100644 index 000000000..db67b4da3 --- /dev/null +++ b/web-app/admin/src/ng1/admin/teams/team.access.html @@ -0,0 +1,112 @@ +
    +
    + +
    +
    + +
    +
    +
    + +

    {{$ctrl.team.name}} Access

    + +
    + +

    Add a new member to {{$ctrl.team.name}}

    + +
    +
    + +
    + +
    + +
    + +
    + +
    +
    + +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + +
    + {{member.displayName}} + {{member.email}} +
    +
    + +
    + +
    +
    + Owner +
    +
    + +
    +
    + + + +
    +
    + +
    + +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/web-app/admin/src/ng1/admin/teams/team.component.js b/web-app/admin/src/ng1/admin/teams/team.component.js new file mode 100644 index 000000000..a5e19c6ff --- /dev/null +++ b/web-app/admin/src/ng1/admin/teams/team.component.js @@ -0,0 +1,255 @@ +"use strict"; + +import _ from 'underscore'; + +class AdminTeamController { + constructor($uibModal, $filter, $state, $stateParams, Team, Event, UserService) { + this.$uibModal = $uibModal; + this.$filter = $filter; + this.$state = $state; + this.$stateParams = $stateParams; + this.Team = Team; + this.Event = Event; + this.UserService = UserService; + + this.permissions = []; + this.edit = false; + + this.loadingMembers = false; + this.membersPageIndex = 0; + this.membersPageSize = 5; + this.membersPage = { + items: [], + totalCount: 0, + } + + this.loadingNonMembers = false; + this.nonMembersPageIndex = 0; + this.nonMembersPageSize = 5; + this.nonMembersPage = { + items: [], + totalCount: 0, + } + + this.teamEvents = []; + this.nonTeamEvents = []; + this.teamEventsPage = 0; + this.nonTeamEventsPage = 0; + this.eventsPerPage = 5; + + this.team = { + users: [] + }; + + // For some reason angular is not calling into filter function with correct context + this.filterEvents = this._filterEvents.bind(this); + this.filterTeamEvents = this._filterTeamEvents.bind(this); + } + + $onInit() { + this.Team.get({ id: this.$stateParams.teamId, populate: false }, team => { + this.team = team; + + const myAccess = this.team.acl[this.UserService.myself.id]; + const aclPermissions = myAccess ? myAccess.permissions : []; + + this.hasUpdatePermission = _.contains(this.UserService.myself.role.permissions, 'UPDATE_TEAM') || _.contains(aclPermissions, 'update'); + this.hasDeletePermission = _.contains(this.UserService.myself.role.permissions, 'DELETE_TEAM') || _.contains(aclPermissions, 'delete'); + }); + + this.getMembersPage(); + this.getNonMembersPage(); + + this.Event.query(events => { + this.event = {}; + this.teamEvents = _.filter(events, event => { + return _.some(event.teams, team => { + return this.team.id === team.id; + }); + }); + + this.nonTeamEvents = _.reject(events, event => { + return _.some(event.teams, team => { + return this.team.id === team.id; + }); + }); + }); + } + + getMembersPage() { + this.loadingMembers = true; + this.Team.getMembers({ + id: this.$stateParams.teamId, + page: this.membersPageIndex, + page_size: this.membersPageSize, + total: true, + term: this.memberSearchTerm + }, page => { + this.loadingMembers = false; + this.membersPage = page; + }); + } + + getNonMembersPage() { + this.loadingNonMembers = true; + this.Team.getNonMembers({ + id: this.$stateParams.teamId, + page: this.nonMembersPageIndex, + page_size: this.nonMembersPageSize, + total: true, + term: this.nonMemberSearchTerm + }, page => { + this.loadingNonMembers = false; + this.nonMembersPage = page; + }); + } + + hasNextMember() { + return (this.membersPageIndex + 1) * this.membersPageSize < this.membersPage.totalCount; + } + + hasPreviousMember() { + return this.membersPageIndex > 0 && this.membersPage.totalCount > 0; + } + + nextMemberPage() { + if (this.hasNextMember()) { + this.membersPageIndex++; + this.getMembersPage(); + } + } + + previousMemberPage() { + if (this.hasPreviousMember()) { + this.membersPageIndex--; + this.getMembersPage(); + } + } + + searchMembers() { + this.membersPageIndex = 0; + this.getMembersPage() + } + + hasNextNonMember() { + return (this.nonMembersPageIndex + 1) * this.nonMembersPageSize < this.nonMembersPage.totalCount + } + + hasPreviousNonMember() { + return this.nonMembersPageIndex > 0 && this.nonMembersPage.totalCount > 0; + } + + nextNonMemberPage() { + if (this.hasNextNonMember()) { + this.nonMembersPageIndex++; + this.getNonMembersPage(); + } + } + + previousNonMemberPage() { + if (this.hasPreviousNonMember()) { + this.nonMembersPageIndex--; + this.getNonMembersPage(); + } + } + + searchNonMember() { + this.nonMembersPageIndex = 0; + this.getNonMembersPage(); + } + + editTeam(team) { + this.$state.go('admin.editTeam', { teamId: team.id }); + } + + addMember($event, nonMember) { + $event.stopPropagation(); + + this.team.userIds.push(nonMember.id); + + this.saveTeam(); + } + + removeMember($event, user) { + $event.stopPropagation(); + this.team.userIds = _.reject(this.team.userIds, u => { return user.id === u; }); + + this.saveTeam(); + } + + _filterEvents(event) { + const filteredEvents = this.$filter('filter')([event], this.eventSearch); + return filteredEvents && filteredEvents.length; + } + + _filterTeamEvents(event) { + const filteredTeamEvents = this.$filter('filter')([event], this.teamEventSearch); + return filteredTeamEvents && filteredTeamEvents.length; + } + + saveTeam() { + this.team.$save(null, team => { + this.team = team; + this.getMembersPage(); + this.getNonMembersPage(); + }); + } + + hasPermission(permission) { + return _.contains(this.permissions, permission); + } + + editAccess(team) { + this.$state.go('admin.teamAccess', { teamId: team.id }); + } + + gotoEvent(event) { + this.$state.go('admin.event', { eventId: event.id }); + } + + gotoUser(user) { + this.$state.go('admin.user', { userId: user.id }); + } + + addEventToTeam($event, event) { + $event.stopPropagation(); + + this.Event.addTeam({ id: event.id }, this.team, event => { + this.teamEvents.push(event); + this.nonTeamEvents = _.reject(this.nonTeamEvents, e => { return e.id === event.id; }); + + this.event = {}; + }); + } + + removeEventFromTeam($event, event) { + $event.stopPropagation(); + + this.Event.removeTeam({ id: event.id, teamId: this.team.id }, event => { + this.teamEvents = _.reject(this.teamEvents, e => { return e.id === event.id; }); + this.nonTeamEvents.push(event); + }); + } + + deleteTeam() { + const modalInstance = this.$uibModal.open({ + resolve: { + team: () => { + return this.team; + } + }, + component: "adminTeamDelete" + }); + + modalInstance.result.then(() => { + this.$state.go('admin.teams'); + }); + } +} + +AdminTeamController.$inject = ['$uibModal', '$filter', '$state', '$stateParams', 'Team', 'Event', 'UserService']; + +export default { + template: require('./team.html'), + controller: AdminTeamController +}; \ No newline at end of file diff --git a/web-app/admin/src/ng1/admin/teams/team.delete.component.js b/web-app/admin/src/ng1/admin/teams/team.delete.component.js new file mode 100644 index 000000000..572d5fca3 --- /dev/null +++ b/web-app/admin/src/ng1/admin/teams/team.delete.component.js @@ -0,0 +1,65 @@ +import _ from 'underscore'; + +class AdminTeamDeleteController { + constructor($q, UserService) { + this.$q = $q; + this.UserService = UserService; + + this.confirm = {}; + } + + $onInit() { + this.team = this.resolve.team; + } + + deleteTeam(team) { + this.deleting = true; + + var users = team.users; + team.$delete(() => { + if (this.deleteAllUsers && (this.confirm.text === team.name)) { + this.deleteUsers(users); + } else { + this.modalInstance.close(team); + } + }); + } + + cancel() { + this.modalInstance.dismiss('cancel'); + } + + deleteUsers(users) { + var promises = []; + _.each(users, user => { + promises.push(this.deleteUser(user)); + }); + + this.$q.all(promises).then(() => { + this.modalInstance.close(this.team); + }); + } + + deleteUser(user) { + var deferred = this.$q.defer(); + + this.UserService.deleteUser(user).then(() => { + deferred.resolve(); + }, function() { + deferred.resolve(); + }); + + return deferred.promise; + } +} + +AdminTeamDeleteController.$inject = ['$q', 'UserService']; + +export default { + template: require('./team.delete.html'), + bindings: { + resolve: '<', + modalInstance: '<' + }, + controller: AdminTeamDeleteController +}; diff --git a/web-app/admin/src/ng1/admin/teams/team.delete.html b/web-app/admin/src/ng1/admin/teams/team.delete.html new file mode 100644 index 000000000..9288fdbae --- /dev/null +++ b/web-app/admin/src/ng1/admin/teams/team.delete.html @@ -0,0 +1,35 @@ + + + + + diff --git a/web-app/admin/src/ng1/admin/teams/team.edit.component.js b/web-app/admin/src/ng1/admin/teams/team.edit.component.js new file mode 100644 index 000000000..c7933152d --- /dev/null +++ b/web-app/admin/src/ng1/admin/teams/team.edit.component.js @@ -0,0 +1,38 @@ +class AdminTeamEditController { + constructor($state, $stateParams, Team) { + this.$state = $state; + this.$stateParams = $stateParams; + this.Team = Team; + } + + $onInit() { + if (this.$stateParams.teamId) { + this.Team.get({id: this.$stateParams.teamId}, team => { + this.team = team; + }); + } else { + this.team = new this.Team(); + } + } + + saveTeam(team) { + this.team.$save(() => { + this.$state.go('admin.team', { teamId: team.id }); + }); + } + + cancel() { + if (this.team.id) { + this.$state.go('admin.team', { teamId: this.team.id }); + } else { + this.$state.go('admin.teams'); + } + } +} + +AdminTeamEditController.$inject = ['$state', '$stateParams', 'Team']; + +export default { + template: require('./team.edit.html'), + controller: AdminTeamEditController +}; \ No newline at end of file diff --git a/web-app/admin/src/ng1/admin/teams/team.edit.html b/web-app/admin/src/ng1/admin/teams/team.edit.html new file mode 100644 index 000000000..18cb0837c --- /dev/null +++ b/web-app/admin/src/ng1/admin/teams/team.edit.html @@ -0,0 +1,46 @@ +
    +
    + + +
    +
    + +
    +
    +
    +

    Edit team: {{$ctrl.team.name}}

    +

    New team

    +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    + + +
    +
    + + + Cancel + Save + + +
    +
    +
    + diff --git a/web-app/admin/src/ng1/admin/teams/team.html b/web-app/admin/src/ng1/admin/teams/team.html new file mode 100644 index 000000000..22f77d017 --- /dev/null +++ b/web-app/admin/src/ng1/admin/teams/team.html @@ -0,0 +1,314 @@ +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +

    Team: {{$ctrl.team.name}}

    +
    +
    +

    + + +

    +
    +
    + +
    + +
    +
    + +
    +
    + Name:  +
    +
    + {{$ctrl.team.name}} +
    +
    + +
    +
    + Description:  +
    +
    + {{$ctrl.team.description}} +
    +
    +
    + +
    +
    +
    + Delete Team +

    Deleting a team will remove all team information. This cannot be undone, and + all team data will be unrecoverable. Users within the team will not be deleted.

    + +
    +
    +
    + +
    + +
    + +
    +
    + +
    +
    + +
    + +
    +
    +
    +
    +
    +
    + +
    +
    + {{user.displayName}} + ({{user.username}}) +
    +
    {{user.email}}
    +
    + Add Member +
    +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    Loading
    +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + {{user.displayName}} + ({{user.username}}) +
    +
    {{user.email}}
    +
    + Remove Member +
    +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    Loading
    +
    + +
    +
    +
    +
    + +
    +
    + +
    + +
    +
    +
    +
    +
    +
    + +
    +
    + {{event.name}} +
    +
    {{event.description}}
    +
    + Add Event +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    + +
    + +
    + +
    +
    +
    +
    +
    +
    + +
    +
    + {{event.name}} +
    +
    {{event.description}}
    +
    + Remove Event +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/web-app/admin/src/ng1/admin/teams/teams.component.js b/web-app/admin/src/ng1/admin/teams/teams.component.js new file mode 100644 index 000000000..71f76909a --- /dev/null +++ b/web-app/admin/src/ng1/admin/teams/teams.component.js @@ -0,0 +1,122 @@ +import _ from 'underscore'; + +class AdminTeamsController { + constructor($state, $uibModal, $filter, Team, UserService, TeamPagingService) { + this.$state = $state; + this.$uibModal = $uibModal; + this.$filter = $filter; + this.Team = Team; + this.UserService = UserService; + this.TeamPagingService = TeamPagingService; + + this.filter = 'all'; + this.teamSearch = ''; + this.teams = []; + this.stateAndData = this.TeamPagingService.constructDefault(); + } + + $onInit() { + this.TeamPagingService.refresh(this.stateAndData).then(() => { + this.teams = this.TeamPagingService.teams(this.stateAndData[this.filter]); + }); + } + + count(state) { + return this.stateAndData[state].teamCount; + } + + hasNext() { + return this.TeamPagingService.hasNext(this.stateAndData[this.filter]); + } + + next() { + if (this.hasNext()) { + this.TeamPagingService.next(this.stateAndData[this.filter]).then(teams => { + this.teams = teams; + }); + } + } + + hasPrevious() { + return this.TeamPagingService.hasPrevious(this.stateAndData[this.filter]); + } + + previous() { + if (this.hasPrevious()) { + this.TeamPagingService.previous(this.stateAndData[this.filter]).then(teams => { + this.teams = teams; + }); + } + } + + search() { + this.TeamPagingService.search(this.stateAndData[this.filter], this.teamSearch).then(teams => { + this.teams = teams; + }); + } + + reset() { + this.teamSearch = ''; + this.stateAndData = this.TeamPagingService.constructDefault(); + this.TeamPagingService.refresh(this.stateAndData).then(() => { + this.teams = this.TeamPagingService.teams(this.stateAndData[this.filter]); + }); + } + + newTeam() { + this.$state.go('admin.createTeam'); + } + + gotoTeam(team) { + this.$state.go('admin.team', { teamId: team.id }); + } + + editTeam($event, team) { + $event.stopPropagation(); + this.$state.go('admin.editTeam', { teamId: team.id }); + } + + hasPermission(team, permission) { + var myAccess = team.acl[this.UserService.myself.id]; + var aclPermissions = myAccess ? myAccess.permissions : []; + + switch (permission) { + case 'update': + return _.contains(this.UserService.myself.role.permissions, 'UPDATE_TEAM') || _.contains(aclPermissions, 'update'); + case 'delete': + return _.contains(this.UserService.myself.role.permissions, 'DELETE_TEAM') || _.contains(aclPermissions, 'delete'); + } + } + + hasUpdatePermission(team) { + return this.hasPermission(team, 'update'); + } + + hasDeletePermission(team) { + return this.hasPermission(team, 'delete'); + } + + deleteTeam($event, team) { + $event.stopPropagation(); + + var modalInstance = this.$uibModal.open({ + resolve: { + team: () => { + return team; + } + }, + component: 'adminTeamDelete' + }); + + modalInstance.result.then(team => { + this.teams = _.reject(this.teams, t => { return t.id === team.id; }); + }); + } +} + +AdminTeamsController.$inject = ['$state', '$uibModal', '$filter', 'Team', 'UserService', 'TeamPagingService']; + +export default { + template: require('./teams.html'), + controller: AdminTeamsController +}; diff --git a/web-app/admin/src/ng1/admin/teams/teams.html b/web-app/admin/src/ng1/admin/teams/teams.html new file mode 100644 index 000000000..76a7fcde4 --- /dev/null +++ b/web-app/admin/src/ng1/admin/teams/teams.html @@ -0,0 +1,75 @@ +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + + +
    +
    +
    + + +
    + +
    + + +
    +
    +
    +
    + +
    +
    +
    + +
    +
    {{t.name}}
    +
    {{t.description}}
    +
    +
    + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    diff --git a/web-app/admin/src/ng1/admin/users/index.js b/web-app/admin/src/ng1/admin/users/index.js new file mode 100644 index 000000000..f98f62788 --- /dev/null +++ b/web-app/admin/src/ng1/admin/users/index.js @@ -0,0 +1,15 @@ +import angular from 'angular'; +import adminUser from './user.component'; +import adminUsers from './users.component'; +import adminUserEdit from './user.edit.component'; +import adminUserBulk from './user.bulk.component'; +import adminUserDelete from './user.delete.component'; +import mapIcon from './map.icon.component'; + +angular.module('mage') + .component('adminUser', adminUser) + .component('adminUsers', adminUsers) + .component('adminUserEdit', adminUserEdit) + .component('adminUserBulk', adminUserBulk) + .component('adminUserDelete', adminUserDelete) + .component('mapIcon', mapIcon); diff --git a/web-app/admin/src/ng1/admin/users/map.icon.component.js b/web-app/admin/src/ng1/admin/users/map.icon.component.js new file mode 100644 index 000000000..a26cbbd78 --- /dev/null +++ b/web-app/admin/src/ng1/admin/users/map.icon.component.js @@ -0,0 +1,53 @@ +import angular from 'angular'; +import WebFont from 'webfontloader'; + +class MapIconController { + constructor($element, UserIconService) { + this.$element = $element; + this.UserIconService = UserIconService; + } + + $onInit() { + this.fontLoaded = false; + + WebFont.load({ + custom: { + families: ['RobotoMono'] + }, + fontactive: () => { + this.fontLoaded = true; + this.updateIcon(); + } + }); + + this.previousIcon = angular.copy(this.icon); + } + + $doCheck() { + if (!this.fontLoaded) return; + + if (!angular.equals(this.icon, this.previousIcon)) { + this.updateIcon(); + this.previousIcon = angular.copy(this.icon); + } + } + + updateIcon() { + var canvas = this.$element.find('canvas')[0]; + this.UserIconService.drawMarker(canvas, this.icon.color, this.icon.text); + + this.icon.getCanvas = function() { + return canvas; + }; + } +} + +MapIconController.$inject = ['$element', 'UserIconService']; + +export default { + template: '', + bindings: { + icon: '<' + }, + controller: MapIconController +}; diff --git a/web-app/admin/src/ng1/admin/users/user.bulk.component.js b/web-app/admin/src/ng1/admin/users/user.bulk.component.js new file mode 100644 index 000000000..c4ef76ace --- /dev/null +++ b/web-app/admin/src/ng1/admin/users/user.bulk.component.js @@ -0,0 +1,263 @@ +import _ from 'underscore'; +import Papa from 'papaparse'; + +class AdminUserBulkController { + constructor($q, $timeout, $element, LocalStorageService, UserService, Team, UserIconService) { + this.$q = $q; + this.$element = $element; + this.$timeout = $timeout; + this.UserService = UserService; + this.UserIconService = UserIconService; + this.Team = Team; + + this.token = LocalStorageService.getToken(); + + this.requiredFields = ['username', 'displayname', 'password']; + + this.columnOptions = [{ + value: 'username', + title: 'Username' + },{ + value: 'displayname', + title: 'Display Name' + },{ + value: 'email', + title: 'Email' + },{ + value: 'phone', + title: 'Phone Number' + },{ + value: 'password', + title: 'Password' + },{ + value: 'iconInitials', + title: 'Icon Initials' + },{ + value: 'iconolor', + title: 'Icon Color' + }]; + + this.team = { selected: null }; + this.role = { selected: null }; + + this.edit = {}; + this.columnMap = {}; + this.unmappedFields = []; + this.someError = {}; + } + + $postLink() { + this.$element.find(':file').bind('change', function() { + this.importFile(); + }.bind(this)); + } + + $onInit() { + this.UserService.getRoles().then(roles => { + this.roles = roles; + }); + + this.Team.query(teams => { + this.teams = _.reject(teams, team => { return team.teamEventId; }); + }); + } + + teamSelected(team) { + this.team.selected = team; + } + + roleSelected(role) { + this.role.selected = role; + } + + teamSelectedForUser(team, user) { + user.team.selected = team; + } + + roleSelectedForUser(role, user) { + user.role.selected = role; + } + + importFile() { + Papa.parse(event.target.files[0], { + complete: results => { + this.$timeout(() => { + this.columns = results.data[0]; + this.users = results.data.slice(1); + _.each(this.users, user => { + user.team = { + selected: this.team.selected + }; + user.role = { + selected: this.role.selected + }; + }); + + this.mapColumns(this.columns); + }); + } + }); + } + + onStatusClosed() { + this.importStatus = null; + } + + onColumnOption($event, $index) { + this.mapColumn($event.option.value, $index); + this.validateMapping(); + } + + selected($index) { + for (let [key, value] of Object.entries(this.columnMap)) { + if (value === $index) return key; + } + } + + import() { + this.imported = true; + this.importUsers(this.users); + } + + importUsers(users) { + this.importing = true; + this.edit.row = null; + this.asyncSeries(users).then(() => { + this.importing = false; + + this.users = this.users.filter(user => { + return user.result.status !== 200; + }); + + if (this.users.length) { + this.importStatus = { + message: `${this.users.length} users failed to import, please fix errors and try again.`, + dismiss: true + }; + } else { + this.importStatus = { + message: `All users successfully imported.`, + dismiss: true + }; + + this.columns = null; + this.team = { selected: null }; + this.role = { selected: null }; + } + }); + } + + importUser(row) { + var deferred = this.$q.defer(); + + var user = { + username: row[this.columnMap.username], + displayName: row[this.columnMap.displayname], + email: row[this.columnMap.email], + phone: row[this.columnMap.phone], + password: row[this.columnMap.password], + passwordconfirm: row[this.columnMap.password], + iconInitials: row[this.columnMap.iconInitials], + iconColor: row[this.columnMap.iconColor], + roleId: row.role.selected.id + }; + + var canvas = document.createElement("canvas"); + canvas.height = 44; + canvas.width = 44; + + if (user.iconInitials && user.iconColor && canvas.getContext) { + var iconColor = user.iconColor; + var iconInitials = user.iconInitials.substring(0, 2); + this.UserIconService.drawMarker(canvas, iconColor, iconInitials); + user.icon = this.UserIconService.canvasToPng(canvas); + user.iconMetadata = JSON.stringify({ + type: 'create', + text: iconInitials, + color: iconColor + }); + } + + this.UserService.createUser(user, newUser => { + this.Team.addUser({id: row.team.selected.id}, newUser, () => { + row.result = { + status: 200 + }; + + deferred.resolve(); + }, response => { + row.result = { + status: response.status, + message: `Could not create user, ${response.responseText}` + }; + + deferred.resolve(); + }); + }, result => { + row.result = { + status: result.status, + message: `Could not create user, ${result.responseText}` + }; + deferred.resolve(); + }); + + return deferred.promise; + } + + asyncSeries(users) { + return users.reduce((promise, user) => { + return promise.then(() => { + return this.importUser(user); + }); + }, this.$q.when()); + } + + mapColumn(column, index) { + var mappedKey = _.findKey(this.columnMap, i => { + return index === i; + }); + + if (mappedKey) { + delete this.columnMap[mappedKey]; + } + + this.columnMap[column] = index; + } + + mapColumns(columnNames) { + var usernameIndex = _.indexOf(columnNames, 'username'); + if (usernameIndex !== -1) this.mapColumn('username', usernameIndex); + + var displayNameIndex = _.indexOf(columnNames, 'displayname'); + if (displayNameIndex !== -1) this.mapColumn('displayname', displayNameIndex); + + var emailIndex = _.indexOf(columnNames, 'email'); + if (emailIndex !== -1) this.mapColumn('email', emailIndex); + + var phoneIndex = _.indexOf(columnNames, 'phone'); + if (phoneIndex !== -1) this.mapColumn('phone', phoneIndex); + + var passwordIndex = _.indexOf(columnNames, 'password'); + if (passwordIndex !== -1) this.mapColumn('password', passwordIndex); + + var iconInitialsIndex = _.indexOf(columnNames, 'iconInitials'); + if (iconInitialsIndex !== -1) this.mapColumn('iconInitials', iconInitialsIndex); + + var iconColorIndex = _.indexOf(columnNames, 'iconColor'); + if (iconColorIndex !== -1) this.mapColumn('iconColor', iconColorIndex); + + this.validateMapping(); + } + + validateMapping () { + var fields = _.difference(this.requiredFields, _.intersection(_.allKeys(this.columnMap), this.requiredFields)); + this.unmappedFields = _.filter(this.columnOptions, field => { return fields.includes(field.value); }); + } +} + +AdminUserBulkController.$inject = ['$q', '$timeout', '$element', 'LocalStorageService', 'UserService', 'Team', 'UserIconService']; + +export default { + template: require('./user.bulk.html'), + controller: AdminUserBulkController +}; \ No newline at end of file diff --git a/web-app/admin/src/ng1/admin/users/user.bulk.html b/web-app/admin/src/ng1/admin/users/user.bulk.html new file mode 100644 index 000000000..13787f454 --- /dev/null +++ b/web-app/admin/src/ng1/admin/users/user.bulk.html @@ -0,0 +1,145 @@ +
    +
    + +
    +
    + +
    + +
    +
    +
    + +
    +
    + +
    + +
    + +
    + + + +
    +
    + +
    + +
    +
    + error + {{unmappedField.title}} is not mapped, please map the column that contains {{unmappedField.title}} in the table below. +
    +
    + +
    + + + +
    +
    +
    + {{$ctrl.users.length}} Users +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    TeamRole + +
    + + + + + + {{user.team.selected.name}} + + + {{user.role.selected.name}} + + + {{userColumn}} + +
    + +
    +
    +
    +
    +
    +
    + error + {{user.result.message}} +
    +
    + + +
    +
    + + \ No newline at end of file diff --git a/web-app/admin/src/ng1/admin/users/user.component.js b/web-app/admin/src/ng1/admin/users/user.component.js new file mode 100644 index 000000000..5d5f698e1 --- /dev/null +++ b/web-app/admin/src/ng1/admin/users/user.component.js @@ -0,0 +1,291 @@ +"use strict"; + +import _ from 'underscore'; +import moment from 'moment'; + + +const CURRENT_TEAMS_KEY = 'all' +const CANDIDATE_TEAMS_KEY = 'all.search' + +class AdminUserController { + constructor($uibModal, $state, $stateParams, $q, LocalStorageService, UserService, LoginService, DevicePagingService, Team, TeamPagingService) { + this.$q = $q; + this.$state = $state; + this.$uibModal = $uibModal; + this.$stateParams = $stateParams; + this.LocalStorageService = LocalStorageService; + this.UserService = UserService; + this.LoginService = LoginService; + this.DevicePagingService = DevicePagingService; + this.Team = Team; + this.TeamPagingService = TeamPagingService; + + this.userTeams = []; + this.team = {}; + + this.hasUserEditPermission = _.contains(UserService.myself.role.permissions, 'UPDATE_USER'); + this.hasUserDeletePermission = _.contains(UserService.myself.role.permissions, 'DELETE_USER'); + + this.filter = { + user: {id: $stateParams.userId} + }; + + this.login = { + startDateOpened: false, + endDateOpened: false + }; + this.firstLogin = null; + this.showPrevious = false; + this.showNext = true; + this.deviceStateAndData = this.DevicePagingService.constructDefault(); + this.deviceState = 'all'; + this.loginSearchResults = []; + this.isSearchingDevices = false; + this.device = null; + this.userTeamSearch = ''; + this.userTeamStateAndData = this.TeamPagingService.constructDefault(); + this.userTeamStateAndData[CANDIDATE_TEAMS_KEY] = this.TeamPagingService.constructDefault()[CURRENT_TEAMS_KEY]; + this.nonUserTeamSearch = ''; + this.nonUserTeam = null; + this.nonUserTeamSearchResults = []; + this.isSearching = false; + } + + $onInit() { + this.UserService.getUser(this.$stateParams.userId).then(user => { + this.user = user; + this.userTeamStateAndData[CURRENT_TEAMS_KEY].searchOptions.with_members = [ user.id ]; + this.userTeamStateAndData[CURRENT_TEAMS_KEY].searchOptions.omit_event_teams = false + this.userTeamStateAndData[CANDIDATE_TEAMS_KEY].searchOptions.without_members = [ user.id ]; + this.userTeamStateAndData[CANDIDATE_TEAMS_KEY].searchOptions.omit_event_teams = false + this.TeamPagingService.refresh(this.userTeamStateAndData).then(() => { + this.userTeams = this.TeamPagingService.teams(this.userTeamStateAndData[CURRENT_TEAMS_KEY]); + }); + }); + + this.LoginService.query({filter: this.filter, limit: this.loginResultsLimit}).then(loginPage => { + this.loginPage = loginPage; + if (loginPage.logins.length) { + this.firstLogin = loginPage.logins[0]; + } + }); + + delete this.deviceStateAndData['registered']; + delete this.deviceStateAndData['unregistered']; + + this.DevicePagingService.refresh(this.deviceStateAndData).then(() => { + this.devices = this.DevicePagingService.devices(this.deviceStateAndData[this.deviceState]); + }); + } + + hasNextUserTeam() { + return this.TeamPagingService.hasNext(this.userTeamStateAndData[CURRENT_TEAMS_KEY]); + } + + nextUserTeam() { + this.TeamPagingService.next(this.userTeamStateAndData[CURRENT_TEAMS_KEY]).then(teams => { + this.userTeams = teams; + }); + } + + hasPreviousUserTeam() { + return this.TeamPagingService.hasPrevious(this.userTeamStateAndData[CURRENT_TEAMS_KEY]); + } + + previousUserTeam() { + this.TeamPagingService.previous(this.userTeamStateAndData[CURRENT_TEAMS_KEY]).then(teams => { + this.userTeams = teams; + }); + } + + searchUserTeam() { + this.TeamPagingService.search(this.userTeamStateAndData[CURRENT_TEAMS_KEY], this.userTeamSearch).then(teams => { + this.userTeams = teams; + }); + } + + + searchNonUserTeams(searchString) { + this.isSearching = true; + + return this.TeamPagingService.search(this.userTeamStateAndData[CANDIDATE_TEAMS_KEY], searchString).then(teams => { + this.nonUserTeamSearchResults = teams; + + if(this.nonUserTeamSearchResults.length == 0) { + const noTeam = { + name: "No Results Found" + }; + this.nonUserTeamSearchResults.push(noTeam); + } + + this.isSearching = false; + + return this.nonUserTeamSearchResults; + }); + } + + iconClass(device) { + if (!device) return; + + if (device.iconClass) return device.iconClass; + + const userAgent = device.userAgent || ""; + + if (device.appVersion === 'Web Client') { + device.iconClass = 'fa-desktop admin-desktop-icon-xs'; + } else if (userAgent.toLowerCase().indexOf("android") !== -1) { + device.iconClass = 'fa-android admin-android-icon-xs'; + } else if(userAgent.toLowerCase().indexOf("ios") !== -1) { + device.iconClass = 'fa-apple admin-apple-icon-xs'; + } else { + device.iconClass = 'fa-mobile admin-generic-icon-xs'; + } + + return device.iconClass; + } + + editUser(user) { + this.$state.go('admin.editUser', { userId: user.id }); + } + + addUserToTeam() { + this.Team.addUser({id: this.nonUserTeam.id}, this.user, team => { + this.userTeams.push(team); + this.nonUserTeam = null; + }); + } + + removeUserFromTeam($event, team) { + $event.stopPropagation(); + + this.Team.removeUser({id: team.id, userId: this.user.id}, team => { + this.userTeams = _.reject(this.userTeams, t => { return t.id === team.id; }); + }); + } + + deleteUser(user) { + const modalInstance = this.$uibModal.open({ + resolve: { + user: () => { + return user; + } + }, + component: "adminUserDelete" + }); + + modalInstance.result.then(() => { + this.$state.go('admin.users'); + }); + } + + activateUser(user) { + user.active = true; + this.UserService.updateUser(user.id, user, () => { + this.onUserActivated({ + $event: { + user: user + } + }); + }); + } + + enableUser(user) { + user.enabled = true; + this.UserService.updateUser(user.id, user, () => {}); + } + + disableUser(user) { + user.enabled = false; + this.UserService.updateUser(user.id, user, () => {}); + } + + gotoTeam(team) { + if (team.teamEventId) { + this.$state.go('admin.event', { eventId: team.teamEventId }); + } else { + this.$state.go('admin.team', { teamId: team.id }); + } + } + + gotoDevice(device) { + this.$state.go('admin.device', { deviceId: device.id }); + } + + pageLogin(url) { + this.LoginService.query({url: url, filter: this.filter, limit: this.loginResultsLimit}).then(loginPage => { + if (loginPage.logins.length) { + this.loginPage = loginPage; + this.showNext = loginPage.logins.length !== 0; + this.showPrevious = loginPage.logins[0].id !== this.firstLogin.id; + } + }); + } + + searchLogins(searchString) { + this.isSearchingDevices = true; + + if (searchString == null) { + searchString = '.*'; + } + + return this.DevicePagingService.search(this.deviceStateAndData[this.deviceState], searchString).then(devices => { + this.loginSearchResults = devices; + this.isSearchingDevices = false; + + if(this.loginSearchResults.length == 0){ + const noDevice = { + userAgent: "No Results Found" + }; + this.loginSearchResults.push(noDevice); + } + + return this.loginSearchResults; + }); + } + + filterLogins() { + this.filter.device = this.device; + this.filter.startDate = this.login.startDate; + if (this.login.endDate) { + this.endDate = moment(this.login.endDate).endOf('day').toDate(); + } + + this.LoginService.query({filter: this.filter, limit: this.loginResultsLimit}).then(loginPage => { + this.showNext = loginPage.logins.length !== 0; + this.showPrevious = false; + this.loginPage = loginPage; + }); + } + + openLoginStart($event) { + $event.preventDefault(); + $event.stopPropagation(); + + this.login.startDateOpened = true; + } + + openLoginEnd($event) { + $event.preventDefault(); + $event.stopPropagation(); + + this.login.endDateOpened = true; + } + + loginResultsLimitChanged() { + this.filterLogins(); + } + + dateFilterChanged() { + this.filterLogins(); + } +} + +AdminUserController.$inject = ['$uibModal', '$state', '$stateParams', '$q', 'LocalStorageService', 'UserService', 'LoginService', 'DevicePagingService', 'Team', 'TeamPagingService']; + +export default { + template: require('./user.html'), + bindings: { + onUserActivated: '&' + }, + controller: AdminUserController +}; \ No newline at end of file diff --git a/web-app/admin/src/ng1/admin/users/user.delete.component.js b/web-app/admin/src/ng1/admin/users/user.delete.component.js new file mode 100644 index 000000000..95d4928f2 --- /dev/null +++ b/web-app/admin/src/ng1/admin/users/user.delete.component.js @@ -0,0 +1,30 @@ +class AdminUserDeleteController { + constructor(UserService) { + this.UserService = UserService; + } + + $onInit() { + this.user = this.resolve.user; + } + + deleteUser(user) { + this.UserService.deleteUser(user).then(() => { + this.modalInstance.close(user); + }); + } + + cancel() { + this.modalInstance.dismiss('cancel'); + } +} + +AdminUserDeleteController.$inject = ['UserService']; + +export default { + template: require('./user.delete.html'), + bindings: { + resolve: '<', + modalInstance: '<' + }, + controller: AdminUserDeleteController +}; \ No newline at end of file diff --git a/web-app/admin/src/ng1/admin/users/user.delete.html b/web-app/admin/src/ng1/admin/users/user.delete.html new file mode 100644 index 000000000..7579f7def --- /dev/null +++ b/web-app/admin/src/ng1/admin/users/user.delete.html @@ -0,0 +1,25 @@ + + + + + diff --git a/web-app/admin/src/ng1/admin/users/user.edit.component.js b/web-app/admin/src/ng1/admin/users/user.edit.component.js new file mode 100644 index 000000000..df386c74c --- /dev/null +++ b/web-app/admin/src/ng1/admin/users/user.edit.component.js @@ -0,0 +1,254 @@ +import _ from 'underscore'; +import angular from 'angular'; +import zxcvbn from 'zxcvbn'; + +class AdminUserEditController { + constructor($q, $state, $stateParams, $timeout, Api, LocalStorageService, UserService, UserIconService) { + this.$q = $q; + this.$state = $state; + this.$stateParams = $stateParams; + this.$timeout = $timeout; + this.Api = Api; + this.LocalStorageService = LocalStorageService; + this.UserService = UserService; + this.UserIconService = UserIconService; + + this.token = LocalStorageService.getToken(); + this.roles = []; + this.canEditRole = _.contains(UserService.myself.role.permissions, 'UPDATE_USER_ROLE'); + this.canUpdatePassword = _.contains(UserService.myself.role.permissions, 'UPDATE_USER_ROLE'); + + this.passwordStrengthScore = 0; + this.passwordStrengthMap = { + 0: { + type: 'danger', + text: 'Weak' + }, + 1: { + type: 'warning', + text: 'Fair' + }, + 2: { + type: 'info', + text: 'Good' + }, + 3: { + type: 'primary', + text: 'Strong' + }, + 4: { + type: 'success', + text: 'Excellent' + } + }; + this.passwordStatus = { + status: null, + msg: null + }; + } + + $onInit() { + + this.UserService.getRoles().then(roles => { + this.roles = roles; + }); + + if (this.$stateParams.userId) { + this.UserService.getUser(this.$stateParams.userId).then(user => { + this.user = angular.copy(user); + + this.iconMetadata = { + type: this.user.icon.type, + text: this.user.icon.text, + color: this.user.icon.color + }; + }); + } else { + this.user = {}; + this.iconMetadata = { + type: 'none' + }; + } + } + + cancel() { + if (this.user.id) { + this.$state.go('admin.user', { userId: this.user.id }); + } else { + this.$state.go('admin.users'); + } + } + + saveUser() { + this.saving = true; + this.error = false; + + if (this.iconMetadata.type === 'create') { + const canvas = this.iconMetadata.getCanvas(); + this.user.icon = this.UserIconService.canvasToPng(canvas); + } + + const user = { + username: this.user.username, + displayName: this.user.displayName, + email: this.user.email, + password: this.user.password, + passwordconfirm: this.user.passwordconfirm, + avatar: this.user.avatar, + icon: this.user.icon, + iconMetadata: JSON.stringify(this.iconMetadata) + }; + + if (this.user.phones && this.user.phones.length) { + user.phone = this.user.phones[0].number; + } + + if (this.user.role) { + user.roleId = this.user.role.id; + } + + const failure = response => { + this.$timeout(() => { + this.saving = false; + this.error = response.responseText; + }); + }; + + const progress = e => { + if (e.lengthComputable) { + this.$timeout(() => { + this.uploading = true; + this.uploadProgress = (e.loaded / e.total) * 100; + }); + } + }; + + if (this.user.id) { + this.UserService.updateUser(this.user.id, user, () => { + this.$state.go('admin.user', { userId: this.user.id }); + }, failure, progress); + } else { + this.UserService.createUser(user, newUser => { + this.$state.go('admin.user', { userId: newUser.id }); + }, failure, progress); + } + } + + avatarChanged($event) { + const avatar = $event.avatar; + if (!avatar) { + this.user.avatarData = null; + this.user.avatar = null; + + return; + } + + this.user.avatar = avatar; + + if (window.FileReader) { + const reader = new FileReader(); + reader.onload = (() => { + return (e) => { + this.$timeout(() => { + this.user.avatarData = e.target.result; + }); + }; + })(avatar); + + reader.readAsDataURL(avatar); + } + } + + iconChanged($event) { + const icon = $event.icon; + this.user.icon = icon; + + if (window.FileReader) { + const reader = new FileReader(); + reader.onload = (() => { + return e => { + this.$timeout(() => { + this.user.iconData = e.target.result; + }); + }; + })(icon); + + reader.readAsDataURL(icon); + } + } + + iconTypeChanged(icon) { + if (icon.type === 'create') { + this.setIconInitials(this.user.displayName, icon); + this.setIconColor(icon); + } else if (icon.type === 'upload') { + if (this.user.icon && this.user.icon.type !== 'upload') { + this.user.iconUrl = null; + } + } else { + this.user.icon = null; + this.user.iconUrl = null; + this.iconMetadata = { + type: 'none' + }; + } + } + + setIconInitials(name, icon) { + if (icon.text) return; + + const initials = name.match(/\b\w/g) || []; + icon.text = ((initials.shift() || '') + (initials.pop() || '')).toUpperCase(); + } + + setIconColor(icon) { + if (icon.color) return; + + icon.color = '#' + Math.floor(Math.random() * 16777215).toString(16); + } + + passwordChanged(password) { + if (password && password.length > 0) { + const score = password && password.length ? zxcvbn(password, [this.user.username, this.user.displayName, this.user.email]).score : 0; + this.passwordStrengthScore = score + 1; + this.passwordStrengthType = this.passwordStrengthMap[score].type; + this.passwordStrength = this.passwordStrengthMap[score].text; + } else { + this.passwordStrengthScore = 0; + this.passwordStrengthType = null; + this.passwordStrength = null; + } + } + + updatePassword(form) { + form.passwordconfirm.$setValidity("nomatch", this.user.password === this.user.passwordconfirm); + + if (!form.$valid) return; + + const authentication = { + password: this.user.password, + passwordconfirm: this.user.passwordconfirm + }; + + this.UserService.updatePassword(this.user.id, authentication).then(() => { + this.passwordStrengthScore = 0; + this.passwordStrengthType = null; + this.passwordStrength = null; + this.user.password = ""; + this.user.passwordconfirm = ""; + form.$setPristine(true); + this.passwordStatus.status = 'success'; + this.passwordStatus.msg = "Password successfully updated."; + }, response => { + this.passwordStatus.status = "danger"; + this.passwordStatus.msg = response.data; + }); + } +} + +AdminUserEditController.$inject = ['$q', '$state', '$stateParams', '$timeout', 'Api', 'LocalStorageService', 'UserService', 'UserIconService']; + +export default { + template: require('./user.edit.html'), + controller: AdminUserEditController +}; \ No newline at end of file diff --git a/web-app/admin/src/ng1/admin/users/user.edit.html b/web-app/admin/src/ng1/admin/users/user.edit.html new file mode 100644 index 000000000..eb77a0d8d --- /dev/null +++ b/web-app/admin/src/ng1/admin/users/user.edit.html @@ -0,0 +1,214 @@ +
    +
    + + +
    +
    + +
    +
    +
    +
    +
    + +

    {{$ctrl.user.displayName}}

    +

    New user

    +
    + +
    +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + + {{$ctrl.passwordStatus.msg}} +
    +
    + +
    + +
    + + {{$ctrl.passwordStatus.msg}} +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    + + Cancel + + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    +
    Update Password
    +
    Reset users password
    +
    +
    + +
    +
    + +
    +
    +
    + +
    + +
    + +
    +
    Password is required
    +
    +
    +
    + +
    + +
    + +
    +
    New password confirmation is required
    +
    Passwords do not match
    +
    +
    +
    + +
    +
    +
    Password Strength: {{$ctrl.passwordStrength}}
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +

    {{$ctrl.passwordStatus.msg}}

    +

    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +

    Error Saving User

    + {{$ctrl.error}} +
    +
    +
    +
    diff --git a/web-app/admin/src/ng1/admin/users/user.html b/web-app/admin/src/ng1/admin/users/user.html new file mode 100644 index 000000000..dedd68460 --- /dev/null +++ b/web-app/admin/src/ng1/admin/users/user.html @@ -0,0 +1,350 @@ +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +

    User: {{$ctrl.user.displayName}}

    +
    +
    +

    + +

    +
    +
    +
    + +
    +
    + +
    + +
    + Avatar:  +
    + +
    + +
    +
    + +
    +
    + Map Icon:  +
    +
    +
    +
    +
    + +
    +
    + Username:  +
    +
    + {{$ctrl.user.username}} +
    +
    + +
    +
    + Display Name:  +
    +
    + {{$ctrl.user.displayName}} +
    +
    + +
    +
    + Email:  +
    +
    + {{$ctrl.user.email}} +
    +
    + +
    +
    + Phone:  +
    +
    + {{$ctrl.user.phones[0].number}} +
    +
    + +
    +
    + Role:  +
    +
    + {{$ctrl.user.role.name}} +
    +
    + +
    +
    + Auth:  +
    +
    + {{$ctrl.user.authentication.authenticationConfiguration.title}} +
    +
    + Authentication strategy no longer exists +
    +
    + +
    + +
    +
    +
    + Activate New User Account +

    This is a new user account. Activate the account to allow user to access MAGE.

    + +
    +
    + +
    +
    + User Account Disabled +

    This account is disabled. Enable the account to allow user to access MAGE. Accounts can be disabled manually by an administrator, or for security reasons, such as too many invalid login attempts.

    + +
    +
    + +
    +
    + Disable User Account +

    Disabling will prevent the account user from accessing MAGE. MAGE will retain all account information and you can enable the account again at any time.

    + +
    +
    + +
    +
    + Delete User Account +

    Deleting the account will remove all associated user information including location data. This cannot be undone, and the user's data will be unrecoverable.

    + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    +
    + + + +
    +
    +
    +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    + {{team.name}} + + + + +
    +
    +
    +
    + {{team.description}} +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    + {{login.user.displayName}} + {{login.device.uid}} +
    +
    +
    +
    +
    + +
    + {{login.timestamp | moment:'fromNow'}} ({{login.timestamp | moment:'MMM D YYYY hh:mm:ss A'}}) +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    diff --git a/web-app/admin/src/ng1/admin/users/users.component.js b/web-app/admin/src/ng1/admin/users/users.component.js new file mode 100644 index 000000000..eba935dbd --- /dev/null +++ b/web-app/admin/src/ng1/admin/users/users.component.js @@ -0,0 +1,185 @@ +import _ from 'underscore'; + +class AdminUsersController { + constructor( + $uibModal, + $state, + $timeout, + LocalStorageService, + UserService, + UserPagingService + ) { + this.$uibModal = $uibModal; + this.$state = $state; + this.$timeout = $timeout; + this.LocalStorageService = LocalStorageService; + this.UserService = UserService; + this.UserPagingService = UserPagingService; + this.users = []; + this.stateAndData = this.UserPagingService.constructDefault(); + + this.token = LocalStorageService.getToken(); + this.filter = 'all'; // possible values all, active, inactive + this.userSearch = ''; + + this.hasUserCreatePermission = _.contains( + UserService.myself.role.permissions, + 'CREATE_USER' + ); + this.hasUserEditPermission = _.contains( + UserService.myself.role.permissions, + 'UPDATE_USER' + ); + this.hasUserDeletePermission = _.contains( + UserService.myself.role.permissions, + 'DELETE_USER' + ); + } + + $onInit() { + this.UserPagingService.refresh(this.stateAndData).then(() => { + this.users = this.UserPagingService.users(this.stateAndData[this.filter]); + }); + } + + count(state) { + return this.stateAndData[state].userCount; + } + + hasNext() { + return this.UserPagingService.hasNext(this.stateAndData[this.filter]); + } + + next() { + this.UserPagingService.next(this.stateAndData[this.filter]).then( + (users) => { + this.users = users; + } + ); + } + + hasPrevious() { + return this.UserPagingService.hasPrevious(this.stateAndData[this.filter]); + } + + previous() { + this.UserPagingService.previous(this.stateAndData[this.filter]).then( + (users) => { + this.users = users; + } + ); + } + + search() { + this.UserPagingService.search( + this.stateAndData[this.filter], + this.userSearch + ).then((users) => { + this.users = users; + }); + } + + changeFilter(state) { + this.filter = state; + this.search(); + } + + reset() { + this.filter = 'all'; + this.userSearch = ''; + + this.stateAndData = this.UserPagingService.constructDefault(); + this.UserPagingService.refresh(this.stateAndData).then(() => { + this.users = this.UserPagingService.users(this.stateAndData[this.filter]); + }); + } + + newUser() { + this.$state.go('admin.createUser'); + } + + bulkImport() { + this.$state.go('admin.bulkUser'); + } + + gotoUser(user) { + this.$state.go('admin.user', { userId: user.id }); + } + + editUser($event, user) { + $event.stopPropagation(); + this.$state.go('admin.editUser', { userId: user.id }); + } + + deleteUser($event, user) { + $event.stopPropagation(); + + var modalInstance = this.$uibModal.open({ + resolve: { + user: () => { + return user; + } + }, + component: 'adminUserDelete' + }); + + modalInstance.result.then(() => { + this.UserPagingService.refresh(this.stateAndData).then(() => { + this.users = this.UserPagingService.users( + this.stateAndData[this.filter] + ); + }); + }); + } + + activateUser($event, user) { + $event.stopPropagation(); + + user.active = true; + this.UserService.updateUser( + user.id, + user, + () => { + this.UserPagingService.refresh(this.stateAndData).then(() => { + this.users = this.UserPagingService.users( + this.stateAndData[this.filter] + ); + }); + + this.onUserActivated({ + $event: { + user: user + } + }); + }, + (response) => { + this.$timeout(() => { + this.error = response.responseText; + }); + } + ); + } + + enableUser($event, user) { + $event.stopPropagation(); + + user.enabled = true; + this.UserService.updateUser(user.id, user, () => { + this.UserPagingService.refresh(this.stateAndData).then(() => { + this.users = this.UserPagingService.users( + this.stateAndData[this.filter] + ); + }); + }); + } +} + +AdminUsersController.$inject = ['$uibModal', '$state', '$timeout', 'LocalStorageService', 'UserService', 'UserPagingService']; + +export default { + template: require('./users.html'), + bindings: { + onUserActivated: '&' + }, + controller: AdminUsersController +}; diff --git a/web-app/admin/src/ng1/admin/users/users.html b/web-app/admin/src/ng1/admin/users/users.html new file mode 100644 index 000000000..3c686ff03 --- /dev/null +++ b/web-app/admin/src/ng1/admin/users/users.html @@ -0,0 +1,176 @@ +
    +
    + +
    +
    + +
    +
    + + +
    + + +
    +
    +
    +
    +
    +
    + +
    {{u.displayName}}
    +
    {{u.email}}
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    diff --git a/web-app/admin/src/ng1/app.js b/web-app/admin/src/ng1/app.js index 06d8718d8..ffb9f1663 100644 --- a/web-app/admin/src/ng1/app.js +++ b/web-app/admin/src/ng1/app.js @@ -2,16 +2,13 @@ import _ from 'underscore'; import angular from 'angular'; import fileUpload from './file-upload/file.upload.component'; import fileBrowser from './file-upload/file.browser.component'; -import uiRouter from '@uirouter/angularjs'; -import { - downgradeComponent, - downgradeInjectable -} from '@angular/upgrade/static'; +import uiRouter from "@uirouter/angularjs"; +import { downgradeComponent, downgradeInjectable } from '@angular/upgrade/static'; -import { BootstrapComponent } from '../app/bootstrap/bootstrap.component'; +import { BootstrapComponent } from "../app/bootstrap/bootstrap.component" -import { FeedService } from '@ngageoint/mage.web-core-lib/feed'; -import { PluginService } from '../app/plugin/plugin.service'; +import { FeedService } from '@ngageoint/mage.web-core-lib/feed' +import { PluginService } from '../app/plugin/plugin.service' import { UserAvatarComponent } from '../app/user/user-avatar/user-avatar.component'; import { UserReadService } from '@ngageoint/mage.web-core-lib/user'; @@ -22,19 +19,11 @@ import { AdminSettingsComponent } from '../app/admin/admin-settings/admin-settin import { AdminAuthenticationComponent } from '../app/admin/admin-authentication/admin-authentication.component'; import { AdminMapComponent } from '../app/admin/admin-map/admin-map.component'; import { AdminFeedsComponent } from '../app/admin/admin-feeds/admin-feeds.component'; -import { AdminDashboardComponent } from '../app/admin/admin-dashboard/admin-dashboard'; import { AdminFeedComponent } from '../app/admin/admin-feeds/admin-feed/admin-feed.component'; -import { AdminServiceComponent } from '../app/admin/admin-feeds/admin-service/admin-service.component'; +import { AdminServiceComponent } from '../app/admin/admin-feeds/admin-service/admin-service.component' import { AdminFeedEditComponent } from '../app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit.component'; import { AuthenticationCreateComponent } from '../app/admin/admin-authentication/admin-authentication-create/admin-authentication-create.component'; import { AdminEventFormPreviewComponent } from '../app/admin/admin-event/admin-event-form/admin-event-form-preview/admin-event-form-preview.component'; -import { TeamDashboardComponent } from '../app/admin/admin-teams/dashboard/team-dashboard.component'; -import { TeamDetailsComponent } from '../app/admin/admin-teams/team-details/team-details.component'; -import { EventDetailsComponent } from '../app/admin/admin-event/event-details/event-details.component'; -import { UserDetailsComponent } from '../app/admin/admin-users/user-details/user-details.component'; -import { UserDashboardComponent } from '../app/admin/admin-users/dashboard/user-dashboard.component'; -import { EventDashboardComponent } from '../app/admin/admin-event/dashboard/event-dashboard.component'; -import { LayerDashboardComponent } from '../app/admin/admin-layers/dashboard/layer-dashboard.component'; require('angular-minicolors'); require('select2'); @@ -52,86 +41,28 @@ const app = angular.module('mage', [ require('./auth/http-auth-interceptor') ]); -app.directive( - 'bootstrap', - downgradeComponent({ component: BootstrapComponent }) -); +app + .directive('bootstrap', downgradeComponent({ component: BootstrapComponent })); app .factory('FeedService', downgradeInjectable(FeedService)) .factory('PluginService', downgradeInjectable(PluginService)) // TODO: remove this once we have a new user service - .factory('UserReadService', downgradeInjectable(UserReadService)); + .factory('UserReadService', downgradeInjectable(UserReadService)) // Downgraded Angular components app - .directive( - 'userAvatar', - downgradeComponent({ component: UserAvatarComponent }) - ) + .directive('userAvatar', downgradeComponent({ component: UserAvatarComponent })) .directive('feeds', downgradeComponent({ component: AdminFeedsComponent })) .directive('adminFeed', downgradeComponent({ component: AdminFeedComponent })) - .directive( - 'adminService', - downgradeComponent({ component: AdminServiceComponent }) - ) - .directive( - 'feedEdit', - downgradeComponent({ component: AdminFeedEditComponent }) - ) - .directive( - 'upgradedAdminMapSettings', - downgradeComponent({ component: AdminMapComponent }) - ) - .directive( - 'upgradedAdminSettings', - downgradeComponent({ component: AdminSettingsComponent }) - ) - .directive( - 'upgradedAdminAuthentication', - downgradeComponent({ component: AdminAuthenticationComponent }) - ) - .directive( - 'authenticationCreate', - downgradeComponent({ component: AuthenticationCreateComponent }) - ) + .directive('adminService', downgradeComponent({ component: AdminServiceComponent })) + .directive('feedEdit', downgradeComponent({ component: AdminFeedEditComponent })) + .directive('upgradedAdminMapSettings', downgradeComponent({ component: AdminMapComponent })) + .directive('upgradedAdminSettings', downgradeComponent({ component: AdminSettingsComponent })) + .directive('upgradedAdminAuthentication', downgradeComponent({ component: AdminAuthenticationComponent })) + .directive('authenticationCreate', downgradeComponent({ component: AuthenticationCreateComponent })) .directive('contact', downgradeComponent({ component: ContactComponent })) - .directive( - 'adminEventFormPreview', - downgradeComponent({ component: AdminEventFormPreviewComponent }) - ) - .directive( - 'adminTeams', - downgradeComponent({ component: TeamDashboardComponent }) - ) - .directive( - 'adminTeamDetails', - downgradeComponent({ component: TeamDetailsComponent }) - ) - .directive( - 'adminEventDetails', - downgradeComponent({ component: EventDetailsComponent }) - ) - .directive( - 'adminUsers', - downgradeComponent({ component: UserDashboardComponent }) - ) - .directive( - 'adminUserDetails', - downgradeComponent({ component: UserDetailsComponent }) - ) - .directive( - 'adminDashboard', - downgradeComponent({ component: AdminDashboardComponent }) - ) - .directive( - 'adminEvents', - downgradeComponent({ component: EventDashboardComponent }) - ) - .directive( - 'layerDashboard', - downgradeComponent({ component: LayerDashboardComponent }) - ); + .directive('adminEventFormPreview', downgradeComponent({ component: AdminEventFormPreviewComponent })); app .component('navbar', require('./navbar/navbar.component')) @@ -139,10 +70,7 @@ app .component('fileUpload', fileUpload) .component('fileBrowser', fileBrowser) .controller('NavController', require('./mage/mage-nav.controller')) - .directive( - 'fileUploadGrid', - require('./file-upload/file-upload-grid.directive') - ) + .directive('fileUploadGrid', require('./file-upload/file-upload-grid.directive')) .animation('.slide-down', function () { return { enter: function (element) { @@ -156,60 +84,41 @@ app .config(config) .run(run); require('./mage'); -require('./authentication'); // for modal in admin pages if token expires +require('./authentication') // for modal in admin pages if token expires require('./factories'); require('./filters'); require('./admin'); require('./user'); require('./material-components'); -config.$inject = [ - '$httpProvider', - '$stateProvider', - '$urlRouterProvider', - '$animateProvider' -]; - -function config( - $httpProvider, - $stateProvider, - $urlRouterProvider, - $animateProvider -) { +config.$inject = ['$httpProvider', '$stateProvider', '$urlRouterProvider', '$animateProvider']; + +function config($httpProvider, $stateProvider, $urlRouterProvider, $animateProvider) { $httpProvider.defaults.withCredentials = true; - $httpProvider.defaults.headers.post = { - 'Content-Type': 'application/x-www-form-urlencoded' - }; + $httpProvider.defaults.headers.post = { 'Content-Type': 'application/x-www-form-urlencoded' }; $animateProvider.classNameFilter(/ng-animatable/); function resolveAdmin() { return { - user: [ - '$q', - 'UserService', - function ($q, UserService) { - const deferred = $q.defer(); - - UserService.getMyself().then(function (myself) { - if (myself == null) { - deferred.reject(); - return; - } - - // TODO don't just check for these 2 roles, this should be permission based - // Important when doing this the admin page also has to be permission based - // and only show what each user can see. - // Possible that each role should have an 'admin' permission to abstract this - myself.role.name === 'ADMIN_ROLE' || - myself.role.name === 'EVENT_MANAGER_ROLE' - ? deferred.resolve(myself) - : deferred.reject(); - }); - - return deferred.promise; - } - ] + user: ['$q', 'UserService', function ($q, UserService) { + const deferred = $q.defer(); + + UserService.getMyself().then(function (myself) { + if (myself == null) { + deferred.reject(); + return; + } + + // TODO don't just check for these 2 roles, this should be permission based + // Important when doing this the admin page also has to be permission based + // and only show what each user can see. + // Possible that each role should have an 'admin' permission to abstract this + myself.role.name === 'ADMIN_ROLE' || myself.role.name === 'EVENT_MANAGER_ROLE' ? deferred.resolve(myself) : deferred.reject(); + }); + + return deferred.promise; + }] }; } @@ -241,63 +150,87 @@ function config( $stateProvider.state('admin.bulkUser', { url: '/users/bulk', - component: 'adminUserBulk', + component: "adminUserBulk", resolve: resolveAdmin() }); $stateProvider.state('admin.user', { url: '/users/:userId', - component: 'adminUserDetails', + component: "adminUser", + resolve: resolveAdmin() + }); + + $stateProvider.state('admin.editUser', { + url: '/users/:userId/edit', + component: "adminUserEdit", resolve: resolveAdmin() }); // Admin team routes $stateProvider.state('admin.teams', { url: '/teams', - component: 'adminTeams', + component: "adminTeams", + resolve: resolveAdmin() + }); + + $stateProvider.state('admin.createTeam', { + url: '/teams/new', + component: "adminTeamEdit", resolve: resolveAdmin() }); $stateProvider.state('admin.team', { url: '/teams/:teamId', - component: 'adminTeamDetails', + component: "adminTeam", + resolve: resolveAdmin() + }); + + $stateProvider.state('admin.editTeam', { + url: '/teams/:teamId/edit', + component: "adminTeamEdit", + resolve: resolveAdmin() + }); + + $stateProvider.state('admin.teamAccess', { + url: '/teams/:teamId/access', + component: "adminTeamAccess", resolve: resolveAdmin() }); // Admin event routes $stateProvider.state('admin.events', { url: '/events', - component: 'adminEvents', + component: "adminEvents", resolve: resolveAdmin() }); $stateProvider.state('admin.eventCreate', { url: '/events/new', - component: 'adminEventEdit', + component: "adminEventEdit", resolve: resolveAdmin() }); $stateProvider.state('admin.event', { url: '/events/:eventId', - component: 'adminEventDetails', + component: "adminEvent", resolve: resolveAdmin() }); $stateProvider.state('admin.eventEdit', { url: '/events/:eventId/edit', - component: 'adminEventEdit', + component: "adminEventEdit", resolve: resolveAdmin() }); $stateProvider.state('admin.eventAccess', { url: '/events/:eventId/access', - component: 'adminEventAccess', + component: "adminEventAccess", resolve: resolveAdmin() }); $stateProvider.state('admin.fieldsCreate', { url: '/events/:eventId/forms/new', - component: 'adminEventFormFieldsEdit', + component: "adminEventFormFieldsEdit", params: { form: null }, @@ -306,173 +239,165 @@ function config( $stateProvider.state('admin.formEdit', { url: '/events/:eventId/forms/:formId', - component: 'adminEventFormEdit', + component: "adminEventFormEdit", resolve: resolveAdmin() }); $stateProvider.state('admin.formFieldsEdit', { url: '/events/:eventId/forms/:formId/fields', - component: 'adminEventFormFieldsEdit', + component: "adminEventFormFieldsEdit", resolve: resolveAdmin() }); $stateProvider.state('admin.formMapEdit', { url: '/events/:eventId/forms/:formId/map', - component: 'adminEventFormMapEdit', + component: "adminEventFormMapEdit", resolve: resolveAdmin() }); $stateProvider.state('admin.formFeedEdit', { url: '/events/:eventId/forms/:formId/feed', - component: 'adminEventFormFeedEdit', + component: "adminEventFormFeedEdit", resolve: resolveAdmin() }); // Admin device routes $stateProvider.state('admin.devices', { url: '/devices', - component: 'adminDevices', + component: "adminDevices", resolve: resolveAdmin() }); $stateProvider.state('admin.deviceCreate', { url: '/devices/new', - component: 'adminDeviceEdit', + component: "adminDeviceEdit", resolve: resolveAdmin() }); $stateProvider.state('admin.device', { url: '/devices/:deviceId', - component: 'adminDevice', + component: "adminDevice", resolve: resolveAdmin() }); $stateProvider.state('admin.deviceEdit', { url: '/devices/:deviceId/edit', - component: 'adminDeviceEdit', + component: "adminDeviceEdit", resolve: resolveAdmin() }); // Admin layer routes $stateProvider.state('admin.layers', { url: '/layers', - component: 'layerDashboard', + component: "adminLayers", resolve: resolveAdmin() }); $stateProvider.state('admin.layerCreate', { url: '/layers/new', - component: 'adminLayerEdit', + component: "adminLayerEdit", resolve: resolveAdmin() }); $stateProvider.state('admin.layer', { url: '/layers/:layerId', - component: 'adminLayer', + component: "adminLayer", resolve: resolveAdmin() }); $stateProvider.state('admin.layerEdit', { url: '/layers/:layerId/edit', - component: 'adminLayerEdit', + component: "adminLayerEdit", resolve: resolveAdmin() }); // Admin feed routes $stateProvider.state('admin.feeds', { url: '/feeds', - component: 'adminFeeds', + component: "adminFeeds", resolve: resolveAdmin() }); $stateProvider.state('admin.feed', { url: '/feeds/:feedId', - component: 'adminFeed', + component: "adminFeed", resolve: resolveAdmin() }); $stateProvider.state('admin.feedCreate', { url: '/feeds/new', - component: 'feedEdit', + component: "feedEdit", resolve: resolveAdmin() }); $stateProvider.state('admin.feedEdit', { url: '/feeds/:feedId/edit', - component: 'feedEdit', + component: "feedEdit", resolve: resolveAdmin() }); // Admin service routes $stateProvider.state('admin.service', { url: '/services/:serviceId', - component: 'adminService', + component: "adminService", resolve: resolveAdmin() }); // Admin map routes $stateProvider.state('admin.map', { url: '/map', - component: 'upgradedAdminMapSettings', + component: "upgradedAdminMapSettings", resolve: resolveAdmin() }); // Security settings routes $stateProvider.state('admin.security', { url: '/security', - component: 'upgradedAdminAuthentication', + component: "upgradedAdminAuthentication", resolve: resolveAdmin() }); $stateProvider.state('admin.authenticationCreate', { url: '/security/new', - component: 'authenticationCreate', + component: "authenticationCreate", resolve: resolveAdmin() }); // Admin settings routes $stateProvider.state('admin.settings', { url: '/settings', - component: 'upgradedAdminSettings', + component: "upgradedAdminSettings", resolve: resolveAdmin() }); } run.$inject = ['$rootScope', '$uibModal', '$state', 'Api', 'UserService']; function run($rootScope, $uibModal, $state, Api, UserService) { + $rootScope.$on('event:auth-loginRequired', function (e, response) { const stateExceptions = ['landing']; const requestExceptions = ['/api/users/myself/password']; - if ( - !$rootScope.loginDialogPresented && - !_(stateExceptions).contains($state.current.name) && - !_(requestExceptions).contains(response.config.url) - ) { + if (!$rootScope.loginDialogPresented && !_(stateExceptions).contains($state.current.name) && !_(requestExceptions).contains(response.config.url)) { $rootScope.loginDialogPresented = true; Api.get(function (api) { let successful = false; const options = { template: require('./authentication/signin-modal.html'), - controller: [ - '$scope', - '$uibModalInstance', - 'authService', - function ($scope, $uibModalInstance, authService) { - $uibModalInstance.scope = $scope; - $scope.api = api; - $scope.hideSignup = true; - - $scope.onSuccess = function () { - authService.loginConfirmed(); - $rootScope.loginDialogPresented = false; - successful = true; - $uibModalInstance.close($scope); - }; - - $scope.logout = function () { - $rootScope.loginDialogPresented = false; - successful = true; - $uibModalInstance.close($scope); - }; - } - ] + controller: ['$scope', '$uibModalInstance', 'authService', function ($scope, $uibModalInstance, authService) { + $uibModalInstance.scope = $scope; + $scope.api = api; + $scope.hideSignup = true; + + $scope.onSuccess = function () { + authService.loginConfirmed(); + $rootScope.loginDialogPresented = false; + successful = true; + $uibModalInstance.close($scope); + }; + + $scope.logout = function () { + $rootScope.loginDialogPresented = false; + successful = true; + $uibModalInstance.close($scope); + }; + }] }; let modalInstance = $uibModal.open(options); const modalClosed = function () { diff --git a/web-app/admin/src/ng1/css/style.scss b/web-app/admin/src/ng1/css/style.scss index e8accd1a8..726bb3678 100644 --- a/web-app/admin/src/ng1/css/style.scss +++ b/web-app/admin/src/ng1/css/style.scss @@ -1,33 +1,33 @@ -@import './variables.scss'; - -@import './material-theme.scss'; -@import 'material-components-web/material-components-web.scss'; - -@import 'ui-select/dist/select.min.css'; -@import 'font-awesome/css/font-awesome.min.css'; -@import 'jquery-minicolors/jquery.minicolors.css'; -@import 'select2/dist/css/select2.min.css'; - -@import './animate.scss'; -@import './colors.scss'; -@import './animations.scss'; -@import './auth.scss'; -@import './observation-item.scss'; -@import './people-item.scss'; -@import './feed.scss'; -@import './observation-edit.scss'; -@import './observation-view.scss'; -@import './user-view.scss'; -@import './form-chooser.scss'; -@import './navbar.scss'; -@import './tooltip.scss'; -@import './material-select-theme.scss'; -@import './mdDateTimePicker-overrides.scss'; -@import './leaflet-overrides.scss'; -@import './layer-edit.scss'; - -@import './admin/index.scss'; -@import './card/index.scss'; +@import "./variables.scss"; + +@import "./material-theme.scss"; +@import "material-components-web/material-components-web.scss"; + +@import "ui-select/dist/select.min.css"; +@import "font-awesome/css/font-awesome.min.css"; +@import "jquery-minicolors/jquery.minicolors.css"; +@import "select2/dist/css/select2.min.css"; + +@import "./animate.scss"; +@import "./colors.scss"; +@import "./animations.scss"; +@import "./auth.scss"; +@import "./observation-item.scss"; +@import "./people-item.scss"; +@import "./feed.scss"; +@import "./observation-edit.scss"; +@import "./observation-view.scss"; +@import "./user-view.scss"; +@import "./form-chooser.scss"; +@import "./navbar.scss"; +@import "./tooltip.scss"; +@import "./material-select-theme.scss"; +@import "./mdDateTimePicker-overrides.scss"; +@import "./leaflet-overrides.scss"; +@import "./layer-edit.scss"; + +@import "./admin/index.scss"; +@import "./card/index.scss"; .application { height: 100%; @@ -56,11 +56,11 @@ mage { } .slide-animate.ng-hide { - transition: 0.5s linear all; - opacity: 0; + transition:0.5s linear all; + opacity:0; } -@media (min-width: 900px) { +@media(min-width:900px) { .mobile-only { visibility: hidden; display: none; @@ -69,21 +69,20 @@ mage { } } -@media (max-width: 1160px) { +@media(max-width: 1160px) { .mdc-top-app-bar__row .mdc-button { - font-size: 0.7rem; + font-size: .7rem; } } -@media (max-width: 900px) { +@media(max-width: 900px) { .mdc-top-app-bar__row .map-app-bar-section { visibility: hidden; display: none; } } -a:hover, -a:focus { +a:hover, a:focus { text-decoration: none; } @@ -102,7 +101,7 @@ a:focus { /** End fix */ .mdc-dialog .mdc-dialog__title { - color: #ffffff; + color: #FFFFFF; } .mdc-dialog__content .mdc-checkbox::before { @@ -150,8 +149,7 @@ a:focus { } .shadow-app-bar { - box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), - 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); + box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); } .header-spacer { @@ -160,19 +158,19 @@ a:focus { @keyframes spin { from { - transform: rotate(0deg); + transform:rotate(0deg); } to { - transform: rotate(360deg); + transform:rotate(360deg); } } @keyframes spinccw { from { - transform: rotate(360deg); + transform:rotate(360deg); } to { - transform: rotate(0deg); + transform:rotate(0deg); } } @@ -198,7 +196,7 @@ a:focus { } .filter-panel .set-filter-button:not(:disabled) { - background-color: #1e88e5 !important; + background-color: #1E88E5 !important; color: white; } @@ -214,12 +212,12 @@ a:focus { } .export-panel .export-button:not(:disabled) { - background-color: #1e88e5 !important; + background-color: #1E88E5 !important; color: white; } .export-info-panel .export-button:not(:disabled) { - background-color: #1e88e5 !important; + background-color: #1E88E5 !important; color: white; } @@ -272,7 +270,7 @@ a:focus { perspective: 1000px; } -.location-field-select .map-select { + .location-field-select .map-select { position: absolute; top: 0; bottom: 0; @@ -309,8 +307,7 @@ a:focus { -webkit-transform: rotateY(180deg) translateZ(1px); } -.location-field-card__edit, -.location-field-card__view { +.location-field-card__edit, .location-field-card__view { position: absolute; top: 8px; bottom: 8px; @@ -321,25 +318,11 @@ a:focus { -webkit-backface-visibility: hidden; } -.location-field-select.mdc-select--outlined:not(.mdc-select--disabled):not( - .mdc-select--focused - ) - .mdc-select__selected-text-mine:hover - ~ .mdc-notched-outline - .mdc-notched-outline__leading, -.location-field-select.mdc-select--outlined:not(.mdc-select--disabled):not( - .mdc-select--focused - ) - .mdc-select__selected-text-mine:hover - ~ .mdc-notched-outline - .mdc-notched-outline__trailing, -.location-field-select.mdc-select--outlined:not(.mdc-select--disabled):not( - .mdc-select--focused - ) - .mdc-select__selected-text-mine:hover - ~ .mdc-notched-outline - .mdc-notched-outline__notch { - border-color: rgba(0, 0, 0, 0.87); +.location-field-select.mdc-select--outlined:not(.mdc-select--disabled):not(.mdc-select--focused) .mdc-select__selected-text-mine:hover~.mdc-notched-outline .mdc-notched-outline__leading, +.location-field-select.mdc-select--outlined:not(.mdc-select--disabled):not(.mdc-select--focused) .mdc-select__selected-text-mine:hover~.mdc-notched-outline .mdc-notched-outline__trailing, +.location-field-select.mdc-select--outlined:not(.mdc-select--disabled):not(.mdc-select--focused) .mdc-select__selected-text-mine:hover~.mdc-notched-outline .mdc-notched-outline__notch +{ + border-color: rgba(0,0,0,.87); } .location-field-select.mdc-select { @@ -374,33 +357,20 @@ a:focus { templates compile. The !important is important given that there may be other selectors that are more specific or come later and might alter display. */ -[ng\:cloak], -[ng-cloak], -[data-ng-cloak], -[x-ng-cloak], -.ng-cloak, -.x-ng-cloak { +[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak { display: none !important; } /* CLEAR FIX*/ -.clearfix:after { - content: '.'; - display: block; - height: 0; - clear: both; - visibility: hidden; -} -.clearfix { - display: inline-block; -} +.clearfix:after {content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden;} +.clearfix {display: inline-block;} /* Hides from IE-mac \*/ -* html .clearfix { - height: 1%; -} -.clearfix { - display: block; -} +* html .clearfix { height: 1%;} +.clearfix {display: block;} body { margin: 0; @@ -411,29 +381,6 @@ body { line-height: unset; /* font-family: Roboto; font-weight: 400; */ - &:has(.banner-header) { - .nav-float-wrapper { - top: 91px !important; - @media (max-width: 599px) { - top: 85px !important; - } - } - .drawer-backdrop { - margin-top: 139px !important; - - @media (max-width: 599px) { - margin-top: 135px !important; - } - } - .drawer{ - top: 45px; - &.open{ - @media (max-width: 599px) { - margin-top: 135px; - } - } - } - } } html { @@ -441,31 +388,26 @@ html { font-size: unset; } -h1, -h2, -h3, -h4, -h5 { - color: #1e88e5; +h1, h2, h3, h4, h5 { + color: #1E88E5; } -.nav > li > a { - color: #ffffff; +.nav>li>a { + color: #FFFFFF; } -.nav-pills > li > a { - color: #1e88e5; +.nav-pills>li>a { + color: #1E88E5; } -.nav > li > a:hover, -.nav > li > a:focus { +.nav>li>a:hover, .nav>li>a:focus { text-decoration: none; - color: #1565c0; + color: #1565C0; background: transparent; } a { - color: #1e88e5; + color: #1E88E5; } .right-gap-s { @@ -485,39 +427,39 @@ a { } .top-gap { - margin-top: 16px; + margin-top: 16px; } .top-gap-l { - margin-top: 30px; + margin-top: 30px; } .top-gap-xl { - margin-top: 50px; + margin-top: 50px; } .bottom-gap-s { - margin-bottom: 5px; + margin-bottom: 5px; } .bottom-gap { - margin-bottom: 16px; + margin-bottom: 16px; } .bottom-gap-l { - margin-bottom: 30px; + margin-bottom: 30px; } .bottom-gap-xl { - margin-bottom: 50px; + margin-bottom: 50px; } .ellipsis { - text-overflow: ellipsis; - width: 100%; - overflow: hidden; - white-space: nowrap; - display: block; + text-overflow: ellipsis; + width: 100%; + overflow: hidden; + white-space: nowrap; + display: block; } .content-flex { @@ -526,12 +468,12 @@ a { } .content-inner { - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - overflow: auto; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + overflow: auto; } .route-content { @@ -548,7 +490,7 @@ a { width: 50vw; } -@media (max-width: 900px) { +@media(max-width:900px) { .about-content { margin: 32px; width: unset; @@ -566,7 +508,7 @@ a { align-items: center; z-index: 2; font-size: 16px; - background-color: #1565c0; + background-color: #1565C0; color: #fff; padding: 10px 0px; } @@ -576,20 +518,20 @@ a { } .filter-event { - font-family: Roboto; - font-weight: 400; + font-family: Roboto; + font-weight: 400; } .filter-teams { - font-family: Roboto; - font-weight: 400; - margin-left: 5px; + font-family: Roboto; + font-weight: 400; + margin-left: 5px; } .filter-interval { - font-family: Roboto; - font-weight: 400; - padding-left: 35px; + font-family: Roboto; + font-weight: 400; + padding-left: 35px; } .main-container { @@ -615,7 +557,7 @@ a { } .observation-feed-content-container { - display: flex; + display:flex; flex-direction: column; } @@ -627,7 +569,7 @@ a { .observation-form { display: flex; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.35); + box-shadow: 0 1px 3px rgba(0,0,0,.35); margin-bottom: 12px; padding: 12px; } @@ -707,7 +649,7 @@ a { } } -@media (max-width: 768px) { +@media(max-width:768px) { .filter-interval { padding-left: 0; } @@ -715,7 +657,7 @@ a { @media (max-width: 767px) { .navbar-nav .open .dropdown-menu .dropdown-header { - color: rgba(221, 221, 221, 0.87); + color: rgba(221, 221, 221, .87); } } @@ -755,12 +697,12 @@ a { } .image-delete { - opacity: 0.5; + opacity: 0.5; } .attachment:before { display: block; - content: ''; + content: ""; width: 100%; padding-top: 100%; } @@ -777,8 +719,7 @@ a { .card { box-sizing: border-box; - box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.14), - 0 2px 2px 0 rgba(0, 0, 0, 0.098), 0 1px 5px 0 rgba(0, 0, 0, 0.084); + box-shadow: 0 3px 1px -2px rgba(0,0,0,.14),0 2px 2px 0 rgba(0,0,0,.098),0 1px 5px 0 rgba(0,0,0,.084); } .card > .card-content { @@ -786,34 +727,33 @@ a { } .modal-header { - background: #1e88e5; - color: #91bdee; + background: #1E88E5; + color: #91BDEE; } .modal-title { - color: #fff; + color: #FFF; } .modal-body { - background: #fff; + background: #FFF; } .modal-footer { - background: #fff; - color: #1e88e5; + background: #FFF; + color: #1E88E5 } -.modal-content, -.observation-favorite-modal-content { - background-color: #f5f5f5; +.modal-content, .observation-favorite-modal-content { + background-color: #F5F5F5; } .observation-favorite-modal-header { - color: #aaa; + color: #AAA; border-bottom: 1px solid #e5e5e5; padding: 15px; border-radius: 6px 6px 0 0; - background-color: #fff; + background-color: #FFF; } .observation-favorite-modal-title { @@ -831,7 +771,7 @@ a { .observation-favorite-modal-item { padding: 15px; border-radius: 6px 6px 0 0; - background-color: #fff; + background-color: #FFF; } .observation-favorite-icon { @@ -844,17 +784,17 @@ a { } .observation-favorite-user { - background-color: #f5f5f5; - border-bottom: 1px solid #eaeaea; + background-color: #F5F5F5; + border-bottom: 1px solid #EAEAEA; } .observation-favorite-user:last-child { - border-bottom: 0; + border-bottom: 0; } .brand-title { margin-left: 10px; - color: #1565c0; + color: #1565C0; font-size: 2em; font-weight: 500; } @@ -864,18 +804,18 @@ a { } .icon-brand-s { - font-size: 75px; - color: #1565c0; + font-size: 75px; + color: #1565C0; } .icon-brand-m { - font-size: 125px; - color: #1565c0; + font-size: 125px; + color: #1565C0; } .icon-brand-l { - font-size: 300px; - color: #1565c0; + font-size: 300px; + color: #1565C0; } /* Overrides */ @@ -889,10 +829,8 @@ textarea { background: none; } -.btn-no-border:focus, -.btn-no-border:active:focus, -.btn-no-border.active:focus { - outline: 0 none; +.btn-no-border:focus, .btn-no-border:active:focus, .btn-no-border.active:focus { + outline: 0 none; } .btn-file { @@ -900,7 +838,7 @@ textarea { overflow: hidden; } -.btn-file input[type='file'] { +.btn-file input[type=file] { position: absolute; top: 0; right: 0; @@ -917,17 +855,17 @@ textarea { } .accordion-edit { - color: #555; + color: #555; } .icon-mage { - color: #1e88e5; + color: #1E88E5; font-size: 1.2em; background-image: none; } .icon-mage-inverse { - color: #fefefe; + color: #FEFEFE; font-size: 1.2em; background-image: none; margin-bottom: 9px; @@ -941,9 +879,9 @@ textarea { @media (min-width: 768px) { .fixed-width-navbar .form-control { - display: inline-block; - width: 100%; - vertical-align: middle; + display: inline-block; + width: 100%; + vertical-align: middle; } } @@ -958,16 +896,15 @@ textarea { } .navbar-default .admin-navbar-toggle .icon-bar { - background-color: #888; + background-color: #888; } -.navbar-default .admin-navbar-toggle:focus, -.navbar-default .admin-navbar-toggle:hover { - background-color: #ddd; +.navbar-default .admin-navbar-toggle:focus, .navbar-default .admin-navbar-toggle:hover { + background-color: #ddd; } .navbar-default .navbar-text-inverse { - color: #777; + color: #777; } .navbar-divider { @@ -978,16 +915,15 @@ textarea { } .admin-dashboard-navbar .btn-link { - color: #777; + color: #777; } -.navbar-default .admin-navbar-collapse, -.navbar-default .navbar-form { - border-color: #e7e7e7; +.navbar-default .admin-navbar-collapse, .navbar-default .navbar-form { + border-color: #e7e7e7; } .admin-dashboard { - color: #1e88e5; + color: #1E88E5; margin-right: 5px; } @@ -998,7 +934,6 @@ admin { .admin-main { flex: 1; - overflow: hidden !important; } .admin-main-content { @@ -1011,7 +946,7 @@ admin { background-color: #555; display: flex; flex-direction: column; - height: 100%; + height: 100% } .admin-actions-content { @@ -1036,8 +971,7 @@ admin { align-items: center; justify-content: center; color: rgba(255, 255, 255, 0.54); - cursor: pointer; - cursor: hand; + cursor: pointer; cursor: hand; } .admin-action-arrow-left { @@ -1047,7 +981,7 @@ admin { height: 0; border-top: 10px solid transparent; border-bottom: 10px solid transparent; - border-right: 10px solid white; + border-right:10px solid white; } .admin-action .fa { @@ -1058,10 +992,10 @@ admin { .admin-action .fa-mobile-phone { font-size: 46px; margin-bottom: 0; -} + } .admin-action-selected { - color: rgba(255, 255, 255, 0.96); + color: rgba(255, 255, 255, .96); background-color: #444; } @@ -1076,19 +1010,17 @@ admin { } .admin-dashboard-navbar { - background-color: #f5f5f5; - border-color: #f0f0f0; + background-color: #F5F5F5; + border-color: #F0F0F0; } .admin-dashboard-navbar > .container-fluid > .navbar-header > .navbar-brand { color: #204976; } -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #fff; - background-color: #1e88e5; +.nav-pills>li.active>a, .nav-pills>li.active>a:hover, .nav-pills>li.active>a:focus { + color: #fff; + background-color: #1E88E5; } .admin-dashboard-content { @@ -1105,7 +1037,7 @@ admin { .admin-nav { height: 40px; - background-color: #e2e2e2; + background-color: #E2E2E2; } .admin-nav-gap { @@ -1121,9 +1053,9 @@ admin { } .admin-table { - color: #555; - background-color: white; - border: 1px solid #f5f5f5; + color: #555; + background-color: white; + border: 1px solid #F5F5F5; } .admin-table-content { @@ -1160,8 +1092,7 @@ admin { .admin-option-action { margin-right: 10px; - cursor: pointer; - cursor: hand; + cursor: pointer; cursor: hand; } .admin-option-border { @@ -1184,8 +1115,8 @@ admin { } .admin-table-delete-btn { - margin-right: 15px; - float: left; + margin-right: 15px; + float: left; } .admin-device-container { @@ -1203,7 +1134,7 @@ admin { } .admin-android-icon { - color: #a4c739; + color: #A4C739; font-size: 32px; } @@ -1223,7 +1154,7 @@ admin { } .admin-android-icon-xs { - color: #a4c739; + color: #A4C739; font-size: 18px; } @@ -1274,8 +1205,7 @@ admin { width: 100%; height: 200px; position: relative; - cursor: pointer; - cursor: hand; + cursor: pointer; cursor: hand; font-size: 1.5rem; } @@ -1288,7 +1218,7 @@ admin { } .form-section-fields { - color: #66bb6a; + color: #66BB6A; } .form-section-fields-icon { @@ -1296,11 +1226,11 @@ admin { } .form-section-map { - color: #29b6f6; + color: #29B6F6; } .form-section-feed { - color: #ffca28; + color: #FFCA28; } .form-section-feed-icon { @@ -1317,52 +1247,51 @@ admin { margin-top: 8px; font-size: 1rem; color: black; - opacity: 0.54; + opacity: .54; } .cssFade { - transition: 0.5s linear all; - opacity: 1; + transition: 0.5s linear all; + opacity: 1; } .cssFade.ng-hide { - opacity: 0; + opacity: 0; } .pointer { - cursor: pointer; - cursor: hand; + cursor: pointer; cursor: hand; } h4.image-delete { - position: absolute; + position: absolute; text-align: center; - color: white; - font-weight: bold; + color: white; + font-weight: bold; } .well-item { - padding: 10px; - border-bottom: 1px solid rgba(0, 0, 0, 0.05); + padding: 10px; + border-bottom: 1px solid rgba(0,0,0,0.05); } .well-item:last-child { - border-bottom: none; + border-bottom: none; } .muted { - color: #777777; + color: #777777; } .file-custom:before { - box-sizing: border-box; + box-sizing: border-box; } .file-custom { - box-sizing: border-box; + box-sizing: border-box; } .preview-image { - width: 35px; + width: 35px; } .symbology-card { @@ -1389,7 +1318,7 @@ h4.image-delete { .circle-avatar { border-radius: 50%; overflow: hidden; - background: #ffffff; + background: #FFFFFF; } .circle-avatar-no-border { @@ -1397,17 +1326,17 @@ h4.image-delete { } .observation-type { - font-size: 15.5px; - padding-bottom: 2px; + font-size: 15.5px; + padding-bottom: 2px; } .observation-variant { - font-size: 14px; - font-style: italic; + font-size: 14px; + font-style: italic; } .observation-user { - font-size: 14px; + font-size: 14px; } .observation-actions { @@ -1419,7 +1348,7 @@ h4.image-delete { .observation-action { font-size: 20px; - color: #aaa; + color: #AAA; width: 80px; } @@ -1429,19 +1358,19 @@ h4.image-delete { } .observation-action-important-active { - color: #ff9103 !important; + color: #FF9103 !important; } .observation-action-important:hover { - color: #ff9103 !important; + color: #FF9103 !important; } .observation-action-favorite-active { - color: #7ed321 !important; + color: #7ED321 !important; } .observation-action-favorite:hover { - color: #7ed321 !important; + color: #7ED321 !important; } .observation-action-favorite-count { @@ -1454,7 +1383,7 @@ h4.image-delete { } .observation-action-email:hover { - color: #4a90e2; + color: #4A90E2; } .user-icon-container { @@ -1472,7 +1401,7 @@ h4.image-delete { } .dropdown-menu { - z-index: 1031; + z-index: 1031; } .field { @@ -1497,13 +1426,13 @@ h4.image-delete { } .preferences-form { - padding: 16px; - min-width: 180px; + padding: 16px; + min-width: 180px; } .time-zone-button .mdc-button__label, .time-zone-button .mdc-button__icon { - color: #1e88e5; + color: #1E88E5; } .btn .logo { @@ -1511,7 +1440,7 @@ h4.image-delete { left: 3px; top: 2px; bottom: 2px; - background-color: #ffffff; + background-color: #FFFFFF; border-radius: 4px; width: 42px; } @@ -1519,7 +1448,7 @@ h4.image-delete { .btn .logo img { position: relative; top: 9px; - width: 60%; + width: 60% } .btn .logo i { diff --git a/web-app/admin/src/ng1/factories/event.resource.js b/web-app/admin/src/ng1/factories/event.resource.js index 3ef952298..971e28991 100644 --- a/web-app/admin/src/ng1/factories/event.resource.js +++ b/web-app/admin/src/ng1/factories/event.resource.js @@ -1,7 +1,7 @@ function Event($rootScope, $resource) { const Event = $resource('/api/events/:id', { id: '@id' - }, { + },{ get: { method: 'GET', responseType: 'json' @@ -22,11 +22,6 @@ function Event($rootScope, $resource) { isArray: true, responseType: 'json' }, - queryWithPagination: { - method: 'GET', - responseType: 'json', - isArray: false - }, count: { method: 'GET', url: '/api/events/count', @@ -106,7 +101,7 @@ function Event($rootScope, $resource) { } }); - Event.prototype.$save = function (success, error) { + Event.prototype.$save = function(success, error) { if (this.id) { this.$update(success, error); } else { @@ -123,7 +118,7 @@ function EventAccess($resource) { const EventAccess = $resource('/api/events/:eventId/acl', { eventId: '@eventId', userId: '@userId' - }, { + },{ update: { method: 'PUT', headers: { diff --git a/web-app/admin/src/ng1/factories/login.service.js b/web-app/admin/src/ng1/factories/login.service.js index df73cd94b..393f69f8e 100644 --- a/web-app/admin/src/ng1/factories/login.service.js +++ b/web-app/admin/src/ng1/factories/login.service.js @@ -20,9 +20,7 @@ function LoginService($http, $httpParamSerializer) { if (filter.user) { parameters.userId = filter.user.id; } - if (filter.deviceIds) { - parameters.deviceIds = filter.deviceIds; - } else if (filter.device) { + if (filter.device) { parameters.deviceId = filter.device.id; } if (filter.startDate) { diff --git a/web-app/admin/src/ng1/mage/banner.html b/web-app/admin/src/ng1/mage/banner.html index fed264eee..7c5239c4e 100644 --- a/web-app/admin/src/ng1/mage/banner.html +++ b/web-app/admin/src/ng1/mage/banner.html @@ -1,3 +1,3 @@ - + diff --git a/web-app/admin/src/ng1/navbar/navbar.component.js b/web-app/admin/src/ng1/navbar/navbar.component.js index 1d0c2bdbe..931f4303d 100644 --- a/web-app/admin/src/ng1/navbar/navbar.component.js +++ b/web-app/admin/src/ng1/navbar/navbar.component.js @@ -16,6 +16,7 @@ function NavbarController($state, $transitions, window, UserService) { }; this.$onInit = function () { + console.log('hello nav bar init') this.state = $state.current.name; $transitions.onSuccess({}, transition => { this.state = transition.to().name; diff --git a/web-app/admin/src/styles.scss b/web-app/admin/src/styles.scss index 026b300c7..340b0e317 100644 --- a/web-app/admin/src/styles.scss +++ b/web-app/admin/src/styles.scss @@ -4,17 +4,11 @@ @import "./roboto.scss"; @import "./ng1/css/style.scss"; @import "./ng1/css/map.scss"; - -html, -body { - height: 100%; -} - +html, body { height: 100%; } body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; font-size: unset; - overflow: hidden; } bootstrap { @@ -24,7 +18,7 @@ bootstrap { mat-bottom-sheet-container.feed-panel { position: absolute; left: 0; - bottom: 0; + bottom:0; width: 450px; min-width: 450px; } @@ -32,121 +26,5 @@ mat-bottom-sheet-container.feed-panel { .form-remove-snackbar { position: absolute; left: 29px; - bottom: 0; + bottom:0; } - -// Dialog styles - -.dialog-modal { - flex-direction: column; - min-width: 700px; - - @media (max-width: 768px) { - min-width: 100%; - } - - .dialog-header { - padding: 1.5rem 2rem; - border-bottom: 1px solid #e5e7eb; - flex-shrink: 0; - display: flex; - align-items: center; - justify-content: space-between; - - .dialog-title { - font-size: 1.5rem; - font-weight: 700; - color: #111827; - margin: 0; - line-height: 1.2; - } - } - - .dialog-content { - padding: 2rem; - flex: 1; - } - - .dialog-actions { - padding: 1.5rem 2rem; - border-top: 1px solid #e5e7eb; - display: flex; - justify-content: flex-end; - gap: 0.75rem; - background-color: #f9fafb; - - .action-button { - padding: 0.75rem 1.5rem; - border: 1px solid #d1d5db; - border-radius: 8px; - background: white; - color: #374151; - font-size: 0.875rem; - font-weight: 500; - cursor: pointer; - transition: all 0.2s ease; - white-space: nowrap; - display: inline-flex; - align-items: center; - gap: 0.5rem; - - &:hover:not(:disabled) { - background-color: #f9fafb; - border-color: #9ca3af; - } - - &:focus { - outline: none; - box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); - border-color: #3b82f6; - } - - &:disabled { - opacity: 0.5; - background-color: #f9fafb; - } - - &.btn-danger { - background-color: #dc2626; - border-color: #dc2626; - color: white; - - &:hover:not(:disabled) { - background-color: #b91c1c; - border-color: #b91c1c; - } - - &:focus { - box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.1); - border-color: #dc2626; - } - - &:disabled { - background-color: #9ca3af; - border-color: #9ca3af; - opacity: 0.6; - } - } - - &.btn-primary { - background: #3b82f6; - border-color: #3b82f6; - color: white; - - &:hover:not(:disabled) { - background-color: #2563eb; - border-color: #2563eb; - } - - &:disabled { - background-color: #9ca3af; - border-color: #9ca3af; - } - } - - i { - font-size: 0.75rem; - } - } - } -} \ No newline at end of file diff --git a/web-app/karma.conf.js b/web-app/karma.conf.js index fd3f5ec73..59fc249fa 100644 --- a/web-app/karma.conf.js +++ b/web-app/karma.conf.js @@ -28,7 +28,7 @@ module.exports = function (config) { reporters: ['progress', 'kjhtml', 'coverage'], port: 9876, colors: true, - logLevel: config.LOG_INFO, + logLevel: config.LOG_LOG, autoWatch: true, browsers: ['Chrome'], singleRun: false, diff --git a/web-app/package-lock.json b/web-app/package-lock.json index 28f89a40b..52e60ec29 100644 --- a/web-app/package-lock.json +++ b/web-app/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ngageoint/mage.web-app", - "version": "6.5.5", + "version": "6.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ngageoint/mage.web-app", - "version": "6.5.5", + "version": "6.3.0", "license": "Apache-2.0", "dependencies": { "@ajsf/core": "0.8.0", @@ -30,12 +30,12 @@ "@ngageoint/md-date-time-picker": "2.3.0", "@ngageoint/mgrs-js": "1.0.0", "@ngneat/input-mask": "6.1.0", - "@turf/center": "7.2.0", - "@turf/helpers": "7.2.0", - "@turf/kinks": "7.2.0", + "@turf/center": "4.3.0", + "@turf/helpers": "4.3.0", + "@turf/kinks": "4.3.0", "@types/geojson": "7946.0.7", - "@types/leaflet-editable": "1.2.7", - "@types/leaflet.markercluster": "1.5.6", + "@types/leaflet-editable": "1.2.6", + "@types/leaflet.markercluster": "1.5.3", "@uirouter/angular": "10.0.0", "@uirouter/angular-hybrid": "14.0.0", "@uirouter/angularjs": "1.0.30", @@ -59,16 +59,16 @@ "jquery-file-download": "1.4.6", "jquery-minicolors": "2.1.10", "js_cols": "1.0.1", - "leaflet": "1.9.4", - "leaflet-editable": "1.3.2", + "leaflet": "1.7.1", + "leaflet-editable": "1.2.0", "leaflet.markercluster": "1.5.3", "lodash": "4.17.21", "material-components-web": "3.2.0", "mgrs": "1.0.0", - "moment": "2.30.1", + "moment": "2.22.2", "ngx-color": "8.0.3", "ngx-mat-select-search": "5.0.0", - "papaparse": "5.5.3", + "papaparse": "4.1.4", "rxjs": "7.8.2", "select2": "4.0.7", "semver": "7.6.2", @@ -95,7 +95,7 @@ "@types/inputmask": "5.0.3", "@types/jasmine": "4.3.1", "@types/jasminewd2": "2.0.10", - "@types/leaflet": "1.9.20", + "@types/leaflet": "1.7.4", "@types/lodash": "4.17.6", "@types/node": "18.11.13", "@types/semver": "7.5.8", @@ -104,7 +104,7 @@ "html-webpack-plugin": "5.5.0", "jasmine-core": "4.5.0", "karma": "6.4.1", - "karma-chrome-launcher": "^3.1.1", + "karma-chrome-launcher": "3.1.1", "karma-coverage": "2.2.0", "karma-coverage-istanbul-reporter": "3.0.3", "karma-jasmine": "5.1.0", @@ -120,7 +120,7 @@ } }, "node_modules/@adobe/css-tools": { - "version": "4.4.3", + "version": "4.4.0", "dev": true, "license": "MIT" }, @@ -308,6 +308,15 @@ "dev": true, "license": "MIT" }, + "node_modules/@angular-devkit/build-angular/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/lru-cache": { "version": "6.0.0", "dev": true, @@ -335,6 +344,11 @@ "dev": true, "license": "0BSD" }, + "node_modules/@angular-devkit/build-angular/node_modules/sax": { + "version": "1.2.4", + "dev": true, + "license": "ISC" + }, "node_modules/@angular-devkit/build-angular/node_modules/schema-utils": { "version": "3.3.0", "dev": true, @@ -366,6 +380,57 @@ "node": ">=10" } }, + "node_modules/@angular-devkit/build-angular/node_modules/stylus": { + "version": "0.59.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.0.1", + "debug": "^4.3.2", + "glob": "^7.1.6", + "sax": "~1.2.4", + "source-map": "^0.7.3" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://opencollective.com/stylus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/stylus/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/stylus/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/tslib": { "version": "2.4.0", "dev": true, @@ -859,20 +924,19 @@ "license": "Apache-2.0" }, "node_modules/@babel/code-frame": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.28.0", + "version": "7.25.4", "dev": true, "license": "MIT", "engines": { @@ -930,12 +994,16 @@ } }, "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", + "version": "0.3.5", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/@babel/helper-annotate-as-pure": { @@ -949,14 +1017,26 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", + "version": "7.25.2", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -973,16 +1053,16 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.27.1", + "version": "7.25.4", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.27.1", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/traverse": "^7.25.4", "semver": "^6.3.1" }, "engines": { @@ -993,11 +1073,11 @@ } }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.3" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1012,12 +1092,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.27.1", + "version": "7.25.2", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "regexpu-core": "^6.2.0", + "@babel/helper-annotate-as-pure": "^7.24.7", + "regexpu-core": "^5.3.1", "semver": "^6.3.1" }, "engines": { @@ -1028,11 +1108,11 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.3" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1081,46 +1161,39 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.27.1", + "version": "7.24.8", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.27.3", + "version": "7.25.2", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.3" + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -1130,18 +1203,18 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", + "version": "7.24.8", "dev": true, "license": "MIT", "engines": { @@ -1149,13 +1222,13 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.27.1", + "version": "7.25.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-wrap-function": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-wrap-function": "^7.25.0", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -1165,24 +1238,24 @@ } }, "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.3" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", + "version": "7.25.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -1191,20 +1264,32 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", + "version": "7.24.8", "dev": true, "license": "MIT", "engines": { @@ -1212,7 +1297,7 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "engines": { @@ -1220,7 +1305,7 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", + "version": "7.24.8", "dev": true, "license": "MIT", "engines": { @@ -1228,62 +1313,76 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.27.1", + "version": "7.25.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.1", - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { - "version": "7.27.2", + "version": "7.25.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.28.2", + "version": "7.25.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers/node_modules/@babel/template": { - "version": "7.27.2", + "version": "7.25.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.0", + "version": "7.25.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.0" + "@babel/types": "^7.25.6" }, "bin": { "parser": "bin/babel-parser.js" @@ -1293,11 +1392,11 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.27.1", + "version": "7.25.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1307,13 +1406,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1615,11 +1714,11 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.27.1", + "version": "7.25.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1734,11 +1833,11 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1764,11 +1863,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1778,11 +1877,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.0", + "version": "7.25.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1792,16 +1891,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.0", + "version": "7.25.4", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/traverse": "^7.25.4", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" @@ -1811,23 +1910,23 @@ } }, "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.3" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/template": "^7.27.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1837,25 +1936,24 @@ } }, "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/template": { - "version": "7.27.2", + "version": "7.25.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.0", + "version": "7.24.8", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1865,12 +1963,12 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1880,11 +1978,11 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1894,11 +1992,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1908,12 +2007,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1923,13 +2022,13 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.27.1", + "version": "7.25.1", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.1" }, "engines": { "node": ">=6.9.0" @@ -1939,11 +2038,11 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.27.1", + "version": "7.25.2", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1953,11 +2052,11 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1967,12 +2066,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1982,12 +2081,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", + "version": "7.24.8", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-module-transforms": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-simple-access": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1997,14 +2097,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.27.1", + "version": "7.25.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-module-transforms": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -2014,12 +2114,12 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2029,12 +2129,12 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2044,11 +2144,11 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2058,12 +2158,12 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2073,12 +2173,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.27.1", + "version": "7.24.8", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -2088,11 +2189,11 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.7", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2102,11 +2203,11 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2116,11 +2217,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.24.7", + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" @@ -2130,11 +2232,11 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2171,11 +2273,11 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2185,12 +2287,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2200,11 +2302,11 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2214,11 +2316,11 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2228,11 +2330,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.27.1", + "version": "7.24.8", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -2242,11 +2344,11 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2256,12 +2358,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.27.1", + "version": "7.24.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2381,6 +2483,11 @@ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "dev": true, + "license": "MIT" + }, "node_modules/@babel/runtime": { "version": "7.18.9", "license": "MIT", @@ -2392,15 +2499,20 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.28.2", + "version": "7.25.6", "license": "MIT", "dependencies": { - "core-js-pure": "^3.43.0" + "core-js-pure": "^3.30.2", + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/runtime-corejs3/node_modules/regenerator-runtime": { + "version": "0.14.1", + "license": "MIT" + }, "node_modules/@babel/template": { "version": "7.18.10", "dev": true, @@ -2415,77 +2527,70 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.0", + "version": "7.25.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.0", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.0", - "debug": "^4.3.1" + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.28.0", + "version": "7.25.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.0", - "@babel/types": "^7.28.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" + "@babel/types": "^7.25.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse/node_modules/@babel/template": { - "version": "7.27.2", + "version": "7.25.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", + "version": "0.3.5", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@babel/traverse/node_modules/jsesc": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" }, "engines": { - "node": ">=6" + "node": ">=6.0.0" } }, "node_modules/@babel/types": { - "version": "7.28.2", + "version": "7.25.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" @@ -2522,33 +2627,6 @@ "postcss": "^8.2" } }, - "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { - "version": "2.2.0", - "dev": true, - "license": "CC0-1.0", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss-selector-parser": "^6.0.10" - } - }, - "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@csstools/postcss-color-function": { "version": "1.1.1", "dev": true, @@ -2642,33 +2720,6 @@ "postcss": "^8.2" } }, - "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { - "version": "2.2.0", - "dev": true, - "license": "CC0-1.0", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss-selector-parser": "^6.0.10" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@csstools/postcss-nested-calc": { "version": "1.0.0", "dev": true, @@ -2807,6 +2858,21 @@ "postcss": "^8.2" } }, + "node_modules/@csstools/selector-specificity": { + "version": "2.2.0", + "dev": true, + "license": "CC0-1.0", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.10" + } + }, "node_modules/@ctrl/tinycolor": { "version": "3.6.1", "license": "MIT", @@ -2879,7 +2945,7 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.10", + "version": "0.3.6", "dev": true, "license": "MIT", "dependencies": { @@ -2888,21 +2954,25 @@ } }, "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", + "version": "0.3.5", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", + "version": "1.5.0", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", + "version": "0.3.25", "dev": true, "license": "MIT", "dependencies": { @@ -3647,6 +3717,13 @@ "moment": "^2.29.4" } }, + "node_modules/@ngageoint/md-date-time-picker/node_modules/moment": { + "version": "2.30.1", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/@ngageoint/mgrs-js": { "version": "1.0.0", "license": "MIT", @@ -3856,7 +3933,7 @@ } }, "node_modules/@polka/url": { - "version": "1.0.0-next.29", + "version": "1.0.0-next.28", "dev": true, "license": "MIT" }, @@ -3885,7 +3962,7 @@ } }, "node_modules/@rollup/plugin-commonjs/node_modules/magic-string": { - "version": "0.30.17", + "version": "0.30.11", "dev": true, "license": "MIT", "dependencies": { @@ -3929,17 +4006,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@rollup/plugin-json/node_modules/picomatch": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/@rollup/plugin-node-resolve": { "version": "13.3.0", "dev": true, @@ -3985,25 +4051,14 @@ "dev": true, "license": "MIT" }, - "node_modules/@rollup/plugin-node-resolve/node_modules/picomatch": { - "version": "2.3.1", + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" }, "engines": { "node": ">=14.0.0" @@ -4017,11 +4072,6 @@ } } }, - "node_modules/@scarf/scarf": { - "version": "1.4.0", - "hasInstallScript": true, - "license": "Apache-2.0" - }, "node_modules/@schematics/angular": { "version": "14.2.13", "dev": true, @@ -4043,11 +4093,11 @@ "license": "MIT" }, "node_modules/@swagger-api/apidom-ast": { - "version": "1.0.0-beta.45", + "version": "1.0.0-alpha.9", "license": "Apache-2.0", "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-error": "^1.0.0-beta.45", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-error": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -4055,60 +4105,48 @@ } }, "node_modules/@swagger-api/apidom-core": { - "version": "1.0.0-beta.45", + "version": "1.0.0-alpha.9", "license": "Apache-2.0", "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.0.0-beta.45", - "@swagger-api/apidom-error": "^1.0.0-beta.45", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-ast": "^1.0.0-alpha.9", + "@swagger-api/apidom-error": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", "minim": "~0.23.8", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", - "short-unique-id": "^5.3.2", + "short-unique-id": "^5.0.2", "ts-mixer": "^6.0.3" } }, "node_modules/@swagger-api/apidom-error": { - "version": "1.0.0-beta.45", + "version": "1.0.0-alpha.9", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.20.7" } }, "node_modules/@swagger-api/apidom-json-pointer": { - "version": "1.0.0-beta.45", + "version": "1.0.0-alpha.9", "license": "Apache-2.0", "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-error": "^1.0.0-beta.45", - "@swaggerexpert/json-pointer": "^2.10.1" - } - }, - "node_modules/@swagger-api/apidom-ns-api-design-systems": { - "version": "1.0.0-beta.45", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-error": "^1.0.0-beta.45", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.45", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-error": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", - "ramda-adjunct": "^5.0.0", - "ts-mixer": "^6.0.3" + "ramda-adjunct": "^5.0.0" } }, - "node_modules/@swagger-api/apidom-ns-arazzo-1": { - "version": "1.0.0-beta.45", + "node_modules/@swagger-api/apidom-ns-api-design-systems": { + "version": "1.0.0-alpha.9", "license": "Apache-2.0", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.0-beta.45", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -4116,54 +4154,26 @@ } }, "node_modules/@swagger-api/apidom-ns-asyncapi-2": { - "version": "1.0.0-beta.45", + "version": "1.0.0-alpha.9", "license": "Apache-2.0", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-beta.45", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", "ts-mixer": "^6.0.3" } }, - "node_modules/@swagger-api/apidom-ns-json-schema-2019-09": { - "version": "1.0.0-beta.45", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-error": "^1.0.0-beta.45", - "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-beta.45", - "@types/ramda": "~0.30.0", - "ramda": "~0.30.0", - "ramda-adjunct": "^5.0.0", - "ts-mixer": "^6.0.4" - } - }, - "node_modules/@swagger-api/apidom-ns-json-schema-2020-12": { - "version": "1.0.0-beta.45", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-error": "^1.0.0-beta.45", - "@swagger-api/apidom-ns-json-schema-2019-09": "^1.0.0-beta.45", - "@types/ramda": "~0.30.0", - "ramda": "~0.30.0", - "ramda-adjunct": "^5.0.0", - "ts-mixer": "^6.0.4" - } - }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-4": { - "version": "1.0.0-beta.45", + "version": "1.0.0-alpha.9", "license": "Apache-2.0", "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.0.0-beta.45", - "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-ast": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -4171,13 +4181,14 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-6": { - "version": "1.0.0-beta.45", + "version": "1.0.0-alpha.9", "license": "Apache-2.0", + "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-error": "^1.0.0-beta.45", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.45", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -4185,13 +4196,14 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-7": { - "version": "1.0.0-beta.45", + "version": "1.0.0-alpha.9", "license": "Apache-2.0", + "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-error": "^1.0.0-beta.45", - "@swagger-api/apidom-ns-json-schema-draft-6": "^1.0.0-beta.45", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@swagger-api/apidom-ns-json-schema-draft-6": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -4199,14 +4211,14 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-2": { - "version": "1.0.0-beta.45", + "version": "1.0.0-alpha.9", "license": "Apache-2.0", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-error": "^1.0.0-beta.45", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.45", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -4214,13 +4226,13 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-0": { - "version": "1.0.0-beta.45", + "version": "1.0.0-alpha.9", "license": "Apache-2.0", "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-error": "^1.0.0-beta.45", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.45", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -4228,294 +4240,271 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-1": { - "version": "1.0.0-beta.45", + "version": "1.0.0-alpha.9", "license": "Apache-2.0", "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.0.0-beta.45", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-json-pointer": "^1.0.0-beta.45", - "@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.0-beta.45", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.45", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-ast": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-json-pointer": "^1.0.0-alpha.9", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", "ts-mixer": "^6.0.3" } }, - "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-json": { - "version": "1.0.0-beta.45", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-beta.45", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.45", - "@types/ramda": "~0.30.0", - "ramda": "~0.30.0", - "ramda-adjunct": "^5.0.0" - } - }, - "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-yaml": { - "version": "1.0.0-beta.45", + "node_modules/@swagger-api/apidom-ns-workflows-1": { + "version": "1.0.0-alpha.9", "license": "Apache-2.0", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-beta.45", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.45", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", - "ramda-adjunct": "^5.0.0" + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.3" } }, - "node_modules/@swagger-api/apidom-parser-adapter-arazzo-json-1": { - "version": "1.0.0-beta.45", + "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-json": { + "version": "1.0.0-alpha.9", "license": "Apache-2.0", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.45", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.45", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-alpha.9", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, - "node_modules/@swagger-api/apidom-parser-adapter-arazzo-yaml-1": { - "version": "1.0.0-beta.45", + "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-yaml": { + "version": "1.0.0-alpha.9", "license": "Apache-2.0", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.45", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.45", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-alpha.9", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-json-2": { - "version": "1.0.0-beta.45", + "version": "1.0.0-alpha.9", "license": "Apache-2.0", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.45", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.45", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-alpha.9", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": { - "version": "1.0.0-beta.45", + "version": "1.0.0-alpha.9", "license": "Apache-2.0", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.45", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.45", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-alpha.9", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-json": { - "version": "1.0.0-beta.45", + "version": "1.0.0-alpha.9", "license": "Apache-2.0", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.0.0-beta.45", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-error": "^1.0.0-beta.45", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-ast": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-error": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", - "tree-sitter": "=0.21.1", - "tree-sitter-json": "=0.24.8", - "web-tree-sitter": "=0.24.5" + "tree-sitter": "=0.20.4", + "tree-sitter-json": "=0.20.2", + "web-tree-sitter": "=0.20.3" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-2": { - "version": "1.0.0-beta.45", + "version": "1.0.0-alpha.9", "license": "Apache-2.0", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.45", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.45", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-alpha.9", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-0": { - "version": "1.0.0-beta.45", + "version": "1.0.0-alpha.9", "license": "Apache-2.0", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.45", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.45", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.9", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-1": { - "version": "1.0.0-beta.45", + "version": "1.0.0-alpha.9", "license": "Apache-2.0", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.45", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.45", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.9", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-2": { - "version": "1.0.0-beta.45", + "version": "1.0.0-alpha.9", "license": "Apache-2.0", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.45", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.45", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-alpha.9", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": { - "version": "1.0.0-beta.45", + "version": "1.0.0-alpha.9", "license": "Apache-2.0", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.45", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.45", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.9", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": { - "version": "1.0.0-beta.45", + "version": "1.0.0-alpha.9", "license": "Apache-2.0", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.45", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.45", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.9", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, - "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2": { - "version": "1.0.0-beta.45", + "node_modules/@swagger-api/apidom-parser-adapter-workflows-json-1": { + "version": "1.0.0-alpha.9", "license": "Apache-2.0", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.0.0-beta.45", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-error": "^1.0.0-beta.45", - "@tree-sitter-grammars/tree-sitter-yaml": "=0.7.1", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-ns-workflows-1": "^1.0.0-alpha.9", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", - "ramda-adjunct": "^5.0.0", - "tree-sitter": "=0.22.4", - "web-tree-sitter": "=0.24.5" + "ramda-adjunct": "^5.0.0" } }, - "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2/node_modules/@tree-sitter-grammars/tree-sitter-yaml": { - "version": "0.7.1", - "hasInstallScript": true, - "license": "MIT", + "node_modules/@swagger-api/apidom-parser-adapter-workflows-yaml-1": { + "version": "1.0.0-alpha.9", + "license": "Apache-2.0", "optional": true, "dependencies": { - "node-addon-api": "^8.3.1", - "node-gyp-build": "^4.8.4" - }, - "peerDependencies": { - "tree-sitter": "^0.22.4" - }, - "peerDependenciesMeta": { - "tree-sitter": { - "optional": true - } - } - }, - "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2/node_modules/node-addon-api": { - "version": "8.5.0", - "license": "MIT", - "optional": true, - "engines": { - "node": "^18 || ^20 || >= 21" + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-ns-workflows-1": "^1.0.0-alpha.9", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" } }, - "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2/node_modules/tree-sitter": { - "version": "0.22.4", - "hasInstallScript": true, - "license": "MIT", + "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2": { + "version": "1.0.0-alpha.9", + "license": "Apache-2.0", "optional": true, "dependencies": { - "node-addon-api": "^8.3.0", - "node-gyp-build": "^4.8.4" + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-ast": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "tree-sitter": "=0.20.4", + "tree-sitter-yaml": "=0.5.0", + "web-tree-sitter": "=0.20.3" } }, "node_modules/@swagger-api/apidom-reference": { - "version": "1.0.0-beta.45", + "version": "1.0.0-alpha.9", "license": "Apache-2.0", "dependencies": { - "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.45", - "@swagger-api/apidom-error": "^1.0.0-beta.45", + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-core": "^1.0.0-alpha.9", "@types/ramda": "~0.30.0", - "axios": "^1.9.0", + "axios": "^1.4.0", "minimatch": "^7.4.3", "process": "^0.11.10", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" }, "optionalDependencies": { - "@swagger-api/apidom-json-pointer": "^1.0.0-beta.40 <1.0.0-rc.0", - "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.40 <1.0.0-rc.0", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.40 <1.0.0-rc.0", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.40 <1.0.0-rc.0", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.40 <1.0.0-rc.0", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.40 <1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.0.0-beta.40 <1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.0.0-beta.40 <1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-arazzo-json-1": "^1.0.0-beta.40 <1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-arazzo-yaml-1": "^1.0.0-beta.40 <1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.0.0-beta.40 <1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.0.0-beta.40 <1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.40 <1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.0.0-beta.40 <1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.0.0-beta.40 <1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.0.0-beta.40 <1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.0.0-beta.40 <1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.0.0-beta.40 <1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.0.0-beta.40 <1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-error": "^1.0.0-alpha.1", + "@swagger-api/apidom-json-pointer": "^1.0.0-alpha.1", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-alpha.1", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-alpha.1", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.1", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.1", + "@swagger-api/apidom-ns-workflows-1": "^1.0.0-alpha.1", + "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.0.0-alpha.1", + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.0.0-alpha.1", + "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.0.0-alpha.1", + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.0.0-alpha.1", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.1", + "@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.0.0-alpha.1", + "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.0.0-alpha.1", + "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.0.0-alpha.1", + "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.0.0-alpha.1", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.0.0-alpha.1", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.0.0-alpha.1", + "@swagger-api/apidom-parser-adapter-workflows-json-1": "^1.0.0-alpha.1", + "@swagger-api/apidom-parser-adapter-workflows-yaml-1": "^1.0.0-alpha.1", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.1" } }, "node_modules/@swagger-api/apidom-reference/node_modules/minimatch": { @@ -4531,26 +4520,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@swaggerexpert/cookie": { - "version": "2.0.2", - "license": "Apache-2.0", - "dependencies": { - "apg-lite": "^1.0.3" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/@swaggerexpert/json-pointer": { - "version": "2.10.2", - "license": "Apache-2.0", - "dependencies": { - "apg-lite": "^1.0.4" - }, - "engines": { - "node": ">=12.20.0" - } - }, "node_modules/@tootallnate/once": { "version": "2.0.0", "dev": true, @@ -4560,103 +4529,33 @@ } }, "node_modules/@turf/bbox": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-7.2.0.tgz", - "integrity": "sha512-wzHEjCXlYZiDludDbXkpBSmv8Zu6tPGLmJ1sXQ6qDwpLE1Ew3mcWqt8AaxfTP5QwDNQa3sf2vvgTEzNbPQkCiA==", + "version": "4.7.3", "license": "MIT", "dependencies": { - "@turf/helpers": "^7.2.0", - "@turf/meta": "^7.2.0", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" + "@turf/meta": "^4.7.3" } }, - "node_modules/@turf/bbox/node_modules/@types/geojson": { - "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "license": "MIT" - }, "node_modules/@turf/center": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@turf/center/-/center-7.2.0.tgz", - "integrity": "sha512-UTNp9abQ2kuyRg5gCIGDNwwEQeF3NbpYsd1Q0KW9lwWuzbLVNn0sOwbxjpNF4J2HtMOs5YVOcqNvYyuoa2XrXw==", + "version": "4.3.0", "license": "MIT", "dependencies": { - "@turf/bbox": "^7.2.0", - "@turf/helpers": "^7.2.0", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" + "@turf/bbox": "^4.3.0", + "@turf/helpers": "^4.3.0" } }, - "node_modules/@turf/center/node_modules/@types/geojson": { - "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "license": "MIT" - }, "node_modules/@turf/helpers": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.2.0.tgz", - "integrity": "sha512-cXo7bKNZoa7aC7ydLmUR02oB3IgDe7MxiPuRz3cCtYQHn+BJ6h1tihmamYDWWUlPHgSNF0i3ATc4WmDECZafKw==", - "license": "MIT", - "dependencies": { - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/helpers/node_modules/@types/geojson": { - "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "version": "4.3.0", "license": "MIT" }, "node_modules/@turf/kinks": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@turf/kinks/-/kinks-7.2.0.tgz", - "integrity": "sha512-BtxDxGewJR0Q5WR9HKBSxZhirFX+GEH1rD7/EvgDsHS8e1Y5/vNQQUmXdURjdPa4StzaUBsWRU5T3A356gLbPA==", + "version": "4.3.0", "license": "MIT", "dependencies": { - "@turf/helpers": "^7.2.0", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" + "@turf/helpers": "^4.3.0" } }, - "node_modules/@turf/kinks/node_modules/@types/geojson": { - "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "license": "MIT" - }, "node_modules/@turf/meta": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-7.2.0.tgz", - "integrity": "sha512-igzTdHsQc8TV1RhPuOLVo74Px/hyPrVgVOTgjWQZzt3J9BVseCdpfY/0cJBdlSRI4S/yTmmHl7gAqjhpYH5Yaw==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "^7.2.0", - "@types/geojson": "^7946.0.10" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/meta/node_modules/@types/geojson": { - "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "version": "4.7.4", "license": "MIT" }, "node_modules/@types/angular": { @@ -4665,7 +4564,7 @@ "license": "MIT" }, "node_modules/@types/body-parser": { - "version": "1.19.6", + "version": "1.19.5", "dev": true, "license": "MIT", "dependencies": { @@ -4698,8 +4597,13 @@ "@types/node": "*" } }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, "node_modules/@types/cors": { - "version": "2.8.19", + "version": "2.8.17", "dev": true, "license": "MIT", "dependencies": { @@ -4725,12 +4629,12 @@ } }, "node_modules/@types/estree": { - "version": "1.0.8", + "version": "1.0.5", "dev": true, "license": "MIT" }, "node_modules/@types/express": { - "version": "4.17.23", + "version": "4.17.21", "dev": true, "license": "MIT", "dependencies": { @@ -4741,18 +4645,7 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "5.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/express/node_modules/@types/express-serve-static-core": { - "version": "4.19.6", + "version": "4.19.5", "dev": true, "license": "MIT", "dependencies": { @@ -4784,12 +4677,12 @@ "license": "MIT" }, "node_modules/@types/http-errors": { - "version": "2.0.5", + "version": "2.0.4", "dev": true, "license": "MIT" }, "node_modules/@types/http-proxy": { - "version": "1.17.16", + "version": "1.17.15", "dev": true, "license": "MIT", "dependencies": { @@ -4820,30 +4713,24 @@ "license": "MIT" }, "node_modules/@types/leaflet": { - "version": "1.9.20", - "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.20.tgz", - "integrity": "sha512-rooalPMlk61LCaLOvBF2VIf9M47HgMQqi5xQ9QRi7c8PkdIe0WrIi5IxXUXQjAdL0c+vcQ01mYWbthzmp9GHWw==", + "version": "1.7.4", "license": "MIT", "dependencies": { "@types/geojson": "*" } }, "node_modules/@types/leaflet-editable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/leaflet-editable/-/leaflet-editable-1.2.7.tgz", - "integrity": "sha512-NBuLP6lyjh/RUruKUKEM3oFN46j3dPAGkYwpwZ8OiLGocNoVHJyQQtbODY4ZAsIsGf9eBrvNkTkv3af+kCRyww==", + "version": "1.2.6", "license": "MIT", "dependencies": { - "@types/leaflet": "^1.9" + "@types/leaflet": "*" } }, "node_modules/@types/leaflet.markercluster": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@types/leaflet.markercluster/-/leaflet.markercluster-1.5.6.tgz", - "integrity": "sha512-I7hZjO2+isVXGYWzKxBp8PsCzAYCJBc29qBdFpquOCkS7zFDqUsUvkEOyQHedsk/Cy5tocQzf+Ndorm5W9YKTQ==", + "version": "1.5.3", "license": "MIT", "dependencies": { - "@types/leaflet": "^1.9" + "@types/leaflet": "*" } }, "node_modules/@types/lodash": { @@ -4861,7 +4748,7 @@ "license": "MIT" }, "node_modules/@types/node-forge": { - "version": "1.3.13", + "version": "1.3.11", "dev": true, "license": "MIT", "dependencies": { @@ -4874,7 +4761,7 @@ "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.14.0", + "version": "6.9.15", "dev": true, "license": "MIT" }, @@ -4909,7 +4796,7 @@ "license": "MIT" }, "node_modules/@types/send": { - "version": "0.17.5", + "version": "0.17.4", "dev": true, "license": "MIT", "dependencies": { @@ -4926,7 +4813,7 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.8", + "version": "1.15.7", "dev": true, "license": "MIT", "dependencies": { @@ -4948,7 +4835,7 @@ "license": "MIT" }, "node_modules/@types/ws": { - "version": "8.18.1", + "version": "8.5.12", "dev": true, "license": "MIT", "dependencies": { @@ -5204,16 +5091,8 @@ "node": ">= 0.6" } }, - "node_modules/accepts/node_modules/negotiator": { - "version": "0.6.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/acorn": { - "version": "8.15.0", + "version": "8.12.1", "dev": true, "license": "MIT", "bin": { @@ -5232,7 +5111,7 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.4", + "version": "8.3.3", "dev": true, "license": "MIT", "dependencies": { @@ -5279,7 +5158,7 @@ } }, "node_modules/agentkeepalive": { - "version": "4.6.0", + "version": "4.5.0", "dev": true, "license": "MIT", "dependencies": { @@ -5425,17 +5304,22 @@ } }, "node_modules/ansi-regex": { - "version": "2.1.1", + "version": "5.0.1", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/ansi-styles": { - "version": "2.2.1", + "version": "3.2.1", + "dev": true, "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, "node_modules/anymatch": { @@ -5450,23 +5334,12 @@ "node": ">= 8" } }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/apg-lite": { - "version": "1.0.5", + "version": "1.0.4", "license": "BSD-2-Clause" }, "node_modules/aproba": { - "version": "2.1.0", + "version": "2.0.0", "dev": true, "license": "ISC" }, @@ -5515,12 +5388,12 @@ "license": "BSD-3-Clause" }, "node_modules/array-buffer-byte-length": { - "version": "1.0.2", + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -5535,17 +5408,18 @@ "license": "MIT" }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", + "version": "1.0.3", "dev": true, "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", + "call-bind": "^1.0.5", "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5566,14 +5440,6 @@ "node": ">= 0.8" } }, - "node_modules/async-function": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/asynckit": { "version": "0.4.0", "license": "MIT" @@ -5597,7 +5463,7 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.21", + "version": "10.4.20", "dev": true, "funding": [ { @@ -5615,11 +5481,11 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.1.1", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -5634,6 +5500,7 @@ }, "node_modules/available-typed-arrays": { "version": "1.0.7", + "dev": true, "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -5646,11 +5513,11 @@ } }, "node_modules/axios": { - "version": "1.11.0", + "version": "1.7.7", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", + "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, @@ -5663,10 +5530,55 @@ "js-tokens": "^3.0.2" } }, + "node_modules/babel-code-frame/node_modules/ansi-regex": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-styles": { + "version": "2.2.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/chalk": { + "version": "1.1.3", + "license": "MIT", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/babel-code-frame/node_modules/js-tokens": { "version": "3.0.2", "license": "MIT" }, + "node_modules/babel-code-frame/node_modules/strip-ansi": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/supports-color": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/babel-loader": { "version": "8.2.5", "dev": true, @@ -5864,6 +5776,13 @@ "ms": "2.0.0" } }, + "node_modules/babel-traverse/node_modules/globals": { + "version": "9.18.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/babel-traverse/node_modules/ms": { "version": "2.0.0", "license": "MIT" @@ -5878,11 +5797,18 @@ "to-fast-properties": "^1.0.3" } }, - "node_modules/babylon": { - "version": "6.18.0", + "node_modules/babel-types/node_modules/to-fast-properties": { + "version": "1.0.3", "license": "MIT", - "bin": { - "babylon": "bin/babylon.js" + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babylon": { + "version": "6.18.0", + "license": "MIT", + "bin": { + "babylon": "bin/babylon.js" } }, "node_modules/balanced-match": { @@ -5941,7 +5867,7 @@ }, "node_modules/bl": { "version": "4.1.0", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "buffer": "^5.5.0", @@ -5951,7 +5877,7 @@ }, "node_modules/bl/node_modules/readable-stream": { "version": "3.6.2", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -5964,14 +5890,14 @@ }, "node_modules/bl/node_modules/string_decoder": { "version": "1.3.0", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/body-parser": { - "version": "1.20.3", + "version": "1.20.2", "dev": true, "license": "MIT", "dependencies": { @@ -5983,7 +5909,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.13.0", + "qs": "6.11.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -6007,7 +5933,7 @@ "license": "MIT" }, "node_modules/bonjour-service": { - "version": "1.3.0", + "version": "1.2.1", "dev": true, "license": "MIT", "dependencies": { @@ -6021,7 +5947,7 @@ "license": "ISC" }, "node_modules/brace-expansion": { - "version": "2.0.2", + "version": "2.0.1", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -6039,7 +5965,7 @@ } }, "node_modules/browserslist": { - "version": "4.25.1", + "version": "4.23.3", "dev": true, "funding": [ { @@ -6057,10 +5983,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -6071,7 +5997,7 @@ }, "node_modules/buffer": { "version": "5.7.1", - "dev": true, + "devOptional": true, "funding": [ { "type": "github", @@ -6161,38 +6087,15 @@ } }, "node_modules/call-bind": { - "version": "1.0.8", + "version": "1.0.7", + "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -6227,7 +6130,7 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001731", + "version": "1.0.30001658", "dev": true, "funding": [ { @@ -6246,17 +6149,16 @@ "license": "CC-BY-4.0" }, "node_modules/chalk": { - "version": "1.1.3", + "version": "2.4.2", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, "node_modules/character-entities": { @@ -6398,25 +6300,6 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/clone": { "version": "1.0.4", "dev": true, @@ -6439,18 +6322,15 @@ } }, "node_modules/color-convert": { - "version": "2.0.1", + "version": "1.9.3", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "color-name": "1.1.3" } }, "node_modules/color-name": { - "version": "1.1.4", + "version": "1.1.3", "dev": true, "license": "MIT" }, @@ -6507,22 +6387,30 @@ } }, "node_modules/compression": { - "version": "1.8.1", + "version": "1.7.4", "dev": true, "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", "vary": "~1.1.2" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", "dev": true, @@ -6536,6 +6424,11 @@ "dev": true, "license": "MIT" }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "dev": true, @@ -6606,7 +6499,7 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.7.2", + "version": "0.4.2", "dev": true, "license": "MIT", "engines": { @@ -6702,7 +6595,7 @@ "license": "MIT" }, "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "4.3.2", + "version": "4.2.0", "dev": true, "license": "MIT", "dependencies": { @@ -6712,7 +6605,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", @@ -6738,7 +6631,7 @@ } }, "node_modules/copyfiles/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", "dev": true, "license": "MIT", "dependencies": { @@ -6807,11 +6700,11 @@ "license": "MIT" }, "node_modules/core-js-compat": { - "version": "3.45.0", + "version": "3.38.1", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.25.1" + "browserslist": "^4.23.3" }, "funding": { "type": "opencollective", @@ -6819,7 +6712,7 @@ } }, "node_modules/core-js-pure": { - "version": "3.45.0", + "version": "3.38.1", "hasInstallScript": true, "license": "MIT", "funding": { @@ -6909,6 +6802,30 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/critters/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/critters/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/critters/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/critters/node_modules/parse5": { "version": "6.0.1", "dev": true, @@ -6926,7 +6843,7 @@ } }, "node_modules/cross-spawn": { - "version": "6.0.6", + "version": "6.0.5", "dev": true, "license": "MIT", "dependencies": { @@ -6948,6 +6865,18 @@ "semver": "bin/semver" } }, + "node_modules/css": { + "version": "2.2.4", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, "node_modules/css-blank-pseudo": { "version": "3.0.3", "dev": true, @@ -6965,18 +6894,6 @@ "postcss": "^8.4" } }, - "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/css-has-pseudo": { "version": "3.0.4", "dev": true, @@ -6994,18 +6911,6 @@ "postcss": "^8.4" } }, - "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/css-loader": { "version": "6.7.1", "dev": true, @@ -7031,6 +6936,15 @@ "webpack": "^5.0.0" } }, + "node_modules/css-parse": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "css": "^2.0.0" + } + }, "node_modules/css-prefers-color-scheme": { "version": "6.0.3", "dev": true, @@ -7061,7 +6975,7 @@ } }, "node_modules/css-what": { - "version": "6.2.2", + "version": "6.1.0", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -7075,6 +6989,28 @@ "version": "1.5.1", "license": "MIT" }, + "node_modules/css/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css/node_modules/source-map-resolve": { + "version": "0.5.3", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, "node_modules/cssdb": { "version": "7.11.2", "dev": true, @@ -7123,13 +7059,13 @@ } }, "node_modules/data-view-buffer": { - "version": "1.0.2", + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", + "call-bind": "^1.0.6", "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" + "is-data-view": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -7139,27 +7075,27 @@ } }, "node_modules/data-view-byte-length": { - "version": "1.0.2", + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", + "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" + "is-data-view": "^1.0.1" }, "engines": { "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/inspect-js" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/data-view-byte-offset": { - "version": "1.0.1", + "version": "1.0.0", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", + "call-bind": "^1.0.6", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" }, @@ -7206,6 +7142,20 @@ "node": ">=0.10" } }, + "node_modules/decompress-response": { + "version": "6.0.0", + "license": "MIT", + "optional": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/deep-extend": { "version": "0.6.0", "license": "MIT", @@ -7244,6 +7194,7 @@ }, "node_modules/define-data-property": { "version": "1.1.4", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -7318,6 +7269,14 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "2.0.3", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/detect-node": { "version": "2.1.0", "dev": true, @@ -7328,14 +7287,6 @@ "dev": true, "license": "MIT" }, - "node_modules/diff": { - "version": "4.0.2", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/dir-glob": { "version": "3.0.1", "dev": true, @@ -7416,7 +7367,7 @@ } }, "node_modules/dompurify": { - "version": "2.5.8", + "version": "2.5.6", "license": "(MPL-2.0 OR Apache-2.0)" }, "node_modules/domutils": { @@ -7466,18 +7417,6 @@ "unidragger": "^2.4.0" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/duplexer": { "version": "0.1.2", "dev": true, @@ -7489,7 +7428,7 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.197", + "version": "1.5.17", "dev": true, "license": "ISC" }, @@ -7537,16 +7476,25 @@ "node": ">=0.10.0" } }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "license": "MIT", + "optional": true, + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/engine.io": { - "version": "6.6.4", + "version": "6.5.5", "dev": true, "license": "MIT", "dependencies": { + "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", - "cookie": "~0.7.2", + "cookie": "~0.4.1", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", @@ -7565,7 +7513,7 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.3", + "version": "5.17.1", "dev": true, "license": "MIT", "dependencies": { @@ -7577,14 +7525,11 @@ } }, "node_modules/ent": { - "version": "2.2.2", + "version": "2.2.1", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "punycode": "^1.4.1", - "safe-regex-test": "^1.1.0" + "punycode": "^1.4.1" }, "engines": { "node": ">= 0.4" @@ -7632,64 +7577,56 @@ } }, "node_modules/es-abstract": { - "version": "1.24.0", + "version": "1.23.3", "dev": true, "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", + "is-data-view": "^1.0.1", "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -7699,14 +7636,19 @@ } }, "node_modules/es-define-property": { - "version": "1.0.1", + "version": "1.0.0", + "dev": true, "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, "engines": { "node": ">= 0.4" } }, "node_modules/es-errors": { "version": "1.3.0", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7718,7 +7660,8 @@ "license": "MIT" }, "node_modules/es-object-atoms": { - "version": "1.1.1", + "version": "1.0.0", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -7728,26 +7671,26 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.1.0", + "version": "2.0.3", + "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", + "get-intrinsic": "^1.2.4", "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-to-primitive": { - "version": "1.3.0", + "version": "1.2.1", "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -8028,7 +7971,7 @@ } }, "node_modules/execa/node_modules/cross-spawn": { - "version": "7.0.6", + "version": "7.0.3", "dev": true, "license": "MIT", "dependencies": { @@ -8096,42 +8039,50 @@ "version": "2.1.1", "license": "MIT" }, + "node_modules/expand-template": { + "version": "2.0.3", + "license": "(MIT OR WTFPL)", + "optional": true, + "engines": { + "node": ">=6" + } + }, "node_modules/exponential-backoff": { - "version": "3.1.2", + "version": "3.1.1", "dev": true, "license": "Apache-2.0" }, "node_modules/express": { - "version": "4.21.2", + "version": "4.19.2", "dev": true, "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.7.1", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", + "finalhandler": "1.2.0", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", + "merge-descriptors": "1.0.1", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", + "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -8140,14 +8091,10 @@ }, "engines": { "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/cookie": { - "version": "0.7.1", + "version": "0.6.0", "dev": true, "license": "MIT", "engines": { @@ -8162,21 +8109,13 @@ "ms": "2.0.0" } }, - "node_modules/express/node_modules/encodeurl": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/express/node_modules/finalhandler": { - "version": "1.3.1", + "version": "1.2.0", "dev": true, "license": "MIT", "dependencies": { "debug": "2.6.9", - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -8230,7 +8169,7 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.3", + "version": "3.3.2", "dev": true, "license": "MIT", "dependencies": { @@ -8238,7 +8177,7 @@ "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.8" + "micromatch": "^4.0.4" }, "engines": { "node": ">=8.6.0" @@ -8253,19 +8192,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.6", + "version": "3.0.1", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" + "license": "MIT" }, "node_modules/fastest-levenshtein": { "version": "1.0.16", @@ -8280,7 +8209,7 @@ "license": "MIT" }, "node_modules/fastq": { - "version": "1.19.1", + "version": "1.17.1", "dev": true, "license": "ISC", "dependencies": { @@ -8421,7 +8350,7 @@ } }, "node_modules/flatted": { - "version": "3.3.3", + "version": "3.3.1", "dev": true, "license": "ISC" }, @@ -8434,7 +8363,7 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.11", + "version": "1.15.9", "funding": [ { "type": "individual", @@ -8459,26 +8388,19 @@ } }, "node_modules/for-each": { - "version": "0.3.5", + "version": "0.3.3", + "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "is-callable": "^1.1.3" } }, "node_modules/form-data": { - "version": "4.0.4", + "version": "4.0.0", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -8519,6 +8441,11 @@ "node": ">= 0.6" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "license": "MIT", + "optional": true + }, "node_modules/fs-extra": { "version": "8.1.0", "dev": true, @@ -8544,7 +8471,7 @@ } }, "node_modules/fs-monkey": { - "version": "1.1.0", + "version": "1.0.6", "dev": true, "license": "Unlicense" }, @@ -8567,22 +8494,21 @@ }, "node_modules/function-bind": { "version": "1.1.2", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/function.prototype.name": { - "version": "1.1.8", + "version": "1.1.6", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -8617,25 +8543,6 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/gauge/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "dev": true, @@ -8653,19 +8560,15 @@ } }, "node_modules/get-intrinsic": { - "version": "1.3.0", + "version": "1.2.4", + "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -8682,17 +8585,6 @@ "node": ">=8.0.0" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/get-size": { "version": "2.0.3", "license": "MIT" @@ -8709,13 +8601,13 @@ } }, "node_modules/get-symbol-description": { - "version": "1.1.0", + "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", + "call-bind": "^1.0.5", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -8724,6 +8616,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/github-from-package": { + "version": "0.0.0", + "license": "MIT", + "optional": true + }, "node_modules/glob": { "version": "8.0.3", "dev": true, @@ -8759,10 +8656,11 @@ "license": "BSD-2-Clause" }, "node_modules/globals": { - "version": "9.18.0", + "version": "11.12.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, "node_modules/globalthis": { @@ -8799,10 +8697,11 @@ } }, "node_modules/gopd": { - "version": "1.2.0", + "version": "1.0.1", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "get-intrinsic": "^1.1.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8849,27 +8748,32 @@ "node": ">=0.10.0" } }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/has-bigints": { - "version": "1.1.0", + "version": "1.0.2", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { - "version": "4.0.0", + "version": "3.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/has-property-descriptors": { "version": "1.0.2", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -8879,12 +8783,9 @@ } }, "node_modules/has-proto": { - "version": "1.2.0", + "version": "1.0.3", "dev": true, "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, "engines": { "node": ">= 0.4" }, @@ -8893,7 +8794,8 @@ } }, "node_modules/has-symbols": { - "version": "1.1.0", + "version": "1.0.3", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8904,6 +8806,7 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", + "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -8922,6 +8825,7 @@ }, "node_modules/hasown": { "version": "2.0.2", + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -8983,10 +8887,6 @@ "node": "*" } }, - "node_modules/highlightjs-vue": { - "version": "1.0.0", - "license": "CC0-1.0" - }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "license": "BSD-3-Clause", @@ -9057,7 +8957,7 @@ } }, "node_modules/html-entities": { - "version": "2.6.0", + "version": "2.5.2", "dev": true, "funding": [ { @@ -9238,7 +9138,7 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.2.0", + "version": "4.1.1", "dev": true, "license": "BSD-2-Clause" }, @@ -9271,7 +9171,7 @@ } }, "node_modules/http-parser-js": { - "version": "0.5.10", + "version": "0.5.8", "dev": true, "license": "MIT" }, @@ -9302,7 +9202,7 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.9", + "version": "2.0.6", "dev": true, "license": "MIT", "dependencies": { @@ -9428,7 +9328,7 @@ "license": "MIT" }, "node_modules/import-fresh": { - "version": "3.3.1", + "version": "3.3.0", "dev": true, "license": "MIT", "dependencies": { @@ -9493,7 +9393,7 @@ } }, "node_modules/injection-js": { - "version": "2.5.0", + "version": "2.4.0", "dev": true, "license": "MIT", "dependencies": { @@ -9529,14 +9429,6 @@ "node": ">=12.0.0" } }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/inquirer/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, @@ -9566,13 +9458,26 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "6.0.1", + "node_modules/inquirer/node_modules/color-convert": { + "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "color-name": "~1.1.4" }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/inquirer/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -9589,13 +9494,13 @@ } }, "node_modules/internal-slot": { - "version": "1.1.0", + "version": "1.0.7", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" + "hasown": "^2.0.0", + "side-channel": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -9649,13 +9554,12 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.5", + "version": "3.0.4", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -9669,33 +9573,12 @@ "dev": true, "license": "MIT" }, - "node_modules/is-async-function": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-bigint": { - "version": "1.1.0", + "version": "1.0.4", "dev": true, "license": "MIT", "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "has-bigints": "^1.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9713,12 +9596,12 @@ } }, "node_modules/is-boolean-object": { - "version": "1.2.2", + "version": "1.1.2", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -9743,6 +9626,7 @@ }, "node_modules/is-callable": { "version": "1.2.7", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -9752,7 +9636,7 @@ } }, "node_modules/is-core-module": { - "version": "2.16.1", + "version": "2.15.1", "dev": true, "license": "MIT", "dependencies": { @@ -9766,12 +9650,10 @@ } }, "node_modules/is-data-view": { - "version": "1.0.2", + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" }, "engines": { @@ -9782,12 +9664,11 @@ } }, "node_modules/is-date-object": { - "version": "1.1.0", + "version": "1.0.5", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -9834,20 +9715,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "dev": true, @@ -9856,23 +9723,6 @@ "node": ">=8" } }, - "node_modules/is-generator-function": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-glob": { "version": "4.0.3", "dev": true, @@ -9905,17 +9755,6 @@ "dev": true, "license": "MIT" }, - "node_modules/is-map": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-module": { "version": "1.0.0", "dev": true, @@ -9941,12 +9780,11 @@ } }, "node_modules/is-number-object": { - "version": "1.1.1", + "version": "1.0.7", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -9997,14 +9835,12 @@ } }, "node_modules/is-regex": { - "version": "1.2.1", + "version": "1.1.4", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -10013,10 +9849,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-set": { - "version": "2.0.3", + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, "engines": { "node": ">= 0.4" }, @@ -10024,34 +9863,19 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "1.1.0", + "node_modules/is-stream": { + "version": "1.1.0", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-string": { - "version": "1.1.1", + "version": "1.0.7", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -10061,13 +9885,11 @@ } }, "node_modules/is-symbol": { - "version": "1.1.1", + "version": "1.0.4", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" + "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -10077,10 +9899,11 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.15", + "version": "1.1.13", + "dev": true, "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.16" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -10100,41 +9923,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-weakref": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", + "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10241,6 +10035,14 @@ "node": ">=10" } }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/istanbul-lib-report/node_modules/make-dir": { "version": "4.0.0", "dev": true, @@ -10317,6 +10119,14 @@ "node": ">= 10.13.0" } }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "dev": true, @@ -10468,7 +10278,7 @@ } }, "node_modules/karma-chrome-launcher": { - "version": "3.2.0", + "version": "3.1.1", "dev": true, "license": "MIT", "dependencies": { @@ -10507,7 +10317,7 @@ } }, "node_modules/karma-coverage-istanbul-reporter/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", "dev": true, "license": "MIT", "dependencies": { @@ -10616,7 +10426,7 @@ } }, "node_modules/karma-coverage/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", "dev": true, "license": "MIT", "dependencies": { @@ -10668,7 +10478,7 @@ } }, "node_modules/karma/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", "dev": true, "license": "MIT", "dependencies": { @@ -10726,7 +10536,7 @@ } }, "node_modules/karma/node_modules/tmp": { - "version": "0.2.4", + "version": "0.2.3", "dev": true, "license": "MIT", "engines": { @@ -10775,15 +10585,11 @@ } }, "node_modules/leaflet": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", - "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", + "version": "1.7.1", "license": "BSD-2-Clause" }, "node_modules/leaflet-editable": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/leaflet-editable/-/leaflet-editable-1.3.2.tgz", - "integrity": "sha512-iDTXR0byKWRiPliNrQrmZtbHHrr/ONZwoFoIzUHP2MQJQwgqzeblc1OKrT0ryOEzf0PFtrClk9SksAbeQpsmXw==", + "version": "1.2.0", "license": "WTFPL" }, "node_modules/leaflet.markercluster": { @@ -11027,6 +10833,30 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/log-symbols/node_modules/supports-color": { "version": "7.2.0", "dev": true, @@ -11214,13 +11044,6 @@ "@material/typography": "^3.1.0" } }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/media-typer": { "version": "0.3.0", "dev": true, @@ -11265,12 +11088,9 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.3", + "version": "1.0.1", "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, "node_modules/merge-stream": { "version": "2.0.0", @@ -11309,17 +11129,6 @@ "node": ">=8.6" } }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/mime": { "version": "2.6.0", "dev": true, @@ -11356,6 +11165,17 @@ "node": ">=6" } }, + "node_modules/mimic-response": { + "version": "3.1.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mini-css-extract-plugin": { "version": "2.6.1", "dev": true, @@ -11406,7 +11226,7 @@ "license": "MIT" }, "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.3.2", + "version": "4.2.0", "dev": true, "license": "MIT", "dependencies": { @@ -11416,7 +11236,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", @@ -11451,7 +11271,7 @@ }, "node_modules/minimist": { "version": "1.2.8", - "dev": true, + "devOptional": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11570,10 +11390,13 @@ "node": ">=10" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "license": "MIT", + "optional": true + }, "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "version": "2.22.2", "license": "MIT", "engines": { "node": "*" @@ -11609,8 +11432,13 @@ "dev": true, "license": "ISC" }, + "node_modules/nan": { + "version": "2.20.0", + "license": "MIT", + "optional": true + }, "node_modules/nanoid": { - "version": "3.3.11", + "version": "3.3.7", "dev": true, "funding": [ { @@ -11626,6 +11454,11 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "license": "MIT", + "optional": true + }, "node_modules/needle": { "version": "3.3.1", "dev": true, @@ -11655,7 +11488,7 @@ } }, "node_modules/negotiator": { - "version": "0.6.4", + "version": "0.6.3", "dev": true, "license": "MIT", "engines": { @@ -11738,6 +11571,15 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ng-packagr/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/ng-packagr/node_modules/commander": { "version": "9.5.0", "dev": true, @@ -11751,6 +11593,62 @@ "dev": true, "license": "MIT" }, + "node_modules/ng-packagr/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ng-packagr/node_modules/sax": { + "version": "1.2.4", + "dev": true, + "license": "ISC" + }, + "node_modules/ng-packagr/node_modules/stylus": { + "version": "0.59.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.0.1", + "debug": "^4.3.2", + "glob": "^7.1.6", + "sax": "~1.2.4", + "source-map": "^0.7.3" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://opencollective.com/stylus" + } + }, + "node_modules/ng-packagr/node_modules/stylus/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/ngx-build-plus": { "version": "14.0.0", "dev": true, @@ -11788,6 +11686,20 @@ "@angular/material": "^12.0.0 || ^13.0.0 || ^14.0.0" } }, + "node_modules/nice-napi": { + "version": "1.0.2", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "!win32" + ], + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, "node_modules/nice-try": { "version": "1.0.5", "dev": true, @@ -11801,10 +11713,27 @@ "lower-case": "^1.1.1" } }, + "node_modules/node-abi": { + "version": "3.67.0", + "license": "MIT", + "optional": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/node-abort-controller": { "version": "3.1.1", "license": "MIT" }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/node-domexception": { "version": "1.0.0", "funding": [ @@ -11878,7 +11807,8 @@ } }, "node_modules/node-gyp-build": { - "version": "4.8.4", + "version": "4.8.2", + "dev": true, "license": "MIT", "optional": true, "bin": { @@ -11888,7 +11818,7 @@ } }, "node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", "dev": true, "license": "MIT", "dependencies": { @@ -11941,7 +11871,7 @@ } }, "node_modules/node-releases": { - "version": "2.0.19", + "version": "2.0.18", "dev": true, "license": "MIT" }, @@ -12127,19 +12057,8 @@ "node": ">= 4" } }, - "node_modules/npm-run-all/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/npm-run-all/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", "dev": true, "license": "MIT", "dependencies": { @@ -12147,75 +12066,30 @@ "concat-map": "0.0.1" } }, - "node_modules/npm-run-all/node_modules/chalk": { - "version": "2.4.2", + "node_modules/npm-run-all/node_modules/minimatch": { + "version": "3.1.2", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=4" + "node": "*" } }, - "node_modules/npm-run-all/node_modules/color-convert": { - "version": "1.9.3", + "node_modules/npm-run-path": { + "version": "4.0.1", "dev": true, "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/npm-run-all/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/npm-run-all/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-all/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm-run-all/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "3.1.1", + "node_modules/npm-run-path/node_modules/path-key": { + "version": "3.1.1", "dev": true, "license": "MIT", "engines": { @@ -12255,7 +12129,7 @@ } }, "node_modules/object-inspect": { - "version": "1.13.4", + "version": "1.13.2", "dev": true, "license": "MIT", "engines": { @@ -12274,15 +12148,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.7", + "version": "4.1.5", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bind": "^1.0.5", "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { @@ -12309,7 +12181,7 @@ } }, "node_modules/on-headers": { - "version": "1.1.0", + "version": "1.0.2", "dev": true, "license": "MIT", "engines": { @@ -12318,7 +12190,7 @@ }, "node_modules/once": { "version": "1.4.0", - "dev": true, + "devOptional": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -12355,20 +12227,20 @@ } }, "node_modules/openapi-path-templating": { - "version": "2.2.1", + "version": "1.6.0", "license": "Apache-2.0", "dependencies": { - "apg-lite": "^1.0.4" + "apg-lite": "^1.0.3" }, "engines": { "node": ">=12.20.0" } }, "node_modules/openapi-server-url-templating": { - "version": "1.3.0", + "version": "1.1.0", "license": "Apache-2.0", "dependencies": { - "apg-lite": "^1.0.4" + "apg-lite": "^1.0.3" }, "engines": { "node": ">=12.20.0" @@ -12404,14 +12276,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/ora/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, @@ -12441,13 +12305,26 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "6.0.1", + "node_modules/ora/node_modules/color-convert": { + "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "color-name": "~1.1.4" }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ora/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -12471,22 +12348,6 @@ "node": ">=0.10.0" } }, - "node_modules/own-keys": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/p-limit": { "version": "2.3.0", "dev": true, @@ -12594,10 +12455,7 @@ "license": "(MIT AND Zlib)" }, "node_modules/papaparse": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.3.tgz", - "integrity": "sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==", - "license": "MIT" + "version": "4.1.4" }, "node_modules/param-case": { "version": "2.1.1", @@ -12768,7 +12626,7 @@ "license": "MIT" }, "node_modules/path-to-regexp": { - "version": "0.1.12", + "version": "0.1.7", "dev": true, "license": "MIT" }, @@ -12785,16 +12643,16 @@ "license": "MIT" }, "node_modules/picocolors": { - "version": "1.1.1", + "version": "1.1.0", "dev": true, "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.3", + "version": "2.3.1", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -12844,7 +12702,8 @@ } }, "node_modules/possible-typed-array-names": { - "version": "1.1.0", + "version": "1.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -12895,18 +12754,6 @@ "postcss": "^8.2" } }, - "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-clamp": { "version": "4.1.0", "dev": true, @@ -13029,18 +12876,6 @@ "postcss": "^8.3" } }, - "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-dir-pseudo-class": { "version": "6.0.5", "dev": true, @@ -13059,18 +12894,6 @@ "postcss": "^8.2" } }, - "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-double-position-gradients": { "version": "3.1.2", "dev": true, @@ -13118,18 +12941,6 @@ "postcss": "^8.4" } }, - "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-focus-within": { "version": "5.0.4", "dev": true, @@ -13144,18 +12955,6 @@ "postcss": "^8.4" } }, - "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-font-variant": { "version": "5.0.0", "dev": true, @@ -13295,12 +13094,12 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.2.0", + "version": "4.0.5", "dev": true, "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", + "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.1.0" }, "engines": { @@ -13311,11 +13110,11 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.2.1", + "version": "3.2.0", "dev": true, "license": "ISC", "dependencies": { - "postcss-selector-parser": "^7.0.0" + "postcss-selector-parser": "^6.0.4" }, "engines": { "node": "^10 || ^12 || >= 14" @@ -13357,33 +13156,6 @@ "postcss": "^8.2" } }, - "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { - "version": "2.2.0", - "dev": true, - "license": "CC0-1.0", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss-selector-parser": "^6.0.10" - } - }, - "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-opacity-percentage": { "version": "1.1.3", "dev": true, @@ -13533,18 +13305,6 @@ "postcss": "^8.2" } }, - "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-replace-overflow-wrap": { "version": "4.0.0", "dev": true, @@ -13571,20 +13331,8 @@ "postcss": "^8.2" } }, - "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-selector-parser": { - "version": "7.1.0", + "version": "6.1.2", "dev": true, "license": "MIT", "dependencies": { @@ -13613,7 +13361,7 @@ } }, "node_modules/postcss-url/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", "dev": true, "license": "MIT", "dependencies": { @@ -13648,6 +13396,31 @@ "dev": true, "license": "MIT" }, + "node_modules/prebuild-install": { + "version": "7.1.2", + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/pretty-bytes": { "version": "5.6.0", "dev": true, @@ -13669,7 +13442,7 @@ } }, "node_modules/prismjs": { - "version": "1.30.0", + "version": "1.29.0", "license": "MIT", "engines": { "node": ">=6" @@ -13777,6 +13550,15 @@ "license": "MIT", "optional": true }, + "node_modules/pump": { + "version": "3.0.0", + "license": "MIT", + "optional": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "1.4.1", "dev": true, @@ -13791,11 +13573,11 @@ } }, "node_modules/qs": { - "version": "6.13.0", + "version": "6.11.0", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.0.4" }, "engines": { "node": ">=0.6" @@ -13889,6 +13671,25 @@ "node": ">= 0.8" } }, + "node_modules/rc": { + "version": "1.2.8", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "optional": 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", + "license": "ISC", + "optional": true + }, "node_modules/react": { "version": "15.7.0", "license": "MIT", @@ -14002,12 +13803,11 @@ } }, "node_modules/react-syntax-highlighter": { - "version": "15.6.1", + "version": "15.5.0", "license": "MIT", "dependencies": { "@babel/runtime": "^7.3.1", "highlight.js": "^10.4.1", - "highlightjs-vue": "^1.0.0", "lowlight": "^1.17.0", "prismjs": "^1.27.0", "refractor": "^3.6.0" @@ -14136,17 +13936,6 @@ "node": ">=8.10.0" } }, - "node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/recast": { "version": "0.11.23", "dev": true, @@ -14217,34 +14006,13 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "dev": true, + "node_modules/refractor": { + "version": "3.6.0", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/refractor": { - "version": "3.6.0", - "license": "MIT", - "dependencies": { - "hastscript": "^6.0.0", - "parse-entities": "^2.0.0", - "prismjs": "~1.27.0" + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.27.0" }, "funding": { "type": "github", @@ -14264,7 +14032,7 @@ "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", + "version": "10.1.1", "dev": true, "license": "MIT", "dependencies": { @@ -14278,22 +14046,28 @@ "version": "0.13.9", "license": "MIT" }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, "node_modules/regex-parser": { - "version": "2.3.1", + "version": "2.3.0", "dev": true, "license": "MIT" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.4", + "version": "1.5.2", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", + "call-bind": "^1.0.6", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -14303,14 +14077,14 @@ } }, "node_modules/regexpu-core": { - "version": "6.2.0", + "version": "5.3.2", "dev": true, "license": "MIT", "dependencies": { + "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", - "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, @@ -14318,31 +14092,22 @@ "node": ">=4" } }, - "node_modules/regjsgen": { - "version": "0.8.0", - "dev": true, - "license": "MIT" - }, "node_modules/regjsparser": { - "version": "0.12.0", + "version": "0.9.1", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~3.0.2" + "jsesc": "~0.5.0" }, "bin": { "regjsparser": "bin/parser" } }, "node_modules/regjsparser/node_modules/jsesc": { - "version": "3.0.2", + "version": "0.5.0", "dev": true, - "license": "MIT", "bin": { "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" } }, "node_modules/relateurl": { @@ -14379,25 +14144,6 @@ "strip-ansi": "^6.0.1" } }, - "node_modules/renderkid/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/renderkid/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/repeat-string": { "version": "1.6.1", "license": "MIT", @@ -14453,6 +14199,12 @@ "node": ">=8" } }, + "node_modules/resolve-url": { + "version": "0.2.1", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/resolve-url-loader": { "version": "5.0.0", "dev": true, @@ -14510,7 +14262,7 @@ } }, "node_modules/reusify": { - "version": "1.1.0", + "version": "1.0.4", "dev": true, "license": "MIT", "engines": { @@ -14538,7 +14290,7 @@ } }, "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", "dev": true, "license": "MIT", "dependencies": { @@ -14577,7 +14329,7 @@ } }, "node_modules/rollup": { - "version": "2.79.2", + "version": "2.79.1", "dev": true, "license": "MIT", "bin": { @@ -14637,17 +14389,6 @@ "dev": true, "license": "MIT" }, - "node_modules/rollup-plugin-sourcemaps/node_modules/picomatch": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/run-async": { "version": "2.4.1", "dev": true, @@ -14680,20 +14421,21 @@ }, "node_modules/rxjs": { "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/safe-array-concat": { - "version": "1.1.3", + "version": "1.1.2", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, "engines": { @@ -14726,34 +14468,14 @@ ], "license": "MIT" }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-push-apply/node_modules/isarray": { - "version": "2.0.5", - "dev": true, - "license": "MIT" - }, "node_modules/safe-regex-test": { - "version": "1.1.0", + "version": "1.0.3", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", + "call-bind": "^1.0.6", "es-errors": "^1.3.0", - "is-regex": "^1.2.1" + "is-regex": "^1.1.4" }, "engines": { "node": ">= 0.4" @@ -14874,7 +14596,7 @@ } }, "node_modules/send": { - "version": "0.19.0", + "version": "0.18.0", "dev": true, "license": "MIT", "dependencies": { @@ -15027,27 +14749,19 @@ "license": "ISC" }, "node_modules/serve-static": { - "version": "1.16.2", + "version": "1.15.0", "dev": true, "license": "MIT", "dependencies": { - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.19.0" + "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/serve-static/node_modules/encodeurl": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/set-blocking": { "version": "2.0.0", "dev": true, @@ -15055,6 +14769,7 @@ }, "node_modules/set-function-length": { "version": "1.2.2", + "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -15082,19 +14797,6 @@ "node": ">= 0.4" } }, - "node_modules/set-proto": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setimmediate": { "version": "1.0.5", "license": "MIT" @@ -15105,21 +14807,14 @@ "license": "ISC" }, "node_modules/sha.js": { - "version": "2.4.12", + "version": "2.4.11", "license": "(MIT AND BSD-3-Clause)", "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.0" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" }, "bin": { "sha.js": "bin.js" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/shallow-clone": { @@ -15153,18 +14848,15 @@ } }, "node_modules/shell-quote": { - "version": "1.8.3", + "version": "1.8.1", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/short-unique-id": { - "version": "5.3.2", + "version": "5.2.0", "license": "Apache-2.0", "bin": { "short-unique-id": "bin/short-unique-id", @@ -15172,15 +14864,14 @@ } }, "node_modules/side-channel": { - "version": "1.1.0", + "version": "1.0.6", "dev": true, "license": "MIT", "dependencies": { + "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" }, "engines": { "node": ">= 0.4" @@ -15189,61 +14880,54 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/side-channel-list": { - "version": "1.0.0", + "node_modules/signal-exit": { + "version": "3.0.7", "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "ISC" }, - "node_modules/side-channel-map": { + "node_modules/simple-concat": { "version": "1.0.1", - "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "optional": true }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "dev": true, + "node_modules/simple-get": { + "version": "4.0.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", + "optional": true, "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, "node_modules/sirv": { "version": "1.0.19", "dev": true, @@ -15278,7 +14962,7 @@ } }, "node_modules/socket.io": { - "version": "4.8.1", + "version": "4.7.5", "dev": true, "license": "MIT", "dependencies": { @@ -15286,7 +14970,7 @@ "base64id": "~2.0.0", "cors": "~2.8.5", "debug": "~4.3.2", - "engine.io": "~6.6.0", + "engine.io": "~6.5.2", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.4" }, @@ -15326,7 +15010,7 @@ } }, "node_modules/socks": { - "version": "2.8.6", + "version": "2.8.3", "dev": true, "license": "MIT", "dependencies": { @@ -15360,7 +15044,7 @@ } }, "node_modules/source-map-js": { - "version": "1.2.1", + "version": "1.2.0", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -15424,6 +15108,12 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-url": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/sourcemap-codec": { "version": "1.4.8", "dev": true, @@ -15461,7 +15151,7 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.22", + "version": "3.0.20", "dev": true, "license": "CC0-1.0" }, @@ -15537,18 +15227,6 @@ "node": ">= 0.6" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/stream": { "version": "0.0.2", "license": "MIT", @@ -15587,25 +15265,6 @@ "node": ">=8" } }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/string.prototype.padend": { "version": "3.1.6", "dev": true, @@ -15624,17 +15283,14 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.10", + "version": "1.2.9", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -15644,18 +15300,14 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.9", + "version": "1.0.8", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -15677,13 +15329,14 @@ } }, "node_modules/strip-ansi": { - "version": "3.0.1", + "version": "6.0.1", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/strip-bom": { @@ -15702,15 +15355,27 @@ "node": ">=6" } }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/stylus": { - "version": "0.59.0", + "version": "0.54.8", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@adobe/css-tools": "^4.0.1", - "debug": "^4.3.2", + "css-parse": "~2.0.0", + "debug": "~3.1.0", "glob": "^7.1.6", + "mkdirp": "~1.0.4", + "safer-buffer": "^2.1.2", "sax": "~1.2.4", + "semver": "^6.3.0", "source-map": "^0.7.3" }, "bin": { @@ -15718,9 +15383,6 @@ }, "engines": { "node": "*" - }, - "funding": { - "url": "https://opencollective.com/stylus" } }, "node_modules/stylus-loader": { @@ -15745,18 +15407,29 @@ } }, "node_modules/stylus/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, + "node_modules/stylus/node_modules/debug": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, "node_modules/stylus/node_modules/glob": { "version": "7.2.3", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -15776,6 +15449,7 @@ "version": "3.1.2", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -15783,16 +15457,36 @@ "node": "*" } }, + "node_modules/stylus/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/stylus/node_modules/sax": { "version": "1.2.4", "dev": true, - "license": "ISC" + "license": "ISC", + "peer": true + }, + "node_modules/stylus/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } }, "node_modules/supports-color": { - "version": "2.0.0", + "version": "5.5.0", + "dev": true, "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, "engines": { - "node": ">=0.8.0" + "node": ">=4" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -15807,33 +15501,38 @@ } }, "node_modules/swagger-client": { - "version": "3.35.6", + "version": "3.29.2", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.22.15", - "@scarf/scarf": "=1.4.0", - "@swagger-api/apidom-core": ">=1.0.0-beta.41 <1.0.0-rc.0", - "@swagger-api/apidom-error": ">=1.0.0-beta.41 <1.0.0-rc.0", - "@swagger-api/apidom-json-pointer": ">=1.0.0-beta.41 <1.0.0-rc.0", - "@swagger-api/apidom-ns-openapi-3-1": ">=1.0.0-beta.41 <1.0.0-rc.0", - "@swagger-api/apidom-reference": ">=1.0.0-beta.41 <1.0.0-rc.0", - "@swaggerexpert/cookie": "^2.0.2", + "@swagger-api/apidom-core": ">=1.0.0-alpha.9 <1.0.0-beta.0", + "@swagger-api/apidom-error": ">=1.0.0-alpha.9 <1.0.0-beta.0", + "@swagger-api/apidom-json-pointer": ">=1.0.0-alpha.9 <1.0.0-beta.0", + "@swagger-api/apidom-ns-openapi-3-1": ">=1.0.0-alpha.9 <1.0.0-beta.0", + "@swagger-api/apidom-reference": ">=1.0.0-alpha.9 <1.0.0-beta.0", + "cookie": "~0.6.0", "deepmerge": "~4.3.0", "fast-json-patch": "^3.0.0-1", "js-yaml": "^4.1.0", "neotraverse": "=0.6.18", "node-abort-controller": "^3.1.1", "node-fetch-commonjs": "^3.3.2", - "openapi-path-templating": "^2.2.1", - "openapi-server-url-templating": "^1.3.0", - "ramda": "^0.30.1", - "ramda-adjunct": "^5.1.0" + "openapi-path-templating": "^1.5.1", + "openapi-server-url-templating": "^1.0.0", + "ramda-adjunct": "^5.0.0" } }, "node_modules/swagger-client/node_modules/argparse": { "version": "2.0.1", "license": "Python-2.0" }, + "node_modules/swagger-client/node_modules/cookie": { + "version": "0.6.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/swagger-client/node_modules/js-yaml": { "version": "4.1.0", "license": "MIT", @@ -15925,7 +15624,7 @@ "license": "MIT" }, "node_modules/tapable": { - "version": "2.2.2", + "version": "2.2.1", "dev": true, "license": "MIT", "engines": { @@ -15948,6 +15647,58 @@ "node": ">=10" } }, + "node_modules/tar-fs": { + "version": "2.1.1", + "license": "MIT", + "optional": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "license": "ISC", + "optional": true + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "license": "MIT", + "optional": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar-stream/node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "optional": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/tar/node_modules/minipass": { "version": "5.0.0", "dev": true, @@ -15979,15 +15730,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.14", + "version": "5.3.10", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -16011,51 +15762,19 @@ } } }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "8.17.1", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, "node_modules/terser-webpack-plugin/node_modules/commander": { "version": "2.20.3", "dev": true, "license": "MIT" }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "4.3.2", + "version": "3.3.0", "dev": true, "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { "node": ">= 10.13.0" @@ -16066,12 +15785,12 @@ } }, "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.43.1", + "version": "5.31.6", "dev": true, "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.14.0", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -16101,7 +15820,7 @@ } }, "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", "dev": true, "license": "MIT", "dependencies": { @@ -16221,27 +15940,12 @@ "node": ">=0.6.0" } }, - "node_modules/to-buffer": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "isarray": "^2.0.5", - "safe-buffer": "^5.2.1", - "typed-array-buffer": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/to-buffer/node_modules/isarray": { - "version": "2.0.5", - "license": "MIT" - }, "node_modules/to-fast-properties": { - "version": "1.0.3", + "version": "2.0.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, "node_modules/to-regex-range": { @@ -16284,47 +15988,31 @@ } }, "node_modules/tree-sitter": { - "version": "0.21.1", + "version": "0.20.4", "hasInstallScript": true, "license": "MIT", "optional": true, "dependencies": { - "node-addon-api": "^8.0.0", - "node-gyp-build": "^4.8.0" + "nan": "^2.17.0", + "prebuild-install": "^7.1.1" } }, "node_modules/tree-sitter-json": { - "version": "0.24.8", + "version": "0.20.2", "hasInstallScript": true, "license": "MIT", "optional": true, "dependencies": { - "node-addon-api": "^8.2.2", - "node-gyp-build": "^4.8.2" - }, - "peerDependencies": { - "tree-sitter": "^0.21.1" - }, - "peerDependenciesMeta": { - "tree-sitter": { - "optional": true - } - } - }, - "node_modules/tree-sitter-json/node_modules/node-addon-api": { - "version": "8.5.0", - "license": "MIT", - "optional": true, - "engines": { - "node": "^18 || ^20 || >= 21" + "nan": "^2.18.0" } }, - "node_modules/tree-sitter/node_modules/node-addon-api": { - "version": "8.5.0", + "node_modules/tree-sitter-yaml": { + "version": "0.5.0", + "hasInstallScript": true, "license": "MIT", "optional": true, - "engines": { - "node": "^18 || ^20 || >= 21" + "dependencies": { + "nan": "^2.14.0" } }, "node_modules/ts-mixer": { @@ -16368,19 +16056,8 @@ "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" } }, - "node_modules/tslint/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/tslint/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.11", "dev": true, "license": "MIT", "dependencies": { @@ -16396,32 +16073,14 @@ "node": ">=0.10.0" } }, - "node_modules/tslint/node_modules/chalk": { - "version": "2.4.2", + "node_modules/tslint/node_modules/diff": { + "version": "4.0.2", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, + "license": "BSD-3-Clause", "engines": { - "node": ">=4" - } - }, - "node_modules/tslint/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" + "node": ">=0.3.1" } }, - "node_modules/tslint/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, "node_modules/tslint/node_modules/glob": { "version": "7.2.3", "dev": true, @@ -16441,14 +16100,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tslint/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/tslint/node_modules/minimatch": { "version": "3.1.2", "dev": true, @@ -16479,17 +16130,6 @@ "semver": "bin/semver" } }, - "node_modules/tslint/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/tslint/node_modules/tslib": { "version": "1.14.1", "dev": true, @@ -16515,6 +16155,17 @@ "dev": true, "license": "0BSD" }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/type": { "version": "2.7.3", "license": "ISC" @@ -16543,27 +16194,28 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.3", + "version": "1.0.2", + "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", + "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.3", + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -16573,17 +16225,16 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.4", + "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -16593,16 +16244,16 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.7", + "version": "1.0.6", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", + "has-proto": "^1.0.3", "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" + "possible-typed-array-names": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -16636,7 +16287,7 @@ } }, "node_modules/ua-parser-js": { - "version": "0.7.40", + "version": "0.7.38", "funding": [ { "type": "opencollective", @@ -16652,9 +16303,6 @@ } ], "license": "MIT", - "bin": { - "ua-parser-js": "script/cli.js" - }, "engines": { "node": "*" } @@ -16692,17 +16340,14 @@ "license": "MIT" }, "node_modules/unbox-primitive": { - "version": "1.1.0", + "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", + "call-bind": "^1.0.2", "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -16713,7 +16358,7 @@ "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", + "version": "2.0.0", "dev": true, "license": "MIT", "engines": { @@ -16733,7 +16378,7 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", + "version": "2.1.0", "dev": true, "license": "MIT", "engines": { @@ -16807,7 +16452,7 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.3", + "version": "1.1.0", "dev": true, "funding": [ { @@ -16825,8 +16470,8 @@ ], "license": "MIT", "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -16854,6 +16499,12 @@ "node": ">=6" } }, + "node_modules/urix": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/url-parse": { "version": "1.5.10", "license": "MIT", @@ -16864,7 +16515,7 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/utila": { @@ -16925,7 +16576,7 @@ } }, "node_modules/watchpack": { - "version": "2.4.4", + "version": "2.4.2", "dev": true, "license": "MIT", "dependencies": { @@ -16960,7 +16611,7 @@ } }, "node_modules/web-tree-sitter": { - "version": "0.24.5", + "version": "0.20.3", "license": "MIT", "optional": true }, @@ -17065,6 +16716,22 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/webpack-bundle-analyzer/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, "node_modules/webpack-bundle-analyzer/node_modules/commander": { "version": "7.2.0", "dev": true, @@ -17073,6 +16740,14 @@ "node": ">= 10" } }, + "node_modules/webpack-bundle-analyzer/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/webpack-bundle-analyzer/node_modules/supports-color": { "version": "7.2.0", "dev": true, @@ -17158,7 +16833,7 @@ "license": "MIT" }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.3.2", + "version": "4.2.0", "dev": true, "license": "MIT", "dependencies": { @@ -17168,7 +16843,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", @@ -17261,7 +16936,7 @@ "license": "MIT" }, "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.3.2", + "version": "4.2.0", "dev": true, "license": "MIT", "dependencies": { @@ -17271,7 +16946,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", @@ -17291,7 +16966,7 @@ } }, "node_modules/webpack-sources": { - "version": "3.3.3", + "version": "3.2.3", "dev": true, "license": "MIT", "engines": { @@ -17377,81 +17052,29 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type/node_modules/isarray": { - "version": "2.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/which-collection": { "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-typed-array": { - "version": "1.1.19", + "version": "1.1.15", + "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", "has-tostringtag": "^1.0.2" }, "engines": { @@ -17490,14 +17113,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, @@ -17512,20 +17127,25 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "color-name": "~1.1.4" }, "engines": { - "node": ">=8" + "node": ">=7.0.0" } }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, "node_modules/wrappy": { "version": "1.0.2", - "dev": true, + "devOptional": true, "license": "ISC" }, "node_modules/ws": { @@ -17632,4 +17252,4 @@ "license": "MIT" } } -} \ No newline at end of file +} diff --git a/web-app/package.json b/web-app/package.json index acaf279b7..c74ced303 100644 --- a/web-app/package.json +++ b/web-app/package.json @@ -1,8 +1,8 @@ { "private": true, "name": "@ngageoint/mage.web-app", - "version": "6.5.5", - "description": "The Mage web-app is the UI for interacting with the Mage service in a web browser.", + "version": "6.3.0", + "description": "The MAGE web-app is the UI for interacting with the MAGE service in a web browser.", "keywords": [ "NGA", "mage", @@ -81,12 +81,12 @@ "@ngageoint/md-date-time-picker": "2.3.0", "@ngageoint/mgrs-js": "1.0.0", "@ngneat/input-mask": "6.1.0", - "@turf/center": "7.2.0", - "@turf/helpers": "7.2.0", - "@turf/kinks": "7.2.0", + "@turf/center": "4.3.0", + "@turf/helpers": "4.3.0", + "@turf/kinks": "4.3.0", "@types/geojson": "7946.0.7", - "@types/leaflet-editable": "1.2.7", - "@types/leaflet.markercluster": "1.5.6", + "@types/leaflet-editable": "1.2.6", + "@types/leaflet.markercluster": "1.5.3", "@uirouter/angular": "10.0.0", "@uirouter/angular-hybrid": "14.0.0", "@uirouter/angularjs": "1.0.30", @@ -110,16 +110,16 @@ "jquery-file-download": "1.4.6", "jquery-minicolors": "2.1.10", "js_cols": "1.0.1", - "leaflet": "1.9.4", - "leaflet-editable": "1.3.2", + "leaflet": "1.7.1", + "leaflet-editable": "1.2.0", "leaflet.markercluster": "1.5.3", "lodash": "4.17.21", "material-components-web": "3.2.0", "mgrs": "1.0.0", - "moment": "2.30.1", + "moment": "2.22.2", "ngx-color": "8.0.3", "ngx-mat-select-search": "5.0.0", - "papaparse": "5.5.3", + "papaparse": "4.1.4", "rxjs": "7.8.2", "select2": "4.0.7", "semver": "7.6.2", @@ -146,7 +146,7 @@ "@types/inputmask": "5.0.3", "@types/jasmine": "4.3.1", "@types/jasminewd2": "2.0.10", - "@types/leaflet": "1.9.20", + "@types/leaflet": "1.7.4", "@types/lodash": "4.17.6", "@types/node": "18.11.13", "@types/semver": "7.5.8", @@ -155,7 +155,7 @@ "html-webpack-plugin": "5.5.0", "jasmine-core": "4.5.0", "karma": "6.4.1", - "karma-chrome-launcher": "^3.1.1", + "karma-chrome-launcher": "3.1.1", "karma-coverage": "2.2.0", "karma-coverage-istanbul-reporter": "3.0.3", "karma-jasmine": "5.1.0", diff --git a/web-app/projects/core-lib/README.md b/web-app/projects/core-lib/README.md index cf1ad8cdc..d6627a2d9 100644 --- a/web-app/projects/core-lib/README.md +++ b/web-app/projects/core-lib/README.md @@ -1,4 +1,4 @@ -# Mage Web Core Lib +# MAGE Web Core Lib This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.1.13. @@ -16,7 +16,7 @@ workspace, which should satisfy this library's peer dependencies, or cause an er consuming project does not supply compatible Angular libraries. There are some hangups with that strategy, though, as of version 14 of the Angular suite of packages. -1. One of Mage's dependencies, `@ajsf/material`, requires `rxjs` `^7.0.0`, but `@angular-devkit/*` libraries pin `rxjs` +1. One of MAGE's dependencies, `@ajsf/material`, requires `rxjs` `^7.0.0`, but `@angular-devkit/*` libraries pin `rxjs` to `6.6.7`, which causes TypeScript type conflicts at build time for this DevKit library. There are presently some undesirable `any` casts to overcome the `rxjs` type conflicts. This should be fixed after upgrading to the latest Angular, currently 17, whose `@angular-devkit/core` package pins `rxjs` to `7.8.1`. diff --git a/web-app/projects/core-lib/angular-cli/README.md b/web-app/projects/core-lib/angular-cli/README.md index 6bc8b5956..8f82ec210 100644 --- a/web-app/projects/core-lib/angular-cli/README.md +++ b/web-app/projects/core-lib/angular-cli/README.md @@ -1,7 +1,7 @@ # Angular CLI Integration This subfolder of modules contains Angular CLI integrations, including a [schematic]() and -[builder](), that facilitates creating Mage web plugin bundles. +[builder](), that facilitates creating MAGE web plugin bundles. ## Background Before Angular 13, the Angular [Library](https://angular.dev/tools/libraries/creating-libraries) CLI tools and @@ -12,12 +12,12 @@ at runtime to hook the plugin module into the web app. Angular 13, however, eli [Angular Package Format](https://angular.dev/tools/libraries/angular-package-format) leaving only ECMAScript Module (ESM) outputs, as opposed to a concatenated, resolved bundle. Angular's intention is that libraries are strictly a development time construct, with the hosting application left to resolving, bundling, and tree-shaking the library's -`import` statements. Mage, however, is using Angular libraries differently, creating a bundle that excludes shared +`import` statements. MAGE, however, is using Angular libraries differently, creating a bundle that excludes shared dependencies the host web app provides, but including dependencies specific to the library, such that the host web app -can load the library as one chunk dynamically at runtime. While native ESM could be a possibility for Mage in the -future, a significant amount of evaluation and testing is necessary, and at minimum Mage would require all instances to +can load the library as one chunk dynamically at runtime. While native ESM could be a possibility for MAGE in the +future, a significant amount of evaluation and testing is necessary, and at minimum MAGE would require all instances to run on HTTP/2 to maximize performance. The major issue would be all the transactions required to load the large number -of module entry points that Mage, Angular, Angular Material, and others comprise. Whereas a conventional web app can +of module entry points that MAGE, Angular, Angular Material, and others comprise. Whereas a conventional web app can provide all the shared entry points by bare module specifier to SystemJS's named registry from a single bundle downloaded initially, an ESM app must download each module separately on-demand as the JS engine processes `import` statements. Even with HTTP/2 multiplexing, this could be a serious performance hit. diff --git a/web-app/projects/core-lib/angular-cli/builders/schema.json b/web-app/projects/core-lib/angular-cli/builders/schema.json index 54efa9e33..264f9b022 100644 --- a/web-app/projects/core-lib/angular-cli/builders/schema.json +++ b/web-app/projects/core-lib/angular-cli/builders/schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema", "title": "ng-packagr Target", - "description": "plugin-library target options for Build Architect. Use to build Mage plugin library projects.", + "description": "plugin-library target options for Build Architect. Use to build MAGE plugin library projects.", "type": "object", "properties": { "project": { diff --git a/web-app/projects/core-lib/angular-cli/collection.json b/web-app/projects/core-lib/angular-cli/collection.json index 8794b1494..b10118fd6 100644 --- a/web-app/projects/core-lib/angular-cli/collection.json +++ b/web-app/projects/core-lib/angular-cli/collection.json @@ -6,7 +6,7 @@ "factory": "./schematics/ng-add/index#ngAdd" }, "plugin-library": { - "description": "Generate a new Mage web plugin library project.", + "description": "Generate a new MAGE web plugin library project.", "factory": "./schematics/plugin-library/index#mageWebPluginLibrary", "schema": "../../../node_modules/@schematics/angular/library/schema.json" } diff --git a/web-app/projects/core-lib/package-lock.json b/web-app/projects/core-lib/package-lock.json index 0065313fc..f3ed88fa8 100644 --- a/web-app/projects/core-lib/package-lock.json +++ b/web-app/projects/core-lib/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ngageoint/mage.web-core-lib", - "version": "6.5.5", + "version": "6.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ngageoint/mage.web-core-lib", - "version": "6.5.5", + "version": "6.3.0", "dependencies": { "@rollup/plugin-commonjs": "25.0.8", "@rollup/plugin-node-resolve": "15.3.1", diff --git a/web-app/projects/core-lib/package.json b/web-app/projects/core-lib/package.json index 1e3961086..4da870036 100644 --- a/web-app/projects/core-lib/package.json +++ b/web-app/projects/core-lib/package.json @@ -1,6 +1,6 @@ { "name": "@ngageoint/mage.web-core-lib", - "version": "6.5.5", + "version": "6.3.0", "repository": { "type": "git", "url": "https://github.com/ngageoint/mage-server.git" diff --git a/web-app/src/app/about/about.component.html b/web-app/src/app/about/about.component.html index 84006c6f5..4bb895275 100644 --- a/web-app/src/app/about/about.component.html +++ b/web-app/src/app/about/about.component.html @@ -8,106 +8,76 @@
    -
    -

    - info - What is MAGE? -

    -

    +

    +

    Mage is a dynamic, secure, mobile situational awareness and field data collection platform that supports low-bandwidth and disconnected users. Mage can integrate with existing command centers and common operating - pictures or stand alone as a complete, mission-ready solution. -

    -

    - The Mage mobile app on iOS and Android + pictures or stand alone as a complete, mission-ready solution. The Mage mobile app on iOS and Android allows agents in the field to create and share geo-tagged observations with attached photos, videos, audio, and form data. Mage's data collection forms are easily tailored to suit any team and mission with - custom form fields and map symbologies. -

    -

    - In addition to data collection, the Mage mobile app can optionally + custom form fields and map symbologies. In addition to data collection, the Mage mobile app can optionally report field agents' locations at regular intervals to the Mage server. The Mage server's web app provides a common operating picture of field agents' observations and latest reported locations.

    -
    -
    -

    - get_app - Download the App -

    -
    -
    -

    - api - API Access -

    -

    - Browse and try the MAGE API via Swagger UI. Be cautious when using POST / PUT / DELETE — they affect live data. -

    -
    +
    +
    -
    -

    - settings - System Info +
    +

    + API

    -
    -
    Server{{mageVersion?.major}}.{{mageVersion?.minor}}.{{mageVersion?.micro}}
    -
    Node{{nodeVersion}}
    -
    MongoDB{{mongoVersion}}
    +
    + Browse and try the Mage API live with Swagger UI. Swagger interactive documentation will modify Mage data via API calls; please be careful with POST/PUT/DELETE operations.
    -

    +
    -
    -

    - emoji_objects - Acknowledgements +
    +

    + System

    -

    - Mage is built with the MEAN stack: - MongoDB, - Express, - Angular, and - NodeJS. -

    -

    - Authentication via Passport. Maps via - Maps by Leaflet. -

    -

    +
    Server Version {{mageVersion?.major}}.{{mageVersion?.minor}}.{{mageVersion?.micro}}
    +
    Node Version {{nodeVersion}}
    +
    MongoDB Version {{mongoVersion}}
    +
    -
    -

    - contact_mail - Contact Us +
    +

    + Acknowledgements

    -
    -
    - phone {{adminPhone}} +
    Mage is built with the MEAN stack + MongoDB, + Express, + Angular and + NodeJS.
    -
    - email {{adminEmail}} + +
    Authentication is locked down by + Passport
    -
    -

    - -
    -

    - contact_mail - Contact NGA POC + +
    Maps are powered by + Leaflet +
    +

    +
    +

    + Contact Us

    -
    -
    phone +1-571-557-1121
    - -
    - -
    +

    +1-571-557-1121

    +

    magesuitesupport@nga.mil

    +
    +
    \ No newline at end of file diff --git a/web-app/src/app/about/about.component.scss b/web-app/src/app/about/about.component.scss index 228b6c3d3..ed889ea31 100644 --- a/web-app/src/app/about/about.component.scss +++ b/web-app/src/app/about/about.component.scss @@ -1,125 +1,52 @@ @use '@angular/material' as mat; @import "variables.scss"; -$content-padding: 32px; -$mobile-padding: 16px; - .content { - width: 84%; - padding: $content-padding 8vw; + width: 75vw; + margin: 0 auto; + padding: 32px 0; display: flex; flex-direction: column; - gap: 20px; - - @media (max-width: 600px) { - padding: $mobile-padding 5vw; - gap: 10px; - } + gap: 32px; } .container { display: flex; + flex-direction: row; align-items: center; - justify-content: flex-start; - gap: 12px; - width: 100%; -} - -.title { - font-size: 1.5rem; - font-weight: 500; - - @media (max-width: 600px) { - font-size: 1.25rem; - } -} - -.section { - display: flex; - flex-direction: column; -} - -.section-title { - display: flex; - align-items: center; - gap: 8px; - font-size: 1.4rem; - font-weight: 600; - color: mat.get-color-from-palette($app-primary); - border-bottom: 2px solid mat.get-color-from-palette($app-primary); - padding-bottom: 4px; + justify-content: center; } -.section-icon { - font-size: 1.4rem; +h3 { + width:100%; + text-align:left; + border-bottom: 1px solid #000; + line-height:0.1em; + margin:10px 0 20px; color: mat.get-color-from-palette($app-primary); +} +h3 span { + background:#fff; + padding:0 10px; + border: none; } -.section-text { - font-size: 1rem; - line-height: 1.6; - color: #444; - - a { - color: mat.get-color-from-palette($app-primary); - text-decoration: underline; - } +.title { + margin-left: 16px; } .app-store { display: flex; - gap: 50px; + flex-direction: row; + gap: 16px; align-items: center; - flex-wrap: wrap; - margin: 0 auto; - - @media (max-width: 600px) { - justify-content: center; - } + margin-top: 20px; } .app-store-icon { height: 48px; - - @media (max-width: 600px) { - height: 40px; - } } -.system-info { - display: flex; - flex-wrap: wrap; - gap: 24px; - margin: 0 auto; - - div { - font-size: 0.95rem; - color: #333; - background: #f6f6f6; - padding: 8px 12px; - border-radius: 6px; - } - - .label { - font-weight: 600; - margin-right: 4px; - display: inline-block; - } -} - -.contact-info { - display: flex; - flex-wrap: wrap; - gap: 80px; - - div { - display: flex; - align-items: center; - gap: 8px; - font-size: 0.95rem; - - a { - color: mat.get-color-from-palette($app-primary); - } - } -} +.center-content{ + margin: 0 auto !important; +} \ No newline at end of file diff --git a/web-app/src/app/about/about.component.spec.ts b/web-app/src/app/about/about.component.spec.ts index 265839e89..4e54ac456 100644 --- a/web-app/src/app/about/about.component.spec.ts +++ b/web-app/src/app/about/about.component.spec.ts @@ -1,57 +1,15 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { AboutComponent } from './about.component'; -import { ApiService } from '../api/api.service'; -import { of } from 'rxjs'; -import { Location } from '@angular/common'; -import { MatToolbarModule } from '@angular/material/toolbar'; -import { MatIconModule } from '@angular/material/icon'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; -describe('AboutComponent', () => { +describe('About Component', () => { let component: AboutComponent; let fixture: ComponentFixture; - let mockApiService: jasmine.SpyObj; - let mockLocation: jasmine.SpyObj; - - const MOCK_VERSION = { major: 1, minor: 2, micro: 3 }; - const MOCK_APK = 'app.apk'; - const MOCK_NODE_VERSION = 'v18.0.0'; - const MOCK_MONGO_VERSION = '5.0.0'; - const MOCK_CONTACT_INFO = { - email: 'admin@example.com', - phone: '1234567890', - showDevContact: true - }; - const MOCK_API_RESPONSE_WITH_CONTACT = { - version: MOCK_VERSION, - apk: MOCK_APK, - environment: { - nodeVersion: MOCK_NODE_VERSION, - mongodbVersion: MOCK_MONGO_VERSION - }, - contactInfo: MOCK_CONTACT_INFO - }; - - const MOCK_API_RESPONSE_NO_CONTACT = { - version: { major: 2, minor: 1, micro: 0 }, - apk: 'another.apk', - environment: { - nodeVersion: 'v20.0.0', - mongodbVersion: '6.0.0' - }, - contactInfo: null - }; beforeEach(waitForAsync(() => { - mockApiService = jasmine.createSpyObj('ApiService', ['getApi']); - mockLocation = jasmine.createSpyObj('Location', ['back']); - TestBed.configureTestingModule({ - imports: [MatToolbarModule, MatIconModule], declarations: [AboutComponent], - providers: [ - { provide: ApiService, useValue: mockApiService }, - { provide: Location, useValue: mockLocation } - ] + imports: [HttpClientTestingModule] }).compileComponents(); })); @@ -63,42 +21,4 @@ describe('AboutComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); - - it('should load API data on init with full contact info', () => { - mockApiService.getApi.and.returnValue(of(MOCK_API_RESPONSE_WITH_CONTACT)); - - component.ngOnInit(); - - expect(mockApiService.getApi).toHaveBeenCalled(); - expect(component.mageVersion).toEqual(MOCK_VERSION); - expect(component.apk).toBe(MOCK_APK); - expect(component.nodeVersion).toBe(MOCK_NODE_VERSION); - expect(component.mongoVersion).toBe(MOCK_MONGO_VERSION); - expect(component.adminEmail).toBe(MOCK_CONTACT_INFO.email); - expect(component.adminPhone).toBe(MOCK_CONTACT_INFO.phone); - expect(component.showDevContact).toBeTrue(); - }); - - it('should handle missing contactInfo', () => { - mockApiService.getApi.and.returnValue(of(MOCK_API_RESPONSE_NO_CONTACT)); - - component.ngOnInit(); - - expect(component.mageVersion).toEqual(MOCK_API_RESPONSE_NO_CONTACT.version); - expect(component.apk).toBe(MOCK_API_RESPONSE_NO_CONTACT.apk); - expect(component.nodeVersion).toBe( - MOCK_API_RESPONSE_NO_CONTACT.environment.nodeVersion - ); - expect(component.mongoVersion).toBe( - MOCK_API_RESPONSE_NO_CONTACT.environment.mongodbVersion - ); - expect(component.adminEmail).toBeNull(); - expect(component.adminPhone).toBeNull(); - expect(component.showDevContact).toBeFalse(); - }); - - it('should go back on onBack call', () => { - component.onBack(); - expect(mockLocation.back).toHaveBeenCalled(); - }); }); diff --git a/web-app/src/app/about/about.component.ts b/web-app/src/app/about/about.component.ts index 5ec2bb425..06e4e5e98 100644 --- a/web-app/src/app/about/about.component.ts +++ b/web-app/src/app/about/about.component.ts @@ -1,6 +1,6 @@ import { Component, Inject, OnInit } from '@angular/core'; import { ApiService } from '../api/api.service'; -import {Location} from '@angular/common'; +import { Router } from '@angular/router'; @Component({ selector: 'about', @@ -16,30 +16,22 @@ export class AboutComponent implements OnInit { apk: string nodeVersion: string mongoVersion: string - adminPhone: string = null; - adminEmail: string = null; - showDevContact: boolean = false; constructor( - private _location: Location, - @Inject(ApiService) public apiService: ApiService, + private router: Router, + @Inject(ApiService) public apiService: ApiService ) {} ngOnInit(): void { this.apiService.getApi().subscribe(api =>{ - this.mageVersion = api?.version; - this.apk = api?.apk; - this.nodeVersion = api.environment?.nodeVersion; - this.mongoVersion = api.environment?.mongodbVersion; - if (api.contactInfo) { - this.adminEmail = api.contactInfo?.email ?? null; - this.adminPhone = api.contactInfo?.phone ?? null; - this.showDevContact = api.contactInfo?.showDevContact ?? false; - } + this.mageVersion = api.version; + this.apk = api.apk; + this.nodeVersion = api.environment.nodeVersion; + this.mongoVersion = api.environment.mongodbVersion; }) } onBack(): void { - this._location.back(); + this.router.navigate(['home']); } } diff --git a/web-app/src/app/entities/entities.password.ts b/web-app/src/app/entities/entities.password.ts index 82fa82201..b1c6e2f5d 100644 --- a/web-app/src/app/entities/entities.password.ts +++ b/web-app/src/app/entities/entities.password.ts @@ -11,22 +11,22 @@ export const passwordStrengthScores: { [key: number]: PasswordStrength } = { value: '0' }, 1: { - color: '#FF9800', + color: '#F44336', text: 'Fair', value: '25' }, 2: { - color: '#FFEB3B', + color: '#F44336', text: 'Good', value: '50' }, 3: { - color: '#8BC34A', + color: '#F44336', text: 'Strong', value: '75' }, 4: { - color: '#4CAF50', + color: '#F44336', text: 'Excellent', value: '100' } diff --git a/web-app/src/app/event/event.service.ts b/web-app/src/app/event/event.service.ts index 9f30b846e..4c28414f6 100644 --- a/web-app/src/app/event/event.service.ts +++ b/web-app/src/app/event/event.service.ts @@ -1,15 +1,5 @@ import { Injectable } from "@angular/core"; -import { - Observable, - Subject, - catchError, - combineLatest, - finalize, - map, - of, - take, - tap, -} from "rxjs"; +import { Observable, catchError, combineLatest, finalize, map, of, tap } from "rxjs"; import { FilterService } from "../filter/filter.service"; import { PollingService } from "./polling.service"; import { ObservationService } from "../observation/observation.service"; @@ -17,24 +7,12 @@ import { HttpClient, HttpParams } from "@angular/common/http"; import { LayerService } from "../layer/layer.service"; import { LocationService } from "../user/location/location.service"; import { LocalStorageService } from "../http/local-storage.service"; -import * as _ from "lodash"; -import * as moment from "moment"; +import * as _ from 'lodash' +import * as moment from 'moment' import { FeedService } from "@ngageoint/mage.web-core-lib/feed"; -import { User } from "@ngageoint/mage.web-core-lib/user"; -import { MemberPage, filterChanges } from "./event.types"; -import { - Attachment, - Event, - Filter, - Form, - FormField, - Layer, - Observation, - Team, -} from "../filter/filter.types"; @Injectable({ - providedIn: "root", + providedIn: 'root' }) export class EventService { private observationsChangedListeners: any = []; @@ -46,7 +24,6 @@ export class EventService { private pollingTimeout: any = null; private feedPollTimeout: any = null; private feedSyncStates: any = {}; - private memberSubject = new Subject(); constructor( private pollingService: PollingService, @@ -57,77 +34,61 @@ export class EventService { private locationService: LocationService, private observationService: ObservationService, private localStorageService: LocalStorageService - ) { } + ) {} init() { - this.filterService.addListener(this); - this.pollingService.addListener(this); + this.filterService.addListener(this) + this.pollingService.addListener(this) } destroy() { - this.eventsById = {}; - this.filterService.removeListener(this); - this.pollingService.removeListener(this); + this.eventsById = {} + this.filterService.removeListener(this) + this.pollingService.removeListener(this) if (this.pollingTimeout) { - clearTimeout(this.pollingTimeout); + clearTimeout(this.pollingTimeout) } if (this.feedPollTimeout) { - clearTimeout(this.feedPollTimeout); + clearTimeout(this.feedPollTimeout) } - - this.memberSubject.unsubscribe(); } query(options?: any): Observable { options = options || {}; - let params = new HttpParams(); - - for (const key of Object.keys(options)) { - if (options[key] !== undefined && options[key] !== null) { - params = params.set(key, String(options[key])); - } - } - - if (!options.limit && !options.page_size) { - params = params.set('limit', '100'); - } - - return this.httpClient.get("/api/events/", { params }); + return this.httpClient.get('/api/events/', options) } addFeed(eventId: string, feed: any): Observable { - return this.httpClient.post(`/api/events/${eventId}/feeds`, feed); + return this.httpClient.post(`/api/events/${eventId}/feeds`, feed) } removeFeed(eventId: string, feedId: string): Observable { - return this.httpClient.delete( - `/api/events/${eventId}/feeds/${feedId}` - ); + return this.httpClient.delete(`/api/events/${eventId}/feeds/${feedId}`) } - async onFilterChanged(filter: any) { + onFilterChanged(filter: any) { if (filter.event) { this.onEventChanged(filter.event); } - if (filter.event?.added?.length || filter.timeInterval) { - // requery server - await this.fetch().subscribe(); - } - this.onFiltersChanged(filter); + if (filter.event?.added?.length || filter.timeInterval) { // requery server + this.fetch().subscribe() + } else if (filter.teams) { // filter in memory + this.onTeamsChanged() + } if (filter.actionFilter) { - this.onActionFilterChanged(); + this.onActionFilterChanged() } } - onEventChanged(event: filterChanges) { - const { added = [], removed = [] } = event; + onEventChanged(event: any) { + const { added = [], removed = [] } = event added.forEach((added: any) => { if (!this.eventsById[added.id]) { - this.eventsById[added.id] = JSON.parse(JSON.stringify(added)); + this.eventsById[added.id] = (JSON.parse(JSON.stringify(added))); this.eventsById[added.id].filteredObservationsById = {}; this.eventsById[added.id].observationsById = {}; @@ -137,75 +98,37 @@ export class EventService { this.fetchLayers(added); this.fetchFeeds(added); - }); + }) removed.forEach((removed: any) => { - this.observationsChanged({ - removed: Object.values( - this.eventsById[removed.id]?.filteredObservationsById || {} - ), - }); - this.usersChanged({ - removed: Object.values( - this.eventsById[removed.id]?.filteredUsersById || {} - ), - }); - this.layersChanged( - { - removed: Object.values(this.eventsById[removed.id]?.layersById || {}), - }, - removed - ); - this.feedItemsChanged( - { - removed: Object.values( - this.eventsById[removed.id]?.feedsById || {} - ).map((feed: any) => ({ feed })), - }, - removed - ); + this.observationsChanged({ removed: Object.values(this.eventsById[removed.id]?.filteredObservationsById || {}) }); + this.usersChanged({ removed: Object.values(this.eventsById[removed.id]?.filteredUsersById || {}) }); + this.layersChanged({ removed: Object.values(this.eventsById[removed.id]?.layersById || {}) }, removed); + this.feedItemsChanged({ removed: Object.values(this.eventsById[removed.id]?.feedsById || {}).map((feed: any) => ({ feed })) }, removed); delete this.eventsById[removed.id]; - }); + }) } - /** - * Updates List of Observations and Users when Filter Changes - * @param {Filter} filter Filter Parametes - * @return {void} No Return - */ - - onFiltersChanged(filter: Filter): void { + onTeamsChanged() { const event = this.filterService.getEvent(); if (!event) return; const teamsEvent = this.eventsById[event.id]; if (!teamsEvent) return; - // remove observations that are not made by filtered users + // remove observations that are not part of filtered teams const observationsRemoved = []; - Object.values(teamsEvent.filteredObservationsById).forEach( - (observation: Observation) => { - if ( - (filter.users && - !this.filterService.isUserInList(observation.userId)) || - (filter.teams && - !this.filterService.isUserInTeamFilter(observation.userId)) || - (filter.forms && - !this.filterService.hasFormInList(observation.properties.forms)) - ) { - delete teamsEvent.filteredObservationsById[observation.id]; - observationsRemoved.push(observation); - } + Object.values(teamsEvent.filteredObservationsById).forEach((observation: any) => { + if (!this.filterService.isUserInTeamFilter(observation.userId)) { + delete teamsEvent.filteredObservationsById[observation.id]; + observationsRemoved.push(observation); } - ); + }); // remove users that are not part of filtered teams const usersRemoved = []; - Object.values(teamsEvent.filteredUsersById).forEach((user: User) => { - if ( - (filter.users && !this.filterService.isUserInList(user.id)) || - (filter.teams && !this.filterService.isUserInTeamFilter(user.id)) - ) { + Object.values(teamsEvent.filteredUsersById).forEach((user: any) => { + if (!this.filterService.isUserInTeamFilter(user.id)) { delete teamsEvent.filteredUsersById[user.id]; usersRemoved.push(user); } @@ -213,42 +136,23 @@ export class EventService { // add any observations that are part of the filtered teams const observationsAdded = []; - Object.values(teamsEvent.observationsById).forEach( - (observation: Observation) => { - if ( - filter.users && - this.filterService.isUserInList(observation.userId) && - filter.teams && - this.filterService.isUserInTeamFilter(observation.userId) && - filter.forms && - this.filterService.hasFormInList(observation.properties.forms) && - !teamsEvent.filteredObservationsById[observation.id] - ) { - observationsAdded.push(observation); - teamsEvent.filteredObservationsById[observation.id] = observation; - } + Object.values(teamsEvent.observationsById).forEach((observation: any) => { + if (this.filterService.isUserInTeamFilter(observation.userId) && !teamsEvent.filteredObservationsById[observation.id]) { + observationsAdded.push(observation); + teamsEvent.filteredObservationsById[observation.id] = observation; } - ); + }); // add any users that are part of the filtered teams const usersAdded = []; - Object.values(teamsEvent.usersById).forEach((user: User) => { - if ( - filter.users && - !this.filterService.isUserInList(user.id) && - filter.teams && - !this.filterService.isUserInTeamFilter(user.id) && - !teamsEvent.filteredUsersById[user.id] - ) { + Object.values(teamsEvent.usersById).forEach((user: any) => { + if (this.filterService.isUserInTeamFilter(user.id) && !teamsEvent.filteredUsersById[user.id]) { usersAdded.push(user); teamsEvent.filteredUsersById[user.id] = user; } }); - this.observationsChanged({ - added: observationsAdded, - removed: observationsRemoved, - }); + this.observationsChanged({ added: observationsAdded, removed: observationsRemoved }); this.usersChanged({ added: usersAdded, removed: usersRemoved }); } @@ -259,69 +163,56 @@ export class EventService { const actionEvent = this.eventsById[event.id]; const observationsRemoved = []; - Object.values(actionEvent.filteredObservationsById).forEach( - (observation: Observation) => { - if (!this.filterService.observationInFilter(observation)) { - delete actionEvent.filteredObservationsById[observation.id]; - observationsRemoved.push(observation); - } + Object.values(actionEvent.filteredObservationsById).forEach((observation: any) => { + if (!this.filterService.observationInFilter(observation)) { + delete actionEvent.filteredObservationsById[observation.id]; + observationsRemoved.push(observation); } - ); + }); const observationsAdded = []; // add any observations that are part of the filtered actions - Object.values(actionEvent.observationsById).forEach( - (observation: Observation) => { - if ( - !actionEvent.filteredObservationsById[observation.id] && - this.filterService.observationInFilter(observation) - ) { - observationsAdded.push(observation); - actionEvent.filteredObservationsById[observation.id] = observation; - } + Object.values(actionEvent.observationsById).forEach((observation: any) => { + if (!actionEvent.filteredObservationsById[observation.id] && this.filterService.observationInFilter(observation)) { + observationsAdded.push(observation); + actionEvent.filteredObservationsById[observation.id] = observation; } - ); - - this.observationsChanged({ - added: observationsAdded, - removed: observationsRemoved, }); + + this.observationsChanged({ added: observationsAdded, removed: observationsRemoved }); } onPollingIntervalChanged(interval: any) { if (this.pollingTimeout) { // cancel previous poll - clearTimeout(this.pollingTimeout); + clearTimeout(this.pollingTimeout) } this.pollingTimeout = setTimeout(() => { this.poll(interval); - }, interval); + }, interval) } addObservationsChangedListener(listener: any) { this.observationsChangedListeners.push(listener); - if (typeof listener.onObservationsChanged === "function") { + if (typeof listener.onObservationsChanged === 'function') { Object.values(this.eventsById).forEach((event: any) => { - listener.onObservationsChanged({ - added: Object.values(event.observationsById), - }); + listener.onObservationsChanged({ added: Object.values(event.observationsById) }); }); } } removeObservationsChangedListener(listener) { - this.observationsChangedListeners = - this.observationsChangedListeners.filter((l: any) => { - return listener !== l; - }); + this.observationsChangedListeners = this.observationsChangedListeners.filter((l: any) => { + return listener !== l; + }); } addUsersChangedListener(listener) { this.usersChangedListeners.push(listener); - if (typeof listener.onUsersChanged === "function") { + if (typeof listener.onUsersChanged === 'function') { Object.values(this.eventsById).forEach((event: any) => { listener.onUsersChanged({ added: Object.values(event.usersById) }); }); @@ -337,12 +228,9 @@ export class EventService { addLayersChangedListener(listener) { this.layersChangedListeners.push(listener); - if (typeof listener.onLayersChanged === "function") { + if (typeof listener.onLayersChanged === 'function') { Object.values(this.eventsById).forEach((event: any) => { - listener.onLayersChanged( - { added: Object.values(event.layersById) }, - event - ); // TODO this could be old layers, admin panel might have changed layers + listener.onLayersChanged({ added: Object.values(event.layersById) }, event); // TODO this could be old layers, admin panel might have changed layers }); } } @@ -350,7 +238,7 @@ export class EventService { addFeedItemsChangedListener(listener) { this.feedItemsChangedListeners.push(listener); - if (typeof listener.onFeedItemsChanged === "function") { + if (typeof listener.onFeedItemsChanged === 'function') { Object.values(this.eventsById).forEach((event: any) => { // TODO what do I send here? // listener.onFeedItemsChanged({ added: _.values(event.feedsById) }, event); @@ -369,151 +257,128 @@ export class EventService { } removeLayersChangedListener(listener) { - this.layersChangedListeners = this.layersChangedListeners.filter( - (l: any) => { - return listener !== l; - } - ); + this.layersChangedListeners = this.layersChangedListeners.filter((l: any) => { + return listener !== l; + }); } removeFeedItemsChangedListener(listener) { - this.feedItemsChangedListeners = this.feedItemsChangedListeners.filter( - (l: any) => { - return listener !== l; - } - ); + this.feedItemsChangedListeners = this.feedItemsChangedListeners.filter((l: any) => { + return listener !== l; + }); } getEventById(eventId) { return this.eventsById[eventId]; } - saveObservation(observation: Observation) { + saveObservation(observation: any) { const event = this.eventsById[observation.eventId]; const isNewObservation = !observation.id; - return this.observationService - .saveObservationForEvent(event, observation) + return this.observationService.saveObservationForEvent(event, observation) .pipe( - tap((update: Observation) => { + tap((update: any) => { event.observationsById[update.id] = update; // Check if this new observation passes the current filter if (this.filterService.observationInFilter(update)) { event.filteredObservationsById[update.id] = update; - isNewObservation - ? this.observationsChanged({ added: [update] }) - : this.observationsChanged({ updated: [update] }); + isNewObservation ? this.observationsChanged({ added: [update] }) : this.observationsChanged({ updated: [update] }); } }) - ); + ) } addObservationFavorite(observation) { - let event = this.eventsById[observation.eventId]; - return this.observationService - .addObservationFavorite(event, observation) + var event = this.eventsById[observation.eventId]; + return this.observationService.addObservationFavorite(event, observation) .pipe( - tap((update: Observation) => { + tap((update: any) => { event.observationsById[update.id] = update; this.observationsChanged({ updated: [update] }); }) - ); + ) } removeObservationFavorite(observation) { - let event = this.eventsById[observation.eventId]; - return this.observationService - .removeObservationFavorite(event, observation) + var event = this.eventsById[observation.eventId]; + return this.observationService.removeObservationFavorite(event, observation) .pipe( - tap((update: Observation) => { + tap((update: any) => { event.observationsById[update.id] = update; this.observationsChanged({ updated: [update] }); }) - ); + ) } - markObservationAsImportant( - observation: Observation, - important - ): Observable { - let event = this.eventsById[observation.eventId]; - return this.observationService - .markObservationAsImportantForEvent(event, observation, important) + markObservationAsImportant(observation, important): Observable { + var event = this.eventsById[observation.eventId]; + return this.observationService.markObservationAsImportantForEvent(event, observation, important) .pipe( - tap((update: Observation) => { + tap((update: any) => { event.observationsById[update.id] = update; this.observationsChanged({ updated: [update] }); }) - ); + ) } - clearObservationAsImportant( - observation: Observation - ): Observable { - let event = this.eventsById[observation.eventId]; - return this.observationService - .clearObservationAsImportantForEvent(event, observation) + clearObservationAsImportant(observation): Observable { + var event = this.eventsById[observation.eventId]; + return this.observationService.clearObservationAsImportantForEvent(event, observation) .pipe( - tap((update: Observation) => { + tap((update: any) => { event.observationsById[update.id] = update; this.observationsChanged({ updated: [update] }); }) - ); + ) } - archiveObservation(observation): Observable { - let event = this.eventsById[observation.eventId]; - return this.observationService - .archiveObservationForEvent(event, observation) + archiveObservation(observation): Observable { + var event = this.eventsById[observation.eventId] + return this.observationService.archiveObservationForEvent(event, observation) .pipe( - tap((archived: Observation) => { - delete event.observationsById[archived.id]; - this.observationsChanged({ removed: [archived] }); + tap((archived: any) => { + delete event.observationsById[archived.id] + this.observationsChanged({ removed: [archived] }) }) - ); + ) } - addAttachmentToObservation(observation: Observation, attachment: Attachment) { + addAttachmentToObservation(observation, attachment) { const event = this.eventsById[observation.eventId]; - this.observationService.addAttachmentToObservationForEvent( - event, - observation, - attachment - ); + this.observationService.addAttachmentToObservationForEvent(event, observation, attachment); this.observationsChanged({ updated: [observation] }); } deleteAttachmentForObservation(observation, attachment) { const event = this.eventsById[observation.eventId]; - return this.observationService - .deleteAttachmentInObservationForEvent(event, observation, attachment) - .subscribe((observation: Observation) => { - this.observationsChanged({ updated: [observation] }); - }); + return this.observationService.deleteAttachmentInObservationForEvent(event, observation, attachment).subscribe((observation: any) => { + this.observationsChanged({ updated: [observation] }); + }); } - getFormField(form: Form, fieldName: string) { - return form.fields.find((field: FormField) => field.name === fieldName); + getFormField(form, fieldName) { + return form.fields.find((field: any) => field.name === fieldName); } - getForms(observation: Observation, options?: any) { - let event = this.eventsById[observation.eventId]; + getForms(observation, options?: any) { + var event = this.eventsById[observation.eventId]; return this.getFormsForEvent(event, options); } - getFormsForEvent(event: Event, options?: any) { + getFormsForEvent(event, options?: any) { options = options || {}; - let forms = event.forms; + var forms = event.forms; if (options.archived === false) { - forms = forms.filter((form: Form) => !form.archived); + forms = forms.filter((form: any) => !form.archived); } return forms; } - createForm(observationForm: any, formDefinition: any, viewModel?: any) { - const form = JSON.parse(JSON.stringify(formDefinition)); + createForm(observationForm, formDefinition, viewModel?: any) { + const form = (JSON.parse(JSON.stringify(formDefinition))); form.remoteId = observationForm.id; @@ -522,7 +387,7 @@ export class EventService { for (const [key, value] of Object.entries(observationForm)) { const field = this.getFormField(form, key); if (field) { - if (field.type === "date" && field.value) { + if (field.type === 'date' && field.value) { field.value = moment(value).toDate(); } else { field.value = value; @@ -532,32 +397,19 @@ export class EventService { } if (viewModel) { - observationForm.fields = _.intersection( - observationForm.fields, - existingPropertyFields - ); + observationForm.fields = _.intersection(observationForm.fields, existingPropertyFields); } return form; } - exportForm(event): Observable
    { - return this.httpClient.get(`/api/event/${event.id}/form.zip`); + exportForm(event): Observable { + return this.httpClient.get(`/api/event/${event.id}/form.zip`) } - getMembers(event): Observable { - return this.httpClient - .get(`/api/events/${event.id}/members?page_size=${Number.MAX_SAFE_INTEGER}`) - .pipe( - take(1), - map(res => res.items) - ); - } - - isUserInEvent(user, event): boolean { if (!event) return false; - return event.teams.some((team: Team) => team.userIds.includes(user.id)); + return event.teams.some((team: any) => team.userIds.includes(user.id)); } usersChanged(changed) { @@ -566,19 +418,19 @@ export class EventService { changed.updated = changed.updated || []; changed.removed = changed.removed || []; - if (typeof listener.onUsersChanged === "function") { + if (typeof listener.onUsersChanged === 'function') { listener.onUsersChanged(changed); } }); } - observationsChanged(changed: filterChanges) { + observationsChanged(changed) { this.observationsChangedListeners.forEach((listener: any) => { changed.added = changed.added || []; changed.updated = changed.updated || []; changed.removed = changed.removed || []; - if (typeof listener.onObservationsChanged === "function") { + if (typeof listener.onObservationsChanged === 'function') { listener.onObservationsChanged(changed); } }); @@ -590,7 +442,7 @@ export class EventService { changed.updated = changed.updated || []; changed.removed = changed.removed || []; - if (typeof listener.onLayersChanged === "function") { + if (typeof listener.onLayersChanged === 'function') { listener.onLayersChanged(changed, event); } }); @@ -602,7 +454,7 @@ export class EventService { changed.updated = changed.updated || []; changed.removed = changed.removed || []; - if (typeof listener.onFeedItemsChanged === "function") { + if (typeof listener.onFeedItemsChanged === 'function') { listener.onFeedItemsChanged(changed, event); } }); @@ -610,9 +462,7 @@ export class EventService { fetch(): Observable { const event = this.filterService.getEvent(); - if (!event) { - return of(); - } + if (!event) { return of()} const parameters: any = {}; const interval = this.filterService.getInterval(); @@ -627,89 +477,67 @@ export class EventService { .pipe(map((locations: any) => this.parseLocations(event, locations))), this.observationService .getObservationsForEvent(event, parameters) - .pipe( - map((observations: Observation[]) => - this.parseObservations(event, observations) - ) - ), - ]); + .pipe(map((observations: any) => this.parseObservations(event, observations))) + ]) } fetchLayers(event) { - return this.layerService - .getLayersForEvent(event) - .subscribe((layers: Layer[]) => { - const added = layers.filter((l) => { - return !Object.keys(this.eventsById[event.id].layersById || {}).some( - (layerId: any) => l.id === layerId - ); - }); - - const removed = Object.keys( - this.eventsById[event.id].layersById || {} - ).filter((layerId: any) => { - return !layers.some((l: Layer) => l.id === layerId); - }); - - this.eventsById[event.id].layersById = _.keyBy(layers, "id"); - this.layersChanged({ added: added, removed: removed }, event); - }); + return this.layerService.getLayersForEvent(event).subscribe((layers: any) => { + const added = layers.filter((l) => { + return !Object.keys(this.eventsById[event.id].layersById || {}).some((layerId: any) => l.id === layerId) + }) + + const removed = Object.keys(this.eventsById[event.id].layersById || {}).filter((layerId: any) => { + return !layers.some((l: any) => l.id === layerId); + }) + + this.eventsById[event.id].layersById = _.keyBy(layers, 'id'); + this.layersChanged({ added: added, removed: removed }, event); + }); } fetchFeeds(event) { - this.feedService.fetchFeeds(event.id).subscribe((feeds) => { - this.feedItemsChanged( - { - added: feeds.map((feed) => { - return { - feed, - items: [], - }; - }), - }, - event - ); - - this.eventsById[event.id].feedsById = _.keyBy(feeds, "id"); - this.feedSyncStates = feeds.map((feed) => { + this.feedService.fetchFeeds(event.id).subscribe(feeds => { + this.feedItemsChanged({ + added: feeds.map(feed => { + return { + feed, + items: [] + } + }) + }, event); + + this.eventsById[event.id].feedsById = _.keyBy(feeds, 'id'); + this.feedSyncStates = feeds.map(feed => { return { id: feed.id, - lastSync: 0, - }; + lastSync: 0 + } }); this.pollFeeds(); }); } - parseObservations(event: Event, observations: Observation[]): void { - const added = []; - const updated = []; - const removed = []; + parseObservations(event: any, observations: any): void { + var added = []; + var updated = []; + var removed = []; - const observationsById = {}; - let filteredObservationsById = - this.eventsById[event.id].filteredObservationsById; - observations.forEach((observation: Observation) => { + var observationsById = {}; + var filteredObservationsById = this.eventsById[event.id].filteredObservationsById; + observations.forEach((observation: any) => { // Check if this observation passes the current filter if (this.filterService.observationInFilter(observation)) { // Check if we already have this observation, if so update, otherwise add - let localObservation = filteredObservationsById[observation.id]; + var localObservation = filteredObservationsById[observation.id]; if (localObservation) { if (localObservation.lastModified !== observation.lastModified) { updated.push(observation); } else if (observation.attachments) { - let some = _.some(observation.attachments, function (attachment) { - let localAttachment = _.find( - localObservation.attachments, - function (a) { - return a.id === attachment.id; - } - ); - return ( - !localAttachment || - localAttachment.lastModified !== attachment.lastModified - ); + var some = _.some(observation.attachments, function (attachment) { + var localAttachment = _.find(localObservation.attachments, function (a) { return a.id === attachment.id; }); + return !localAttachment || localAttachment.lastModified !== attachment.lastModified; }); if (some) updated.push(observation); @@ -727,19 +555,15 @@ export class EventService { }); // remaining elements were not pulled from the server, hence we should remove them - removed.push(Object.values(filteredObservationsById)); + removed = Object.values(filteredObservationsById); - this.eventsById[event.id].observationsById = _.keyBy(observations, "id"); + this.eventsById[event.id].observationsById = _.keyBy(observations, 'id'); this.eventsById[event.id].filteredObservationsById = observationsById; - this.observationsChanged({ - added: added, - updated: updated, - removed: removed, - }); + this.observationsChanged({ added: added, updated: updated, removed: removed }); } - parseLocations(event: Event, userLocations: any): void { + parseLocations(event, userLocations: any): void { const added = []; const updated = []; @@ -755,26 +579,21 @@ export class EventService { delete userLocation.locations; if (userLocation.user.iconUrl) { - let params = new HttpParams(); - params = params.append( - "access_token", - this.localStorageService.getToken() - ); - params = params.append("_dc", userLocation.user.lastUpdated); + var params = new HttpParams(); + params = params.append('access_token', this.localStorageService.getToken()) + params = params.append('_dc', userLocation.user.lastUpdated) location.style = { - iconUrl: `${userLocation.user.iconUrl}?${params.toString()}`, - }; + iconUrl: `${userLocation.user.iconUrl}?${params.toString()}` + } } if (this.filterService.isUserInTeamFilter(userLocation.id)) { // Check if we already have this user, if so update, otherwise add const localUser = filteredUsersById[userLocation.id]; if (localUser) { - if ( - userLocation.location.properties.timestamp !== - localUser.location.properties.timestamp - ) { + + if (userLocation.location.properties.timestamp !== localUser.location.properties.timestamp) { updated.push(userLocation); } } else { @@ -792,7 +611,7 @@ export class EventService { // remaining elements were not pulled from the server, hence we should remove them const removed = _.values(filteredUsersById); - this.eventsById[event.id].usersById = _.keyBy(userLocations, "id"); + this.eventsById[event.id].usersById = _.keyBy(userLocations, 'id'); this.eventsById[event.id].filteredUsersById = usersById; this.usersChanged({ added: added, updated: updated, removed: removed }); @@ -804,39 +623,36 @@ export class EventService { } this.fetch().subscribe(() => { this.pollListeners.forEach((listener: any) => { - if (typeof listener.onPoll === "function") { + if (typeof listener.onPoll === 'function') { listener.onPoll(); } }); this.pollingTimeout = setTimeout(() => { this.poll(interval); - }, interval); + }, interval) }); } - getNextFeed(event: Event) { + getNextFeed(event) { const now = Date.now(); - const feedsInSyncPriorityOrder = _.sortBy(this.feedSyncStates, (feed) => { - return feed.lastSync; - }); - const nextFeed = - feedsInSyncPriorityOrder.find((syncState) => { - if (!syncState.lastSync) { - return true; - } - const feed = this.eventsById[event.id].feedsById[syncState.id]; - if (now - syncState.lastSync > feed.updateFrequencySeconds * 1000) { - return true; - } - }) || {}; + const feedsInSyncPriorityOrder = _.sortBy(this.feedSyncStates, feed => { return feed.lastSync }); + const nextFeed = feedsInSyncPriorityOrder.find(syncState => { + if (!syncState.lastSync) { + return true; + } + const feed = this.eventsById[event.id].feedsById[syncState.id]; + if ((now - syncState.lastSync) > (feed.updateFrequencySeconds * 1000)) { + return true; + } + }) || {}; return this.eventsById[event.id].feedsById[nextFeed.id]; } - getFeedFetchDelay(event: Event) { + getFeedFetchDelay(event) { const now = Date.now(); - const delays = this.feedSyncStates.map((syncState) => { - const feed = this.eventsById[event.id].feedsById[syncState.id]; + const delays = this.feedSyncStates.map(syncState => { + const feed = this.eventsById[event.id].feedsById[syncState.id] if (!syncState.lastSync) { return 0; } @@ -845,7 +661,7 @@ export class EventService { return frequencyMillis - elapsed; }); - return delays.length > 0 ? Math.min(...delays) : 60 * 1000; + return delays.length > 0 ? Math.min(...delays) : 60 * 1000 } pollFeeds() { @@ -853,43 +669,34 @@ export class EventService { const feed = this.getNextFeed(event); const scheduleNextPoll = () => { const delayMillis = this.getFeedFetchDelay(event); - clearTimeout(this.feedPollTimeout); + clearTimeout(this.feedPollTimeout) this.feedPollTimeout = setTimeout(() => { - this.pollFeeds(); - }, delayMillis); + this.pollFeeds() + }, delayMillis) }; if (!feed) { return scheduleNextPoll(); } - - this.feedService - .fetchFeedItems(event, feed) - .pipe( - tap((content: any) => { - // TODO is this really created or updated, maybe just create as empty when, - // feeds come back - this.feedItemsChanged( - { - updated: [{ feed, items: content.items.features }], - }, - event - ); - }), - catchError((err) => { - // TODO: add error handling - console.error( - `error fetching feed content for feed ${feed.id}, ${feed.title}`, - err - ); - return of(); - }), - finalize(() => { - const state = this.feedSyncStates.find((f) => f.id === feed.id); - state.lastSync = Date.now(); - scheduleNextPoll(); - }) - ) - .subscribe(); - } -} + + this.feedService.fetchFeedItems(event, feed).pipe( + tap((content: any) => { + // TODO is this really created or updated, maybe just create as empty when, + // feeds come back + this.feedItemsChanged({ + updated: [{ feed, items: content.items.features }] + }, event); + }), + catchError((err) => { + // TODO: add error handling + console.error(`error fetching feed content for feed ${feed.id}, ${feed.title}`, err); + return of(); + }), + finalize(() => { + const state = this.feedSyncStates.find(f => f.id === feed.id); + state.lastSync = Date.now(); + scheduleNextPoll(); + }) + ).subscribe(); + } +} \ No newline at end of file diff --git a/web-app/src/app/event/event.types.ts b/web-app/src/app/event/event.types.ts deleted file mode 100644 index ec831e622..000000000 --- a/web-app/src/app/event/event.types.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { User } from "@ngageoint/mage.web-core-lib/user"; -import { Event } from "../filter/filter.types"; - -export type MemberPage = { - items: User[]; - pageIndex: number; - pageSize: number; - totalCount: number; - }; - -export type filterChanges = { added?: any[]; updated?: any[]; removed?: any[] }; - -export type EventById = Record; \ No newline at end of file diff --git a/web-app/src/app/export/empty-state/no-exports.component.spec.ts b/web-app/src/app/export/empty-state/no-exports.component.spec.ts index 9b17690d4..849002494 100644 --- a/web-app/src/app/export/empty-state/no-exports.component.spec.ts +++ b/web-app/src/app/export/empty-state/no-exports.component.spec.ts @@ -1,27 +1,26 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { NoExportsComponent } from './no-exports.component'; import { MatDialogModule } from '@angular/material/dialog'; -import { MatIconModule } from '@angular/material/icon'; -import { MatDividerModule } from '@angular/material/divider'; describe('NoExportsComponent', () => { - let component: NoExportsComponent; - let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [MatDialogModule, MatIconModule, MatDividerModule], - declarations: [NoExportsComponent] - }).compileComponents(); - })); + let component: NoExportsComponent; + let fixture: ComponentFixture; - beforeEach(() => { - fixture = TestBed.createComponent(NoExportsComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [MatDialogModule], + declarations: [NoExportsComponent] + }).compileComponents(); + })); - it('should create', () => { - expect(component).toBeDefined(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(NoExportsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeDefined(); + }); }); diff --git a/web-app/src/app/export/export-data/export-data.component.spec.ts b/web-app/src/app/export/export-data/export-data.component.spec.ts index 8418af3f8..d13a6a584 100644 --- a/web-app/src/app/export/export-data/export-data.component.spec.ts +++ b/web-app/src/app/export/export-data/export-data.component.spec.ts @@ -1,241 +1,196 @@ -import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { FormsModule } from '@angular/forms'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatChipsModule } from '@angular/material/chips'; -import { MatOptionModule, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatListModule } from '@angular/material/list'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatRadioModule } from '@angular/material/radio'; -import { MatSelectModule } from '@angular/material/select'; -import { - MatSnackBar, - MatSnackBarDismiss, - MatSnackBarModule -} from '@angular/material/snack-bar'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { Observable, of, Subject } from 'rxjs'; -import { ExportDialogComponent } from '../export-dialog.component'; -import { - ExportRequest, - ExportResponse, - Export, - ExportService -} from '../export.service'; -import { ExportDataComponent } from './export-data.component'; -import { FilterService } from 'src/app/filter/filter.service'; -import { BrowserModule } from '@angular/platform-browser'; -import { CommonModule } from '@angular/common'; -import { MatDialogModule } from '@angular/material/dialog'; +import { HttpClientTestingModule } from "@angular/common/http/testing"; +import { ComponentFixture, TestBed, waitForAsync } from "@angular/core/testing"; +import { FormsModule } from "@angular/forms"; +import { MatCardModule } from "@angular/material/card"; +import { MatCheckboxModule } from "@angular/material/checkbox"; +import { MatChipsModule } from "@angular/material/chips"; +import { MatOptionModule, MatNativeDateModule } from "@angular/material/core"; +import { MatDatepickerModule } from "@angular/material/datepicker"; +import { MatExpansionModule } from "@angular/material/expansion"; +import { MatFormFieldModule } from "@angular/material/form-field"; +import { MatIconModule } from "@angular/material/icon"; +import { MatInputModule } from "@angular/material/input"; +import { MatListModule } from "@angular/material/list"; +import { MatPaginatorModule } from "@angular/material/paginator"; +import { MatProgressSpinnerModule } from "@angular/material/progress-spinner"; +import { MatRadioModule } from "@angular/material/radio"; +import { MatSelectModule } from "@angular/material/select"; +import { MatSnackBar, MatSnackBarDismiss, MatSnackBarModule } from "@angular/material/snack-bar"; +import { MatSortModule } from "@angular/material/sort"; +import { MatTableModule } from "@angular/material/table"; +import { NoopAnimationsModule } from "@angular/platform-browser/animations"; +import { Observable, of, Subject } from "rxjs"; +import { ExportDialogComponent } from "../export-dialog.component"; +import { ExportRequest, ExportResponse, Export, ExportService } from "../export.service"; +import { ExportDataComponent } from "./export-data.component"; +import { FilterService } from "src/app/filter/filter.service"; class MockExportService { - getExports(): Observable { - return of([ - { - id: 1, - userId: 1, - physicalPath: '/tmp/test.kml', - filename: 'test.kml', - exportType: 'kml', - url: '/api/exports/1', - status: 'Running', - options: { - event: { - name: 'Test Event' - } - } - }, - { - id: 2, - userId: 1, - physicalPath: '/tmp/test.csv', - filename: 'test.csv', - exportType: 'csv', - url: '/api/exports/2', - status: 'Completed', - options: { - event: { - name: 'Test Event' - } - } - }, - { - id: 3, - userId: 1, - physicalPath: '/tmp/test.json', - filename: 'test.json', - exportType: 'json', - url: '/api/exports/3', - status: 'Failed', - options: { - event: { - name: 'Test Event' - } - } - } - ]); - } - - export(request: ExportRequest): Observable { - return of({ id: '1' }); - } - - retryExport(retry: Export): Observable { - return of({ id: retry.id }); - } - - deleteExport(id: string): Observable<{ id: string }> { - return of({ id }); - } + getExports(): Observable { + return of([{ + id: 1, + userId: 1, + physicalPath: '/tmp/test.kml', + filename: 'test.kml', + exportType: 'kml', + url: '/api/exports/1', + status: 'Running', + options: { + event: { + name: 'Test Event' + } + } + }, { + id: 2, + userId: 1, + physicalPath: '/tmp/test.csv', + filename: 'test.csv', + exportType: 'csv', + url: '/api/exports/2', + status: 'Completed', + options: { + event: { + name: 'Test Event' + } + } + }, { + id: 3, + userId: 1, + physicalPath: '/tmp/test.json', + filename: 'test.json', + exportType: 'json', + url: '/api/exports/3', + status: 'Failed', + options: { + event: { + name: 'Test Event' + } + } + }]) + } + + export(request: ExportRequest): Observable { + return of({ id: '1' }) + } + + retryExport(retry: Export): Observable { + return of({ id: retry.id }) + } + + deleteExport(id: string): Observable<{ id: string }> { + return of({ id }) + } } class MockSnackbarRef { - private readonly _afterDismissed = new Subject(); + private readonly _afterDismissed = new Subject() - afterDismissed(): Observable { - return this._afterDismissed; - } + afterDismissed(): Observable { + return this._afterDismissed + } - dismiss(): void { - this._afterDismissed.next({ dismissedByAction: false }); - this._afterDismissed.complete(); - } + dismiss(): void { + this._afterDismissed.next({ dismissedByAction: false }) + this._afterDismissed.complete() + } - dismissWithAction(): void { - this._afterDismissed.next({ dismissedByAction: true }); - this._afterDismissed.complete(); + dismissWithAction(): void { + this._afterDismissed.next({ dismissedByAction: true }) + this._afterDismissed.complete() + } } -} class MockSnackbar { - private snackbarRef = new MockSnackbarRef(); + private snackbarRef = new MockSnackbarRef() - get _openedSnackBarRef(): any { - return this.snackbarRef; - } + get _openedSnackBarRef(): any { + return this.snackbarRef + } - open(): any { - return this.snackbarRef; + open(): any { + return this.snackbarRef + } } -} describe('ExportDataComponent', () => { - let component: ExportDataComponent; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - const mockFilterService = { - getEvent: (): any => { - return { id: 1 }; - } - }; - - TestBed.configureTestingModule({ - imports: [ - NoopAnimationsModule, - MatPaginatorModule, - MatSortModule, - MatSnackBarModule, - MatTableModule, - MatProgressSpinnerModule, - MatInputModule, - MatFormFieldModule, - MatIconModule, - HttpClientTestingModule, - NoopAnimationsModule, - MatCheckboxModule, - MatListModule, - MatCardModule, - MatExpansionModule, - MatRadioModule, - MatSelectModule, - MatOptionModule, - MatDatepickerModule, - MatNativeDateModule, - FormsModule, - MatChipsModule, - MatOptionModule, - BrowserModule, - CommonModule, - MatDialogModule - ], - providers: [ - { provide: ExportService, useClass: MockExportService }, - { provide: FilterService, useValue: mockFilterService }, - { provide: MatSnackBar, useClass: MockSnackbar } - ], - declarations: [ExportDialogComponent, ExportDataComponent] - }).compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ExportDataComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create component', () => { - expect(component).toBeTruthy(); - }); - - it('should set start date', () => { - const date = new Date(); - component.onStartDate(date); - expect(component.startDate).toEqual(date); - }); - - it('should set end date', () => { - const date = new Date(); - component.onEndDate(date); - expect(component.endDate).toEqual(date); - }); - - it('should export', () => { - const exportService: ExportService = - fixture.debugElement.injector.get(ExportService); - const exportSpy = spyOn(exportService, 'export').and.callThrough(); - - const start = '2021-05-04T00:00:00.000Z'; - component.onStartDate(new Date(Date.parse(start))); - - const end = '2021-05-05T00:00:00.000Z'; - component.onEndDate(new Date(Date.parse(end))); - - component.exportTime = 'custom'; - - component.changeFormat('KML'); - - component.exportData(); - expect(exportSpy).toHaveBeenCalledWith({ - exportType: 'KML', - eventId: 1, - observations: true, - locations: true, - startDate: start, - endDate: end, - attachments: undefined, - favorites: undefined, - important: undefined + let component: ExportDataComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + const mockFilterService = { getEvent: (): any => { return { id: 1 } } }; + + TestBed.configureTestingModule({ + imports: [NoopAnimationsModule, MatPaginatorModule, MatSortModule, MatSnackBarModule, MatTableModule, + MatProgressSpinnerModule, MatInputModule, MatFormFieldModule, MatIconModule, HttpClientTestingModule, + NoopAnimationsModule, MatCheckboxModule, MatListModule, MatCardModule, MatExpansionModule, MatRadioModule, + MatSelectModule, MatOptionModule, MatDatepickerModule, MatNativeDateModule, FormsModule, MatChipsModule], + providers: [ + { provide: ExportService, useClass: MockExportService }, + { provide: FilterService, useValue: mockFilterService }, + { provide: MatSnackBar, useClass: MockSnackbar } + ], + declarations: [ExportDialogComponent] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ExportDataComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create component', () => { + expect(component).toBeTruthy(); + }); + + it('should set start date', () => { + const date = new Date(); + component.onStartDate(date); + expect(component.startDate).toEqual(date); + }); + + it('should set end date', () => { + const date = new Date(); + component.onEndDate(date); + expect(component.endDate).toEqual(date); + }); + + it('should export', () => { + const exportService: ExportService = fixture.debugElement.injector.get(ExportService) + const exportSpy = spyOn(exportService, 'export').and.callThrough() + + const start = '2021-05-04T00:00:00.000Z' + component.onStartDate(new Date(Date.parse(start))) + + const end = '2021-05-05T00:00:00.000Z' + component.onEndDate(new Date(Date.parse(end))) + + component.exportTime = 'custom' + + component.changeFormat('KML'); + + component.exportData(); + expect(exportSpy).toHaveBeenCalledWith({ + exportType: 'KML', + eventId: 1, + observations: true, + locations: true, + startDate: start, + endDate: end, + attachments: undefined, + favorites: undefined, + important: undefined + }) + }) + + it('should change export format', () => { + const badFormat = "test"; + expect(function () { + component.changeFormat(badFormat); + }).toThrowError(Error); + + const goodFormat = component.exportFormats[0]; + component.changeFormat(goodFormat); + expect(component.exportFormat).toEqual(goodFormat); }); - }); - - it('should change export format', () => { - const badFormat = 'test'; - expect(function () { - component.changeFormat(badFormat); - }).toThrowError(Error); - - const goodFormat = component.exportFormats[0]; - component.changeFormat(goodFormat); - expect(component.exportFormat).toEqual(goodFormat); - }); }); diff --git a/web-app/src/app/export/export-dialog.component.spec.ts b/web-app/src/app/export/export-dialog.component.spec.ts index cff5a1b20..cb62ad9a3 100644 --- a/web-app/src/app/export/export-dialog.component.spec.ts +++ b/web-app/src/app/export/export-dialog.component.spec.ts @@ -1,9 +1,4 @@ -import { - ComponentFixture, - fakeAsync, - TestBed, - waitForAsync -} from '@angular/core/testing'; +import { ComponentFixture, fakeAsync, TestBed, waitForAsync } from '@angular/core/testing'; import { Observable, of, Subject } from 'rxjs'; import { ExportDialogComponent } from './export-dialog.component'; import { MatCardModule } from '@angular/material/card'; @@ -20,157 +15,119 @@ import { MatPaginatorModule } from '@angular/material/paginator'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatRadioModule } from '@angular/material/radio'; import { MatSelectModule } from '@angular/material/select'; -import { - MatSnackBar, - MatSnackBarDismiss, - MatSnackBarModule -} from '@angular/material/snack-bar'; +import { MatSnackBar, MatSnackBarDismiss, MatSnackBarModule } from '@angular/material/snack-bar'; import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; -import { - ExportService, - Export, - ExportRequest, - ExportResponse -} from './export.service'; +import { ExportService, Export, ExportRequest, ExportResponse } from './export.service'; import { HttpClientTestingModule } from '@angular/common/http/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { FormsModule } from '@angular/forms'; import { MatDialogModule, MatDialogRef } from '@angular/material/dialog'; import { LocalStorageService } from '../http/local-storage.service'; import { FilterService } from '../filter/filter.service'; -import { NoExportsComponent } from './empty-state/no-exports.component'; class MockExportService { getExports(): Observable { - return of([ - { - id: 1, - userId: 1, - physicalPath: '/tmp/test.kml', - filename: 'test.kml', - exportType: 'kml', - url: '/api/exports/1', - status: 'Running', - options: { - event: { - name: 'Test Event' - } + return of([{ + id: 1, + userId: 1, + physicalPath: '/tmp/test.kml', + filename: 'test.kml', + exportType: 'kml', + url: '/api/exports/1', + status: 'Running', + options: { + event: { + name: 'Test Event' } - }, - { - id: 2, - userId: 1, - physicalPath: '/tmp/test.csv', - filename: 'test.csv', - exportType: 'csv', - url: '/api/exports/2', - status: 'Completed', - options: { - event: { - name: 'Test Event' - } + } + }, { + id: 2, + userId: 1, + physicalPath: '/tmp/test.csv', + filename: 'test.csv', + exportType: 'csv', + url: '/api/exports/2', + status: 'Completed', + options: { + event: { + name: 'Test Event' } - }, - { - id: 3, - userId: 1, - physicalPath: '/tmp/test.json', - filename: 'test.json', - exportType: 'json', - url: '/api/exports/3', - status: 'Failed', - options: { - event: { - name: 'Test Event' - } + } + }, { + id: 3, + userId: 1, + physicalPath: '/tmp/test.json', + filename: 'test.json', + exportType: 'json', + url: '/api/exports/3', + status: 'Failed', + options: { + event: { + name: 'Test Event' } } - ]); + }]) } export(request: ExportRequest): Observable { - return of({ id: '1' }); + return of({ id: '1' }) } retryExport(retry: Export): Observable { - return of({ id: retry.id }); + return of({ id: retry.id }) } deleteExport(id: string): Observable<{ id: string }> { - return of({ id }); + return of({ id }) } } class MockSnackbarRef { - private readonly _afterDismissed = new Subject(); + private readonly _afterDismissed = new Subject() afterDismissed(): Observable { - return this._afterDismissed; + return this._afterDismissed } dismiss(): void { - this._afterDismissed.next({ dismissedByAction: false }); - this._afterDismissed.complete(); + this._afterDismissed.next({ dismissedByAction: false }) + this._afterDismissed.complete() } dismissWithAction(): void { - this._afterDismissed.next({ dismissedByAction: true }); - this._afterDismissed.complete(); + this._afterDismissed.next({ dismissedByAction: true }) + this._afterDismissed.complete() } } class MockSnackbar { - private snackbarRef = new MockSnackbarRef(); + private snackbarRef = new MockSnackbarRef() get _openedSnackBarRef(): any { - return this.snackbarRef; + return this.snackbarRef } open(): any { - return this.snackbarRef; + return this.snackbarRef } } describe('ExportDialogComponent', () => { + let component: ExportDialogComponent; let fixture: ComponentFixture; beforeEach(waitForAsync(() => { const mockLocalStorageService = { getToken: (): string => '1' }; - const mockFilterService = { - getEvent: (): any => { - return { id: 1 }; - } - }; - const mockDialogRef = { close: (): void => {} }; + const mockFilterService = { getEvent: (): any => { return { id: 1 } } }; + const mockDialogRef = { close: (): void => { } }; TestBed.configureTestingModule({ - imports: [ - NoopAnimationsModule, - MatPaginatorModule, - MatSortModule, - MatSnackBarModule, - MatTableModule, - MatDialogModule, - MatProgressSpinnerModule, - MatInputModule, - MatFormFieldModule, - MatIconModule, - HttpClientTestingModule, - NoopAnimationsModule, - MatCheckboxModule, - MatListModule, - MatCardModule, - MatExpansionModule, - MatRadioModule, - MatSelectModule, - MatOptionModule, - MatDatepickerModule, - MatNativeDateModule, - FormsModule, - MatChipsModule - ], + imports: [NoopAnimationsModule, MatPaginatorModule, MatSortModule, MatSnackBarModule, MatTableModule, MatDialogModule, + MatProgressSpinnerModule, MatInputModule, MatFormFieldModule, MatIconModule, HttpClientTestingModule, + NoopAnimationsModule, MatCheckboxModule, MatListModule, MatCardModule, MatExpansionModule, MatRadioModule, + MatSelectModule, MatOptionModule, MatDatepickerModule, MatNativeDateModule, FormsModule, MatChipsModule], providers: [ { provide: LocalStorageService, useValue: mockLocalStorageService }, { provide: ExportService, useClass: MockExportService }, @@ -178,7 +135,7 @@ describe('ExportDialogComponent', () => { { provide: MatDialogRef, useValue: mockDialogRef }, { provide: MatSnackBar, useClass: MockSnackbar } ], - declarations: [ExportDialogComponent, NoExportsComponent] + declarations: [ExportDialogComponent] }).compileComponents(); })); @@ -216,9 +173,8 @@ describe('ExportDialogComponent', () => { }); it('should retry export', () => { - const exportService: ExportService = - fixture.debugElement.injector.get(ExportService); - const retrySpy = spyOn(exportService, 'retryExport').and.callThrough(); + const exportService: ExportService = fixture.debugElement.injector.get(ExportService); + const retrySpy = spyOn(exportService, 'retryExport').and.callThrough() const retry: Export = { id: 1, @@ -237,17 +193,15 @@ describe('ExportDialogComponent', () => { }); it('should schedule export delete', () => { - component.dataSource.data = [ - { - id: '1', - userId: '1', - physicalPath: '', - exportType: 'KML', - options: {}, - url: '/api/exports/1', - status: 'Completed' - } - ]; + component.dataSource.data = [{ + id: '1', + userId: '1', + physicalPath: '', + exportType: 'KML', + options: {}, + url: '/api/exports/1', + status: 'Completed' + }] const exp = component.dataSource.data[0]; component.scheduleDeleteExport(exp); @@ -255,55 +209,49 @@ describe('ExportDialogComponent', () => { }); it('should delete export', fakeAsync(() => { - const exportService: ExportService = - fixture.debugElement.injector.get(ExportService); - const deleteSpy = spyOn(exportService, 'deleteExport').and.callThrough(); - - component.dataSource.data = [ - { - id: '1', - userId: '1', - physicalPath: '', - exportType: 'KML', - options: {}, - url: '/api/exports/1', - status: 'Completed' - } - ]; + const exportService: ExportService = fixture.debugElement.injector.get(ExportService); + const deleteSpy = spyOn(exportService, 'deleteExport').and.callThrough() + + component.dataSource.data = [{ + id: '1', + userId: '1', + physicalPath: '', + exportType: 'KML', + options: {}, + url: '/api/exports/1', + status: 'Completed' + }] const exp = component.dataSource.data[0]; component.scheduleDeleteExport(exp); - fixture.detectChanges(); + fixture.detectChanges() - component.snackBar._openedSnackBarRef.dismiss(); + component.snackBar._openedSnackBarRef.dismiss() - expect(deleteSpy).toHaveBeenCalled(); + expect(deleteSpy).toHaveBeenCalled() })); it('should undo delete export', fakeAsync(() => { - const exportService: ExportService = - fixture.debugElement.injector.get(ExportService); - const deleteSpy = spyOn(exportService, 'deleteExport').and.callThrough(); - - component.dataSource.data = [ - { - id: '1', - userId: '1', - physicalPath: '', - exportType: 'KML', - options: {}, - url: '/api/exports/1', - status: 'Completed' - } - ]; + const exportService: ExportService = fixture.debugElement.injector.get(ExportService); + const deleteSpy = spyOn(exportService, 'deleteExport').and.callThrough() + + component.dataSource.data = [{ + id: '1', + userId: '1', + physicalPath: '', + exportType: 'KML', + options: {}, + url: '/api/exports/1', + status: 'Completed' + }] const exp = component.dataSource.data[0]; component.scheduleDeleteExport(exp); - fixture.detectChanges(); - expect(component.dataSource.data.length).toBe(0); + fixture.detectChanges() + expect(component.dataSource.data.length).toBe(0) - component.snackBar._openedSnackBarRef.dismissWithAction(); - expect(deleteSpy).toHaveBeenCalledTimes(0); - expect(component.dataSource.data.length).toBe(1); + component.snackBar._openedSnackBarRef.dismissWithAction() + expect(deleteSpy).toHaveBeenCalledTimes(0) + expect(component.dataSource.data.length).toBe(1) })); }); diff --git a/web-app/src/app/feed-panel/feed-panel-tab.component.html b/web-app/src/app/feed-panel/feed-panel-tab.component.html index 44151f835..7726b8f75 100644 --- a/web-app/src/app/feed-panel/feed-panel-tab.component.html +++ b/web-app/src/app/feed-panel/feed-panel-tab.component.html @@ -1,7 +1,7 @@
    - - {{tab.icon}} - -
    \ No newline at end of file + {{tab.icon}} + + {{tab?.title}} +
    + diff --git a/web-app/src/app/feed-panel/feed-panel-tab.component.scss b/web-app/src/app/feed-panel/feed-panel-tab.component.scss index c016c08e8..4cd35a805 100644 --- a/web-app/src/app/feed-panel/feed-panel-tab.component.scss +++ b/web-app/src/app/feed-panel/feed-panel-tab.component.scss @@ -24,7 +24,7 @@ position: relative; display: flex; align-items: center; - padding: 0.75rem; + padding: 16px; color: rgba(255, 255, 255, 0.6); cursor: pointer; cursor: hand; @@ -41,7 +41,7 @@ color: var(--mdc-theme-primary, #1E88E5); } -.tab>mat-icon { +.tab > mat-icon { font-size: 24px; height: 24px; width: 24px; diff --git a/web-app/src/app/feed-panel/feed-panel.component.scss b/web-app/src/app/feed-panel/feed-panel.component.scss index 8e7235674..32be23384 100644 --- a/web-app/src/app/feed-panel/feed-panel.component.scss +++ b/web-app/src/app/feed-panel/feed-panel.component.scss @@ -38,13 +38,21 @@ user-feed { position: absolute; background-color: white; border-right: 1px solid rgba(0, 0, 0, 0.20); - width: 3rem; + width: 57px; height: 100%; z-index: 10; + overflow-y: auto; + -webkit-transition: width .3s linear; + transition: width .3s linear; + -webkit-transform: translateZ(0) scale(1, 1); +} + +.feeds-nav:hover { + width: 240px; } .feeds-content { position: relative; - margin-left: 3rem; + margin-left: 56px; width: 100%; } \ No newline at end of file diff --git a/web-app/src/app/filter/filter.component.html b/web-app/src/app/filter/filter.component.html index df0525855..81d9277fc 100644 --- a/web-app/src/app/filter/filter.component.html +++ b/web-app/src/app/filter/filter.component.html @@ -1,108 +1,69 @@
    -
    -

    Filter

    -
    -
    - - {{ (filteredEvents | async)?.length === 0 ? 'Events (no options)' : 'Events' }} - - - -
    {{event.name}}
    -
    {{event.description}}
    -
    -
    -
    -
    -
    - - {{ (filteredTeams | async)?.length === 0 ? 'Teams (no options)' : 'Teams' }} - - - {{team.name}} - cancel - - - - - - {{team.name}} - - - -
    -
    - - {{ (filteredUsers | async)?.length === 0 ? 'Users (no options)' : 'Users' }} - - - {{user.displayName || user.username}} - cancel - - - - - - {{user.displayName || user.username}} - - - -
    -
    - - {{ (filteredForms | async)?.length === 0 ? 'Forms (no options)' : 'Forms' }} - - - {{form.name}} - cancel - - - - - - {{form.name}} - - - -
    -
    - - Time - - - {{choice.label}} - - - -
    -
    - - -
    -
    - -
    -
    -
    +
    +

    Filter

    +
    +
    + + Event + + + +
    {{event.name}}
    +
    {{event.description}}
    +
    +
    +
    +
    + +
    + + Teams + + + {{team.name}} + cancel + + + + + + {{team.name}} + + + +
    + +
    + + Time + + + {{choice.label}} + + + + +
    +
    + + +
    +
    + +
    +
    -
    - - -
    +
    + +
    + + +
    +
    \ No newline at end of file diff --git a/web-app/src/app/filter/filter.component.spec.ts b/web-app/src/app/filter/filter.component.spec.ts index 1eb5c2689..3960705fa 100644 --- a/web-app/src/app/filter/filter.component.spec.ts +++ b/web-app/src/app/filter/filter.component.spec.ts @@ -4,9 +4,6 @@ import { MatDialogModule, MatDialogRef } from '@angular/material/dialog'; import { HttpClientTestingModule } from '@angular/common/http/testing'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatChipsModule } from '@angular/material/chips'; -import { MatSelectModule } from '@angular/material/select'; describe('FilterComponent', () => { let component: FilterComponent; @@ -20,10 +17,7 @@ describe('FilterComponent', () => { FormsModule, ReactiveFormsModule, MatAutocompleteModule, - MatDialogModule, - MatFormFieldModule, - MatChipsModule, - MatSelectModule + MatDialogModule ], providers: [{ provide: MatDialogRef, useValue: {} diff --git a/web-app/src/app/filter/filter.component.ts b/web-app/src/app/filter/filter.component.ts index a5d30d66b..a0677f543 100644 --- a/web-app/src/app/filter/filter.component.ts +++ b/web-app/src/app/filter/filter.component.ts @@ -1,60 +1,41 @@ -import { Component, OnInit, ViewEncapsulation } from "@angular/core"; -import { MatDialogRef } from "@angular/material/dialog"; -import { FilterService } from "./filter.service"; -import { EventService } from "../event/event.service"; -import { FormControl } from "@angular/forms"; -import { Observable, firstValueFrom, map, startWith, debounceTime, switchMap, of } from "rxjs"; -import { COMMA, ENTER } from "@angular/cdk/keycodes"; -import { MatAutocompleteSelectedEvent } from "@angular/material/autocomplete"; -import { LocalStorageService } from "../http/local-storage.service"; -import * as moment from "moment"; -import { User } from "@ngageoint/mage.web-core-lib/user"; -import { - Form, - Team, - Event, - FilterChoice, - Interval, - IntervalOptions, -} from "./filter.types"; +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { MatDialogRef } from '@angular/material/dialog'; +import { FilterService } from './filter.service'; +import { EventService } from '../event/event.service'; +import { FormControl } from '@angular/forms'; +import { Observable, map, startWith } from 'rxjs'; +import { COMMA, ENTER } from '@angular/cdk/keycodes'; +import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; +import { LocalStorageService } from '../http/local-storage.service'; +import * as moment from 'moment' @Component({ - selector: "filter", - templateUrl: "./filter.component.html", - styleUrls: ["./filter.component.scss"], - encapsulation: ViewEncapsulation.None, + selector: 'filter', + templateUrl: './filter.component.html', + styleUrls: ['./filter.component.scss'], + encapsulation: ViewEncapsulation.None }) export class FilterComponent implements OnInit { - readonly separatorKeysCodes: number[] = [ENTER, COMMA]; + readonly separatorKeysCodes: number[] = [ENTER, COMMA] - events: Event[]; - selectedTeams: Team[] = []; + events: any[] + selectedTeams: any[] = [] - eventUsers: User[] = []; - selectedUsers: User[] = []; + eventControl = new FormControl() + teamControl = new FormControl() - eventForms: Form[] = []; - selectedForms: Form[] = []; + filteredEvents: Observable + filteredTeams: Observable - eventControl = new FormControl(); - teamControl = new FormControl(); - userControl = new FormControl(); - formControl = new FormControl(); - - filteredEvents: Observable; - filteredTeams: Observable; - filteredUsers: Observable; - filteredForms: Observable; - - timeZone: string; - localOffset: string; - interval: Interval; - defaultStartDate: Date; - startDate: Date; - defaultEndDate: Date; - endDate: Date; - intervalChoice: FilterChoice; - intervalChoices: FilterChoice[]; + timeZone: any + localOffset: string + interval: any + defaultStartDate: Date + startDate: Date + defaultEndDate: Date + endDate: Date + intervalChoice: any + intervalChoices: any constructor( public dialogRef: MatDialogRef, @@ -63,290 +44,107 @@ export class FilterComponent implements OnInit { private localStorageService: LocalStorageService ) { } - async ngOnInit() { - const event: Event = this.filterService.getEvent(); - this.eventControl.setValue(event); + ngOnInit() { + const event = this.filterService.getEvent() + this.eventControl.setValue(event) const teamIds = this.localStorageService.getTeams() || []; - this.selectedTeams = teamIds.map((teamId: number) => { - return event.teams.find((team: Team) => team.id === teamId); - }); - const users: User[] = this.localStorageService.getUsers() || []; - const forms: Form[] = this.localStorageService.getForms() || []; - this.selectedUsers = users; - this.selectedForms = forms; - if (!this.eventUsers.length) { - let eUsers = await this.getUsers(event); - if (eUsers.length > 0) - this.eventUsers.push(...eUsers); - else - this.userControl.disable({ emitEvent: false }); - } - if (!this.eventForms.length && event.forms) this.eventForms = event.forms; - else if (!this.eventForms.length) this.formControl.disable({ emitEvent: false }); - - if (this.eventControl.value.teams && this.eventControl.value.teams.length <= 0) - this.teamControl.disable({ emitEvent: false }); - - this.interval = this.filterService.getInterval(); - this.timeZone = - this.interval.options?.localTime === false ? "gmt" : "local"; - this.intervalChoice = this.interval.choice; - this.intervalChoices = this.filterService.intervalChoices; + this.selectedTeams = teamIds.map((teamId: string) => { + return event.teams.find((team: any) => team.id === teamId) + }) + + this.interval = this.filterService.getInterval() + this.timeZone = this.interval.options?.localTime === false ? 'gmt' : 'local' + this.intervalChoice = this.interval.choice + this.intervalChoices = this.filterService.intervalChoices if (this.interval?.options && this.interval?.options?.startDate) { this.defaultStartDate = this.interval?.options?.startDate; } else { - this.defaultStartDate = moment().startOf("day").toDate(); + this.defaultStartDate = moment().startOf('day').toDate(); } if (this.interval?.options && this.interval?.options?.endDate) { this.defaultEndDate = this.interval.options.endDate; } else { - this.defaultEndDate = moment().endOf("day").toDate(); + this.defaultEndDate = moment().endOf('day').toDate() } - this.localOffset = moment().format("Z"); - - this.eventService.query().subscribe((events: Event[]) => { - this.setFilteredValues(events, this.eventUsers, this.eventForms); - }); - } - - /** - * Fetches Users for Given Event - * @param {Event} event Event to Get Users From - * @return {Promise} Returns List of Users as an Async Promise - */ - async getUsers(event: Event): Promise { - try { - const users = await firstValueFrom(this.eventService.getMembers(event)); - return users; - } catch (error) { - console.error('Error Fetching Members ', error); - return []; - } - } - - /** - * Resets Filter When Event is Selected - * @param {Event[]} events List of Events - * @param {User[]} eUsers Users in the Event - * @param {Form[]} eForms Forms in the Event - * @return {void} No Return - */ - - setFilteredValues(events: Event[], eUsers: User[], eForms: Form[]): void { - this.events = events; - - this.filteredEvents = this.eventControl.valueChanges.pipe( - startWith(""), - debounceTime(300), - switchMap((value) => { - const searchTerm = typeof value === "string" ? value : value?.name || ""; - if (searchTerm && searchTerm.trim()) { - return this.eventService.query({ term: searchTerm.trim(), limit: 100 }); - } else { - return of(this.events); - } - }) - ); - - this.filteredTeams = this.teamControl.valueChanges.pipe( - startWith(""), - map((value) => (typeof value === "string" ? value : value.name)), - map((name) => { - if (this.eventControl.value) { - let teams = this.eventControl.value.teams.filter( - (team) => this.selectedTeams.indexOf(team) < 0 - ); - if (name) { - const filterValue = name.toLowerCase(); - return teams.filter( - (team: Team) => team.name.toLowerCase().indexOf(filterValue) === 0 - ); - } else { - return teams.slice(); - } - } else { - return []; - } - }) - ); - - this.filteredUsers = this.userControl.valueChanges.pipe( - startWith(""), - map((value) => - typeof value === "string" ? value : value.displayName || value.username - ), - map((name) => { - if (eUsers.length) { - let usersList = eUsers.filter( - (user) => this.selectedUsers.map((x) => x.id).indexOf(user.id) < 0 - ); - if (name) { - const filterValue = name.toLowerCase(); - return usersList.filter( - (user: User) => - (user.displayName || user.username) - .toLowerCase() - .indexOf(filterValue) === 0 - ); + this.localOffset = moment().format('Z') + + this.eventService.query().subscribe((events: any) => { + this.events = events + + this.filteredEvents = this.eventControl.valueChanges.pipe( + startWith(''), + map(value => typeof value === 'string' ? value : value.name), + map(name => name ? this.filterEvent(name) : this.events.slice()) + ) + + this.filteredTeams = this.teamControl.valueChanges.pipe( + startWith(''), + map(value => typeof value === 'string' ? value : value.name), + map(name => { + if (this.eventControl.value) { + let teams = this.eventControl.value.teams.filter(team => this.selectedTeams.indexOf(team) < 0) + if (name) { + const filterValue = name.toLowerCase() + return teams.filter((team: any) => team.name.toLowerCase().indexOf(filterValue) === 0) + } else { + return teams.slice() + } } else { - return usersList.slice(); + return [] } - } else { - return []; - } - }) - ); - - this.filteredForms = this.formControl.valueChanges.pipe( - startWith(""), - map((value) => (typeof value === "string" ? value : value.name)), - map((name) => { - let formsList = this.eventForms.filter( - (form) => this.selectedForms.map((x) => x.id).indexOf(form.id) < 0 - ); - if (eForms.length) { - if (name) { - const filterValue = name.toLowerCase(); - return formsList.filter( - (form: Form) => form.name.toLowerCase().indexOf(filterValue) === 0 - ); - } else { - return formsList.slice(); - } - } else { - return []; - } - }) - ); + }) + ) + }) } - /** - * Resets Filter When Event is Selected - * @param {MatAutocompleteSelectedEvent} event The Event from the Autocomplete SelectBox - * @return {Promise} No Return - */ - - async onSelectEvent(event: MatAutocompleteSelectedEvent): Promise { - this.selectedTeams = []; - this.selectedUsers = []; - this.selectedForms = []; - this.teamControl.setValue(""); - this.userControl.setValue(""); - this.formControl.setValue(""); - - let newEvent: Event = event.option.value; - let eUsers = await this.getUsers(newEvent); - - this.eventUsers = eUsers; - this.eventForms = newEvent.forms; - - if (this.eventUsers.length > 0) this.userControl.enable({ emitEvent: false }); - else this.userControl.disable({ emitEvent: false }); - - if (newEvent.forms.length > 0) this.formControl.enable({ emitEvent: false }); - else this.formControl.disable({ emitEvent: false }); - - if (this.eventControl.value.teams.length > 0) this.teamControl.enable({ emitEvent: false }); - else this.teamControl.disable({ emitEvent: false }); - - if (this.events.length > 0) this.eventControl.enable({ emitEvent: false }); - else this.eventControl.disable({ emitEvent: false }); - - this.eventService.query().subscribe(async (events: Event[]) => { - this.setFilteredValues(events, eUsers, newEvent.forms); - }); + onSelectEvent(): void { + this.selectedTeams = [] + this.teamControl.setValue('') } - onDisplayEvent(event: Event): string { - return event && event.name ? event.name : ""; + onDisplayEvent(event: any): string { + return event && event.name ? event.name : ''; } - private filterEvent(name: string): Event[] { + private filterEvent(name: string): any[] { const filterValue = name.toLowerCase(); - return this.events.filter( - (option) => option.name.toLowerCase().includes(filterValue) - ); + return this.events.filter(option => option.name.toLowerCase().indexOf(filterValue) === 0); } onSelectTeam(event: MatAutocompleteSelectedEvent): void { - this.selectedTeams.push(event.option.value); - this.teamControl.setValue(""); - } - - onSelectUser(event: MatAutocompleteSelectedEvent): void { - this.selectedUsers.push(event.option.value); - this.userControl.setValue(""); - } - - onSelectForm(event: MatAutocompleteSelectedEvent): void { - this.selectedForms.push(event.option.value); - this.formControl.setValue(""); - } - - onRemoveTeam(team: Team): void { - this.selectedTeams = this.selectedTeams.filter( - (selectedTeam: Team) => team.name !== selectedTeam.name - ); - this.teamControl.setValue(""); + this.selectedTeams.push(event.option.value) + this.teamControl.setValue('') } - onRemoveUser(user: User): void { - this.selectedUsers = this.selectedUsers.filter( - (selectedUser: User) => - (user.displayName || user.username) !== - (selectedUser.displayName || selectedUser.username) - ); - this.userControl.setValue(""); + onRemoveTeam(team: any): void { + this.selectedTeams = this.selectedTeams.filter((selectedTeam: any) => team.name !== selectedTeam.name) + this.teamControl.setValue('') } - onRemoveForm(form: Form): void { - this.selectedForms = this.selectedForms.filter( - (selectedForm: Form) => form.name !== selectedForm.name - ); - this.formControl.setValue(""); - } - - onDisplayTeam(team: Team): string { - return team && team.name ? team.name : ""; - } - - onDisplayUser(user: User): string { - return user && user.displayName ? user.displayName || user.username : ""; - } - - onDisplayForm(form: Form): string { - return form && form.name ? form.name : ""; + onDisplayTeam(team: any): string { + return team && team.name ? team.name : ''; } onStartDate(date: Date): void { this.startDate = date; } - onEndDate(date: Date): void { - this.endDate = date; - } - onTimezone(): void { - this.timeZone = this.timeZone === "gmt" ? "local" : "gmt"; + this.timeZone = this.timeZone === 'gmt' ? 'local' : 'gmt'; } public compareIntervalChoices = function (option, value): boolean { return option.label === value.label; - }; - - /** - * Filters Observation List using the FilterService - * @return {void} No Return - */ + } onFilter(): void { - const options: IntervalOptions = {}; - if (this.intervalChoice.filter === "custom") { - options.startDate = this.startDate; - options.endDate = this.endDate; - options.localTime = this.timeZone === "local"; + var options: any = {}; + if (this.intervalChoice.filter === 'custom') { + options.startDate = this.startDate + options.endDate = this.endDate + options.localTime = this.timeZone === 'local' } this.filterService.setFilter({ @@ -354,16 +152,15 @@ export class FilterComponent implements OnInit { teams: this.selectedTeams, timeInterval: { choice: this.intervalChoice, - options: options, - }, - users: this.selectedUsers, - forms: this.selectedForms, + options: options + } }); - this.dialogRef.close(); + this.dialogRef.close() } onCancel(): void { this.dialogRef.close(); } -} + +} \ No newline at end of file diff --git a/web-app/src/app/filter/filter.service.ts b/web-app/src/app/filter/filter.service.ts index 299b90256..a7c9f388c 100644 --- a/web-app/src/app/filter/filter.service.ts +++ b/web-app/src/app/filter/filter.service.ts @@ -1,132 +1,90 @@ import { Injectable } from "@angular/core"; import { UserService } from "../user/user.service"; import { LocalStorageService } from "../http/local-storage.service"; -import * as moment from "moment"; -import * as _ from "lodash"; -import { User } from "@ngageoint/mage.web-core-lib/user"; -import { - Event, - Interval, - FilterChoice, - Team, - TeamById, - Observation, - Filter, - Changes, - Form, - FormProperties, - SearchInterval, -} from "./filter.types"; -import { filterChanges } from "../event/event.types"; +import * as moment from 'moment'; +import * as _ from 'lodash' @Injectable({ - providedIn: "root", + providedIn: 'root' }) - export class FilterService { - event: Event = null; - teamsById: TeamById = {}; + + event: any = null; + teamsById: any = {}; listeners: any = []; - users: User[] = []; - forms: Form[] = []; - - interval: Interval = {}; - filterLocalOffset = moment().format("Z"); - actionFilter: string = ""; - - intervalChoices: FilterChoice[] = [ - { - filter: "all", - label: "All", - }, - { - filter: "today", - label: "Today (Local GMT " + this.filterLocalOffset + ")", - }, - { - filter: 86400, - label: "Last 24 Hours", - }, - { - filter: 43200, - label: "Last 12 Hours", - }, - { - filter: 21600, - label: "Last 6 Hours", - }, - { - filter: 3600, - label: "Last Hour", - }, - { - filter: "custom", - label: "Custom", - }, - ]; + + interval: any = {}; + filterLocalOffset = moment().format('Z'); + actionFilter: any = {}; + + intervalChoices: any = [{ + filter: 'all', + label: 'All' + }, { + filter: 'today', + label: 'Today (Local GMT ' + this.filterLocalOffset + ')' + }, { + filter: 86400, + label: 'Last 24 Hours' + }, { + filter: 43200, + label: 'Last 12 Hours' + }, { + filter: 21600, + label: 'Last 6 Hours' + }, { + filter: 3600, + label: 'Last Hour' + }, { + filter: 'custom', + label: 'Custom' + }]; constructor( private userService: UserService, private localStorageService: LocalStorageService ) { - this.setTimeInterval( - localStorageService.getTimeInterval() || { - choice: this.intervalChoices[1], - } - ); + this.setTimeInterval(localStorageService.getTimeInterval() || { choice: this.intervalChoices[1] }); this.filterChanged({ intervalChoice: this.interval.choice }); } addListener(listener: any) { this.listeners.push(listener); - if (typeof listener.onFilterChanged === "function") { + if (typeof listener.onFilterChanged === 'function') { listener.onFilterChanged({ event: this.event, teams: Object.values(this.teamsById), - user: this.users, timeInterval: { - choice: this.interval.choice, - }, + choice: this.interval.choice + } }); } } removeListener(listener: any) { - this.listeners = this.listeners.filter((l: any) => l !== listener); + this.listeners = this.listeners.filter((l: any) => l !== listener ); } - /** - * Updates the Observation Filter With the Selected Items - * @param {Filter} filter Contains the Selected Filter Values - * @return {void} No Return - */ - - setFilter(filter: Filter): void { - let eventChanged = null; - let teamsChanged = null; - let usersChanged = null; - let formsChanged = null; - let timeIntervalChanged = null; - let actionFilterChanged = null; - - if (filter.users) usersChanged = this.setUsers(filter.users); - - if (filter.forms) formsChanged = this.setForms(filter.forms); + setFilter(filter: any) { + var eventChanged = null; + var teamsChanged = null; + var timeIntervalChanged = null; + var actionFilterChanged = null; if (filter.teams) { teamsChanged = this.setTeams(filter.teams); } - + if (filter.event) { eventChanged = this.setEvent(filter.event); // if they changed the event, and didn't set teams filter // then reset teams filter to empty array if (!filter.teams) { - let oldTeamIds = this.localStorageService.getTeams() || []; - const teams = []; - for (let i = 0; i < filter.event.teams.length; i++) { + var oldTeamIds = this.localStorageService.getTeams() || []; + var teams = []; + for (var i = 0; i < filter.event.teams.length; i++) { if (oldTeamIds.indexOf(this.event.teams[i].id) != -1) { teams.push(this.event.teams[i]); } @@ -144,11 +102,9 @@ export class FilterService { timeIntervalChanged = filter.timeInterval; } - const changed: Changes = {}; + var changed: any = {}; if (eventChanged) changed.event = eventChanged; if (teamsChanged) changed.teams = teamsChanged; - if (usersChanged) changed.users = usersChanged; - if (formsChanged) changed.forms = formsChanged; if (actionFilterChanged) changed.actionFilter = actionFilterChanged; if (timeIntervalChanged) changed.timeInterval = timeIntervalChanged; @@ -156,7 +112,7 @@ export class FilterService { } removeFilters() { - const changed: Changes = {}; + var changed: any = {}; if (this.event) { changed.event = { removed: [this.event] }; this.event = null; @@ -165,115 +121,49 @@ export class FilterService { this.filterChanged(changed); } - /** - * Updates the Event Selected - * @param {Event} newEvent the new Event Selection - * @return {filterChanges} a List of events added/removed from the list - */ - - setEvent(newEvent: Event): filterChanges { + setEvent(newEvent: any) { if (!newEvent && this.event) { this.event = null; return { added: [], - removed: [this.event], + removed: [this.event] }; - } else if ((newEvent && !this.event) || this.event.id !== newEvent.id) { - const added = [newEvent]; - const removed = this.event ? [this.event] : []; + } else if (newEvent && !this.event || this.event.id !== newEvent.id) { + var added = [newEvent]; + var removed = this.event ? [this.event] : []; this.userService.addRecentEvent(newEvent).subscribe({ - error: (e) => console.error("Error adding recent event", e), + error: e => console.error('Error adding recent event', e) }); this.event = newEvent; return { added: added, - removed: removed, + removed: removed }; } else { return null; } } - getEvent(): Event { + getEvent() { return this.event; } - /** - * Updates the List of Users in the Selected Event - * @param {User[]} newUser the new List of Users that are in the events - * @return {filterChanges} a List of users added and removed from the list - */ - - setUsers(newUsers: User[]): filterChanges { - const added = []; - const removed = []; - - newUsers.forEach((user: User) => { - if (this.users.findIndex((u) => u.id === user.id) < 0) added.push(user); - }); - - this.users.forEach((user: User) => { - if (newUsers.findIndex((u) => u.id === user.id) < 0) removed.push(user); - }); - - this.users = newUsers; - this.localStorageService.setUsers(this.users); - - return { - added: added, - removed: removed, - }; - } - - /** - * Updates the List of Forms in the Selected Event - * @param {Form[]} newForms the new List of Forms that are in the events - * @return {filterChanges} a List of forms added and removed from the list - */ - - setForms(newForms: Form[]): filterChanges { - const added = []; - const removed = []; - - newForms.forEach((form: Form) => { - if (this.forms.findIndex((f) => f.id === form.id) < 0) added.push(form); - }); - - this.forms.forEach((form: Form) => { - if (newForms.findIndex((f) => f.id === form.id) < 0) removed.push(form); - }); - - this.forms = newForms; - this.localStorageService.setForms(this.forms); + setTeams(newTeams: any) { + var added = []; + var removed = []; - return { - added: added, - removed: removed, - }; - } - - /** - * Updates the List of Teams in the Selected Event - * @param {Team[]} newTeams the new List of Teams that are in the events - * @return {filterChanges} a List of teams added and removed from the list - */ - - setTeams(newTeams: Team[]): filterChanges { - const added = []; - const removed = []; - - newTeams.forEach((team: Team) => { + newTeams.forEach((team: any) => { if (!this.teamsById[team.id]) { added.push(team); } - }); + }) - let newTeamsById = _.keyBy(newTeams, "id"); - Object.values(this.teamsById).forEach((team: Team) => { + var newTeamsById = _.keyBy(newTeams, 'id'); + Object.values(this.teamsById).forEach((team: any) => { if (!newTeamsById[team.id]) { removed.push(team); } @@ -284,7 +174,7 @@ export class FilterService { return { added: added, - removed: removed, + removed: removed }; } @@ -292,14 +182,6 @@ export class FilterService { return Object.values(this.teamsById); } - getUsers() { - return this.users; - } - - getForms() { - return this.forms; - } - getTeamsById() { return this.teamsById; } @@ -312,20 +194,10 @@ export class FilterService { return this.interval; } - /** - * Sets the Time Interval if a change was made - * @param {Interval} newInterval Contains the Selected Interval Type and Custom Information - * @return {boolean} If a change was made, returns True, else False - */ - - setTimeInterval(newInterval: Interval): boolean { - if (newInterval.choice.filter === "custom") { - if ( - this.interval.options?.startDate && - newInterval.options.startDate === this.interval.options?.startDate && - this.interval.options?.endDate && - newInterval.options.endDate === this.interval.options?.endDate - ) { + setTimeInterval(newInterval: any) { + if (newInterval.choice.filter === 'custom') { + if (this.interval.startDate && newInterval.options.startDate === this.interval.options.startDate && + this.interval.endDate && newInterval.options.endDate === this.interval.options.endDate) { return false; } } else if (this.interval.choice === newInterval.choice) { @@ -336,146 +208,87 @@ export class FilterService { return true; } - /** - * Checks to see if the ID is within the list of filters Users - * @param {Observation} o The Current Observation - * @return {boolean} Returns True if Observation is Allowed, or False if Not - */ - - observationInFilter(o: Observation): boolean { - if (!this.isObservationInTimeFilter(o)) return false; - - if (!this.isUserInTeamFilter(o.userId)) return false; - - if (this.forms.length > 0 && !this.hasFormInList(o.properties.forms)) + observationInFilter(o) { + if (!this.isUserInTeamFilter(o.userId)) { return false; + } - if (this.users.length > 0 && !this.isUserInList(o.userId)) return false; + if (!this.isObservationInTimeFilter(o)) { + return false; + } // remove observations that are not part of action filter - if (this.actionFilter === "important" && !o.important) return false; + if (this.actionFilter === 'important' && !o.important) { + return false; + } - if ( - this.actionFilter === "favorite" && - !o.favoriteUserIds.includes(this.userService.myself.id) - ) + if (this.actionFilter === 'favorite' && !o.favoriteUserIds.includes(this.userService.myself.id)) { return false; + } - if (this.actionFilter === "attachments" && !o.attachments.length) + if (this.actionFilter === 'attachments' && !o.attachments.length) { return false; + } return true; } - /** - * Checks to see if the ID is within the list of filters Users - * @param {string} observationUserId Observations User ID - * @return {boolean} Returns True if Observation is Allowed, or False if Not - */ - - isUserInList(observationUserId: string): boolean { - if (this.users.length <= 0) return true; - return this.users.findIndex((u) => u.id === observationUserId) >= 0; - } - - /** - * Checks Incoming Observation to see if it has Forms within the Filter List - * @param {FormProperties[]} observationForms The Current Observations Forms - * @return {boolean} Returns True if Observation is Allowed, or False if Not - */ - - hasFormInList(observationForms: FormProperties[]): boolean { - if (this.forms.length <= 0) return true; - const intersection = this.forms - .map((x) => x.id) - .filter((fID) => observationForms.map((y) => y.formId).includes(fID)); - return intersection.length > 0; - } - - /** - * Checks Incoming Observation to Make Sure it is Within the Time Constraints - * @param {Observation} o The Current Observation - * @return {boolean} Returns True if Observation is Allowed, or False if Not - */ - - isObservationInTimeFilter(o: Observation): boolean { - const time: SearchInterval = this.formatInterval(this.interval); + isObservationInTimeFilter(o: any) { + var time = this.formatInterval(this.interval); if (time) { - const properties = o.properties; - if (time?.start && time?.end) { - return moment(properties.timestamp).isBetween(time.start, time.end); - } else if (time?.start) { - return moment(properties.timestamp).isAfter(time.start); - } else if (time?.end) { - return moment(properties.timestamp).isBefore(time.start); + var properties = o.properties; + if (time.start && time.end) { + if (!moment(properties.timestamp).isBetween(time.start, time.end)) return false; + } else if (time.start) { + if (!moment(properties.timestamp).isAfter(time.start)) return false; + } else if (time.end) { + if (!moment(properties.timestamp).isBefore(time.start)) return false; } } + return true; } - /** - * Checks to see if the declared username is filtered Team selections - * @param {string} userId the unique ID of the User who Created the Observation - * @return {boolean} Returns True if Observation is Allowed, or False if Not - */ - - isUserInTeamFilter(userId: string): boolean { - if (Object.keys(this.teamsById).length === 0) return true; - return Object.values(this.teamsById).some((team: Team) => - team.userIds.includes(userId) - ); + isUserInTeamFilter(userId: any) { + if (Object.keys(this.teamsById).length === 0) return true + return Object.values(this.teamsById).some((team: any) => team.userIds.includes(userId)) } - /** - * Calculates and Returns the Start and End Time for Selected Interval - * @param {Interval} interval Contains the Selected Interval Type and Custom Information - * @return {SearchInterval} A Start and End Value to Compare DateTimes to - */ - - formatInterval(interval: Interval): SearchInterval { + formatInterval(interval: any) { if (!interval) return null; - const choice = interval.choice; - const options = interval.options; - let start: string = null; - let end: string = null; - if (choice.filter === "all") { + var choice = interval.choice; + var options = interval.options; + + if (choice.filter === 'all') { return null; - } else if (choice.filter === "today") { - start = moment().startOf("day").toISOString(); - end = moment().endOf("day").toISOString(); - } else if (choice.filter === "custom") { - let startDate = moment(options.startDate); + } else if (choice.filter === 'today') { + return { start: moment().startOf('day').toISOString() }; + } else if (choice.filter === 'custom') { + var startDate = moment(options.startDate); if (startDate) { startDate = options.localTime ? startDate.utc() : startDate; - start = startDate.utc().toISOString(); + var start = startDate.utc().toISOString(); } - let endDate = moment(options.endDate); + + var endDate = moment(options.endDate); if (endDate) { endDate = options.localTime ? endDate.utc() : endDate; - end = endDate.utc().toISOString(); + var end = endDate.utc().toISOString(); } + + return { start: start, end: end }; } else { - start = moment() - .utc() - .subtract( - typeof choice.filter === "string" - ? parseInt(choice.filter) - : choice.filter, - "seconds" - ) - .toISOString(); - end = moment().toISOString(); + return { start: moment().utc().subtract('seconds', parseInt(choice.filter)).toISOString() }; } - - return { start: start, end: end }; } - filterChanged(filter: Changes) { + filterChanged(filter: any) { this.listeners.forEach((listener: any) => { - if (typeof listener.onFilterChanged === "function") { + if (typeof listener.onFilterChanged === 'function') { listener.onFilterChanged(filter); } }); } + } diff --git a/web-app/src/app/filter/filter.types.ts b/web-app/src/app/filter/filter.types.ts deleted file mode 100644 index a367feb17..000000000 --- a/web-app/src/app/filter/filter.types.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { User } from "@ngageoint/mage.web-core-lib/user"; -import { filterChanges } from "../event/event.types"; - -export type FormField = { - name: string; - id: number; - title: string; - type: string; - required: boolean; - allowedAttachmentTypes: string[]; - choices: string[]; - value: any; -}; -export type Form = { - name: string; - primaryFeedField: string; - secondaryFeedField: string; - id: number; - color: string; - default: boolean; - fields: FormField[]; - userFields: string[]; - archived: boolean; - min: number; - max: number; -}; - -export type FormProperties = { - formId: number; - id: string; - [name: string]: any; -}; - -export type Team = { - name?: string; - id?: number; - acl?: Record; - description?: string; - teamEventId?: number; - userIds?: string[]; - __v?: number; -}; - -export type TeamById = Record; - -export type Style = { - fill: string; - fillOpacity: number; - stroke: string; - strokeOpacity: number; - strokeWidth: number; -}; - -export type Layer = { - name: string; - id: number; - state: string; - type: string; - url: string; - __v: number; -}; - -export type Event = { - name: string; - id: number; - acl?: Record; - description: string; - feedIds: string[]; - forms: Form[]; - layers: Layer[]; - style: Style; - teams: Team[]; -}; - -export type FilterChoice = { - filter: string | number; - label: string; -}; - -export type IntervalOptions = { - endDate?: Date; - startDate?: Date; - localTime?: Boolean; -}; - -export type SearchInterval = { - start: string; - end: string; -} - -export type Interval = { - choice?: FilterChoice; - options?: IntervalOptions; -}; - -export type Attachment = { - contentType: string; - fieldName: string; - id: string; - lastModified: Date; - name: string; - observationFormId: string; - oriented: boolean; - relativePath: string; - size: number; - url: string; -}; - -export type Observation = { - id: string; - attachments: Attachment[]; - createdAt: Date; - deviceId: string; - eventId: number; - favoriteUserIds: string[]; - geometry: { type: string; coordinates: number[] }; - lastModified: Date; - properties: { forms: FormProperties[]; timestamp: Date }; - state: { - id: string; - name: string; - url: string; - userId: string; - }; - style: Style; - type: string; - url: string; - user: User; - userId: string; - important: { desciption: string; timestamp: Date; user: User }; -}; - -export type Filter = { - event?: Event; - teams?: Team[]; - users?: User[]; - forms?: Form[]; - intervalChoice?: FilterChoice; - timeInterval?: Interval; - actionFilter?: string; -}; - -export type Changes = { - event?: filterChanges; - teams?: filterChanges; - users?: filterChanges; - forms?: filterChanges; - timeInterval?: Interval; - actionFilter?: string; - intervalChoice?: FilterChoice; -}; diff --git a/web-app/src/app/geometry/geometry.pipe.ts b/web-app/src/app/geometry/geometry.pipe.ts index 10a1cfd56..64c6bbfb9 100644 --- a/web-app/src/app/geometry/geometry.pipe.ts +++ b/web-app/src/app/geometry/geometry.pipe.ts @@ -1,5 +1,5 @@ import { Pipe, PipeTransform } from '@angular/core' -import { center as turfCenter } from '@turf/center' +import * as turfCenter from '@turf/center' import { Feature, Point } from 'geojson' import * as mgrs from 'mgrs' import * as DMS from './geometry-dms' @@ -41,10 +41,6 @@ export class GeometryPipe implements PipeTransform { } center(value: any): Point { - if (!value || !value.coordinates || !Array.isArray(value.coordinates)) { - return { type: 'Point', coordinates: [0, 0] } - } - const feature: Feature = { type: 'Feature', properties: {}, diff --git a/web-app/src/app/geometry/geometry.service.ts b/web-app/src/app/geometry/geometry.service.ts index 3ea38f9fc..f6e1f46e4 100644 --- a/web-app/src/app/geometry/geometry.service.ts +++ b/web-app/src/app/geometry/geometry.service.ts @@ -1,6 +1,6 @@ import { Injectable } from "@angular/core"; import { polygon } from "@turf/helpers"; -import { kinks as turfKinks } from '@turf/kinks' +import * as turfKinks from '@turf/kinks' @Injectable({ providedIn: 'root' diff --git a/web-app/src/app/home/home.component.html b/web-app/src/app/home/home.component.html index 744098596..23590f193 100644 --- a/web-app/src/app/home/home.component.html +++ b/web-app/src/app/home/home.component.html @@ -5,16 +5,16 @@
    - + - + - + - +
    diff --git a/web-app/src/app/home/home.component.scss b/web-app/src/app/home/home.component.scss index c8fd1d521..8c943fc2d 100644 --- a/web-app/src/app/home/home.component.scss +++ b/web-app/src/app/home/home.component.scss @@ -26,14 +26,10 @@ mat-sidenav-container { background: #e1e2e1; order: 1; width: 500px; - max-width: 100%; height: 100%; display: flex; flex-direction: row; position: relative; transition: margin-left .3s linear; -} - -.feeds-nav { - max-width: 100%; + z-index: 1; } \ No newline at end of file diff --git a/web-app/src/app/home/home.module.ts b/web-app/src/app/home/home.module.ts index 9003bf078..d7fd4cf23 100644 --- a/web-app/src/app/home/home.module.ts +++ b/web-app/src/app/home/home.module.ts @@ -141,7 +141,6 @@ import { IngressModule } from '../ingress/ingress.module'; import { FilterControlComponent } from '../map/controls/filter.component'; import { ExportControlComponent } from '../map/controls/export.component'; import { BannerModule } from '../banner/banner.module'; -import { MatMenuModule } from '@angular/material/menu'; const routes: Routes = [{ path: '', @@ -178,7 +177,6 @@ const routes: Routes = [{ MatGridListModule, MatIconModule, MatInputModule, - MatMenuModule, MatMomentDatetimeModule, MatPaginatorModule, MatProgressBarModule, @@ -297,7 +295,7 @@ class AngularModule { } InputMaskModule.forRoot(), RouterModule.forChild(routes) ], - exports: [RouterModule] + exports: [ RouterModule ] }) export class HomeModule { } \ No newline at end of file diff --git a/web-app/src/app/http/local-storage.service.ts b/web-app/src/app/http/local-storage.service.ts index d4f882ebb..61f4c8c0a 100644 --- a/web-app/src/app/http/local-storage.service.ts +++ b/web-app/src/app/http/local-storage.service.ts @@ -1,187 +1,157 @@ -import { Injectable } from "@angular/core"; -import { User } from "@ngageoint/mage.web-core-lib/user"; -import { Form, Interval } from "../filter/filter.types"; +import { Injectable } from "@angular/core" @Injectable({ - providedIn: "root", + providedIn: 'root' }) export class LocalStorageService { - tokenKey = "token"; - pollingIntervalKey = "pollingInterval"; - timeIntervalKey = "timeInterval"; - teamsKey = "teams"; - usersKey = "users"; - formsKey = "forms"; - mapPositionKey = "mapPosition"; - coordinateSystemViewKey = "coordinateSystemView"; - coordinateSystemEditKey = "coordinateSystemEdit"; - timeZoneViewKey = "timeZoneView"; - timeZoneEditKey = "timeZoneEdit"; - timeFormatKey = "timeFormat"; + + tokenKey = 'token' + pollingIntervalKey = 'pollingInterval' + timeIntervalKey = 'timeInterval' + teamsKey = 'teams' + mapPositionKey = 'mapPosition' + coordinateSystemViewKey = 'coordinateSystemView' + coordinateSystemEditKey = 'coordinateSystemEdit' + timeZoneViewKey = 'timeZoneView' + timeZoneEditKey = 'timeZoneEdit' + timeFormatKey = 'timeFormat' getToken() { - return this.getLocalItem(this.tokenKey); + return this.getLocalItem(this.tokenKey) } setToken(token: any) { - return this.setLocalItem(this.tokenKey, token); + return this.setLocalItem(this.tokenKey, token) } removeToken() { - return this.removeLocalItem(this.tokenKey); + return this.removeLocalItem(this.tokenKey) } setPollingInterval(pollingInterval) { - return this.setLocalItem(this.pollingIntervalKey, pollingInterval); + return this.setLocalItem(this.pollingIntervalKey, pollingInterval) } getPollingInterval() { - return this.getLocalItem(this.pollingIntervalKey); + return this.getLocalItem(this.pollingIntervalKey) } - setTimeInterval(timeInterval: Interval) { - return this.setLocalItem( - this.timeIntervalKey, - JSON.stringify(timeInterval) - ); + setTimeInterval(timeInterval: any) { + return this.setLocalItem(this.timeIntervalKey, JSON.stringify(timeInterval)) } getTimeInterval() { - const item = this.getLocalItem(this.timeIntervalKey); + const item = this.getLocalItem(this.timeIntervalKey) if (item) { - const time = JSON.parse(item); + const time = JSON.parse(item) if (time && time.options) { if (time.options.startDate) { - time.options.startDate = new Date(time.options.startDate); + time.options.startDate = new Date(time.options.startDate) } if (time.options.endDate) { - time.options.endDate = new Date(time.options.endDate); + time.options.endDate = new Date(time.options.endDate) } } - - return time; - } else return undefined; + + return time + } else return undefined } getTeams() { - const item = this.getLocalItem(this.teamsKey); + const item = this.getLocalItem(this.teamsKey) if (item) { - return JSON.parse(item); - } else return undefined; + return JSON.parse(item) + } else return undefined } setTeams(teams: any) { - return this.setLocalItem(this.teamsKey, JSON.stringify(teams)); - } - - getUsers(): User[] { - const item = this.getLocalItem(this.usersKey); - if (item) { - return JSON.parse(item) as User[]; - } else return undefined; - } - - setUsers(users: User[]) { - return this.setLocalItem(this.usersKey, JSON.stringify(users)); - } - - getForms(): Form[] { - const item = this.getLocalItem(this.formsKey); - if (item) { - return JSON.parse(item) as Form[]; - } else return undefined; - } - - setForms(forms: Form[]) { - return this.setLocalItem(this.formsKey, JSON.stringify(forms)); + return this.setLocalItem(this.teamsKey, JSON.stringify(teams)) } removeTeams() { - return this.removeLocalItem(this.teamsKey); + return this.removeLocalItem(this.teamsKey) } setMapPosition(mapPosition: any) { - return this.setLocalItem(this.mapPositionKey, JSON.stringify(mapPosition)); + return this.setLocalItem(this.mapPositionKey, JSON.stringify(mapPosition)) } getMapPosition() { - const item = this.getLocalItem(this.mapPositionKey); + const item = this.getLocalItem(this.mapPositionKey) if (item) { - return JSON.parse(item); - } else return undefined; + return JSON.parse(item) + } else return undefined } getCoordinateSystemView() { - return this.getLocalItem(this.coordinateSystemViewKey) || "wgs84"; + return this.getLocalItem(this.coordinateSystemViewKey) || 'wgs84' } setCoordinateSystemView(coordinateSystem: any) { - return this.setLocalItem(this.coordinateSystemViewKey, coordinateSystem); + return this.setLocalItem(this.coordinateSystemViewKey, coordinateSystem) } getCoordinateSystemEdit() { - return ( - this.getLocalItem(this.coordinateSystemEditKey) || - this.getCoordinateSystemView() - ); + return this.getLocalItem(this.coordinateSystemEditKey) || this.getCoordinateSystemView() } setCoordinateSystemEdit(coordinateSystem: any) { - return this.setLocalItem(this.coordinateSystemEditKey, coordinateSystem); + return this.setLocalItem(this.coordinateSystemEditKey, coordinateSystem) } getTimeZoneView() { - return this.getLocalItem(this.timeZoneViewKey) || "local"; + return this.getLocalItem(this.timeZoneViewKey) || 'local' } setTimeZoneView(timeZone: any) { - return this.setLocalItem(this.timeZoneViewKey, timeZone); + return this.setLocalItem(this.timeZoneViewKey, timeZone) } getTimeZoneEdit() { - return this.getLocalItem(this.timeZoneEditKey) || this.getTimeZoneView(); + return this.getLocalItem(this.timeZoneEditKey) || this.getTimeZoneView() } setTimeZoneEdit(timeZone: any) { - return this.setLocalItem(this.timeZoneEditKey, timeZone); + return this.setLocalItem(this.timeZoneEditKey, timeZone) } getTimeFormat() { - return this.getLocalItem(this.timeFormatKey) || "absolute"; + return this.getLocalItem(this.timeFormatKey) || 'absolute' } setTimeFormat(timeFormat: any) { - return this.setLocalItem(this.timeFormatKey, timeFormat); + return this.setLocalItem(this.timeFormatKey, timeFormat) } getLocalItem(key: any) { try { - if ("localStorage" in window && window["localStorage"] !== null) { - return localStorage.getItem(key); + if ('localStorage' in window && window['localStorage'] !== null) { + return localStorage.getItem(key) } } catch (e) { - return undefined; + return undefined } } setLocalItem(key: any, value: any) { try { - if ("localStorage" in window && window.localStorage !== null) { - return localStorage.setItem(key, value); + if ('localStorage' in window && window.localStorage !== null) { + return localStorage.setItem(key, value) } } catch (e) { - return undefined; + return undefined } } removeLocalItem(key: any) { try { - if ("localStorage" in window && window.localStorage !== null) { - return localStorage.removeItem(key); + if ('localStorage' in window && window.localStorage !== null) { + return localStorage.removeItem(key) } } catch (e) { - return false; + return false } } + } diff --git a/web-app/src/app/ingress/authentication/@types/signup.ts b/web-app/src/app/ingress/authentication/@types/signup.ts deleted file mode 100644 index 374cb9f12..000000000 --- a/web-app/src/app/ingress/authentication/@types/signup.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { User } from "@ngageoint/mage.web-core-lib/user"; - -export interface PasswordHelpTextTemplate { - passwordMinLength?: string; - lowLetters?: string; - highLetters?: string; - numbers?: string; - specialChars?: string; - maxConChars?: string; - restrictSpecialChars?: string; - minChars?: string; - } - -export interface PasswordPolicy { - passwordMinLengthEnabled: boolean; - passwordMinLength: number; - - minCharsEnabled: boolean; - minChars: number; - - lowLettersEnabled: boolean; - lowLetters: number; - - highLettersEnabled: boolean; - highLetters: number; - - numbersEnabled: boolean; - numbers: number; - - specialCharsEnabled: boolean; - specialChars: number; - - maxConCharsEnabled: boolean; - maxConChars: number; - - restrictSpecialCharsEnabled: boolean; - restrictSpecialChars: string; - - helpTextTemplate?: PasswordHelpTextTemplate; - } - -export interface SignupEvent { - reason: 'signup' | 'cancel'; - user?: User; - } \ No newline at end of file diff --git a/web-app/src/app/ingress/authentication/authentication-dialog.component.spec.ts b/web-app/src/app/ingress/authentication/authentication-dialog.component.spec.ts index d0dbe25ca..99b67b260 100644 --- a/web-app/src/app/ingress/authentication/authentication-dialog.component.spec.ts +++ b/web-app/src/app/ingress/authentication/authentication-dialog.component.spec.ts @@ -2,7 +2,6 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { AuthenticationDialogComponent } from './authentication-dialog.component'; import { HttpClientTestingModule } from '@angular/common/http/testing'; import { MatDialogRef } from '@angular/material/dialog'; -import { IngressModule } from '../ingress.module'; describe('Authentication Dialog', () => { let component: AuthenticationDialogComponent; @@ -11,7 +10,7 @@ describe('Authentication Dialog', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ declarations: [AuthenticationDialogComponent], - imports: [HttpClientTestingModule, IngressModule], + imports: [HttpClientTestingModule], providers: [{ provide: MatDialogRef, useValue: {} diff --git a/web-app/src/app/ingress/authentication/idp/idp-authentication.component.spec.ts b/web-app/src/app/ingress/authentication/idp/idp-authentication.component.spec.ts index 20b87c662..715469998 100644 --- a/web-app/src/app/ingress/authentication/idp/idp-authentication.component.spec.ts +++ b/web-app/src/app/ingress/authentication/idp/idp-authentication.component.spec.ts @@ -1,8 +1,6 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { IdpAuthenticationComponent } from './idp-authentication.component'; import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { AuthenticationButtonComponent } from '../button/authentication-button.component'; describe('Idp Authentication Component', () => { let component: IdpAuthenticationComponent; @@ -10,8 +8,8 @@ describe('Idp Authentication Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [IdpAuthenticationComponent, AuthenticationButtonComponent], - imports: [HttpClientTestingModule, MatFormFieldModule] + declarations: [IdpAuthenticationComponent], + imports: [HttpClientTestingModule] }).compileComponents(); })); diff --git a/web-app/src/app/ingress/authentication/ldap/ldap-authentication.component.spec.ts b/web-app/src/app/ingress/authentication/ldap/ldap-authentication.component.spec.ts index 2b5a3d370..5724145e6 100644 --- a/web-app/src/app/ingress/authentication/ldap/ldap-authentication.component.spec.ts +++ b/web-app/src/app/ingress/authentication/ldap/ldap-authentication.component.spec.ts @@ -1,8 +1,6 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { LdapAuthenticationComponent } from './ldap-authentication.component'; import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { AuthenticationButtonComponent } from '../button/authentication-button.component'; describe('LDAP Authentication Component', () => { let component: LdapAuthenticationComponent; @@ -10,8 +8,8 @@ describe('LDAP Authentication Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [LdapAuthenticationComponent, AuthenticationButtonComponent], - imports: [HttpClientTestingModule, MatFormFieldModule] + declarations: [LdapAuthenticationComponent], + imports: [HttpClientTestingModule] }).compileComponents(); })); diff --git a/web-app/src/app/ingress/authentication/local/local-authentication.component.html b/web-app/src/app/ingress/authentication/local/local-authentication.component.html index 7feddd83f..541fcb639 100644 --- a/web-app/src/app/ingress/authentication/local/local-authentication.component.html +++ b/web-app/src/app/ingress/authentication/local/local-authentication.component.html @@ -1,37 +1,35 @@ - - - Username - - - Username is required - - - - - Password - - - Password is required - - + +
    + + Username + + Username is required + +
    - +
    + + Password + + Password is required + +
    -
    - sentiment_dissatisfied -
    +
    +
    -