From 4e5c23b3fe91d49fb628a4a6d1a01cb8c6f293ea Mon Sep 17 00:00:00 2001 From: Guillaume Poirier-Morency Date: Tue, 8 Oct 2024 10:00:53 -0700 Subject: [PATCH 1/9] Update versions for hotfix --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 97835141..7733b1aa 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ Rare Disease Project ubc.pavlab rdp - 1.5.9 + 1.5.10 Registry for model organism/system researchers, developed for the Canadian Rare Disease Models & Mechanisms Network. From b8563e7a943aeaf17e105cd7b3a7c4d2d5055f5f Mon Sep 17 00:00:00 2001 From: Guillaume Poirier-Morency Date: Tue, 8 Oct 2024 10:03:45 -0700 Subject: [PATCH 2/9] Require a minimum of Maven 3.6.3 Update Maven plugins --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 7733b1aa..7223a820 100644 --- a/pom.xml +++ b/pom.xml @@ -229,7 +229,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 1.4.1 + 3.5.0 enforce-maven @@ -239,7 +239,7 @@ - [3.0.5,) + [3.6.3,) @@ -249,7 +249,7 @@ org.codehaus.mojo exec-maven-plugin - 3.0.0 + 3.4.1 npm-install-dependencies @@ -302,7 +302,7 @@ com.amashchenko.maven.plugin gitflow-maven-plugin - 1.19.0 + 1.21.0 false From 2bfde1aa18dbfcf863138ff3794e756d48a62848 Mon Sep 17 00:00:00 2001 From: Guillaume Poirier-Morency Date: Tue, 8 Oct 2024 13:03:42 -0700 Subject: [PATCH 3/9] Remove ALL cascade on GeneInfo.orthologs --- src/main/java/ubc/pavlab/rdp/model/GeneInfo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ubc/pavlab/rdp/model/GeneInfo.java b/src/main/java/ubc/pavlab/rdp/model/GeneInfo.java index 214528dd..0363ca0e 100644 --- a/src/main/java/ubc/pavlab/rdp/model/GeneInfo.java +++ b/src/main/java/ubc/pavlab/rdp/model/GeneInfo.java @@ -33,7 +33,7 @@ public static Comparator getComparator() { @JsonIgnore private Integer id; - @ManyToMany(cascade = CascadeType.ALL) + @ManyToMany @JoinTable(name = "ortholog", joinColumns = @JoinColumn(name = "source_gene"), inverseJoinColumns = @JoinColumn(name = "target_gene")) From a321a91140e8c296c81b7208e99668f17c63a9b3 Mon Sep 17 00:00:00 2001 From: Guillaume Poirier-Morency Date: Tue, 8 Oct 2024 11:09:12 -0700 Subject: [PATCH 4/9] More Nullable checks and fixes Use the Optional API for all repository methods that can return null. Fix a pretty nasty bug where Spring Data would honor the non-null return value for UserRepository.findByEmailIgnoreCase(). Remove unused imports. --- src/main/java/ubc/pavlab/rdp/Application.java | 1 - .../ubc/pavlab/rdp/ResourceLoaderConfig.java | 4 -- .../java/ubc/pavlab/rdp/ValidationConfig.java | 5 +- .../ubc/pavlab/rdp/WebSecurityConfig.java | 4 -- .../rdp/controllers/AdminController.java | 44 +++++++----- .../rdp/controllers/LoginController.java | 14 +--- .../rdp/controllers/PasswordController.java | 4 +- .../rdp/controllers/SearchViewController.java | 6 +- .../rdp/controllers/TermController.java | 8 --- .../rdp/controllers/UserController.java | 3 + .../events/OnRegistrationCompleteEvent.java | 1 - .../rdp/events/OnRequestAccessEvent.java | 6 +- .../pavlab/rdp/listeners/UserListener.java | 2 - src/main/java/ubc/pavlab/rdp/model/Gene.java | 2 + .../java/ubc/pavlab/rdp/model/GeneInfo.java | 1 - .../rdp/model/GeneOntologyTermInfo.java | 3 - .../java/ubc/pavlab/rdp/model/Profile.java | 6 ++ src/main/java/ubc/pavlab/rdp/model/Taxon.java | 2 + src/main/java/ubc/pavlab/rdp/model/User.java | 16 +++-- .../ubc/pavlab/rdp/model/UserContent.java | 1 - .../java/ubc/pavlab/rdp/model/UserGene.java | 12 ++-- .../ubc/pavlab/rdp/model/enums/TierType.java | 1 - .../pavlab/rdp/model/enums/package-info.java | 7 ++ .../pavlab/rdp/model/ontology/Ontology.java | 5 +- .../rdp/model/ontology/OntologyTermInfo.java | 5 +- .../rdp/model/ontology/package-info.java | 7 ++ .../ontology/resolvers/OntobeeResolver.java | 2 +- .../ontology/resolvers/ReactomeResolver.java | 3 +- .../repositories/AccessTokenRepository.java | 4 +- .../rdp/repositories/GeneInfoRepository.java | 13 ++-- .../rdp/repositories/OrganInfoRepository.java | 3 +- .../PasswordResetTokenRepository.java | 6 +- .../rdp/repositories/RoleRepository.java | 6 +- .../rdp/repositories/TaxonRepository.java | 1 + .../rdp/repositories/UserGeneRepository.java | 5 +- .../rdp/repositories/UserRepository.java | 4 +- .../VerificationTokenRepository.java | 6 +- .../ontology/OntologyRepository.java | 5 +- .../ontology/OntologyTermInfoRepository.java | 7 +- .../repositories/ontology/package-info.java | 7 ++ .../rdp/security/PermissionEvaluatorImpl.java | 3 +- .../rdp/security/SecureTokenChallenge.java | 2 +- .../pavlab/rdp/services/EmailServiceImpl.java | 2 + .../pavlab/rdp/services/GOServiceImpl.java | 2 +- .../rdp/services/GeneInfoServiceImpl.java | 5 +- .../rdp/services/LoggingEmailServiceImpl.java | 3 +- .../pavlab/rdp/services/OntologyService.java | 17 ++--- .../rdp/services/PrivacyServiceImpl.java | 8 --- .../pavlab/rdp/services/ReactomeService.java | 6 +- .../services/RemoteResourceServiceImpl.java | 18 +++-- .../ubc/pavlab/rdp/services/TaxonService.java | 3 - .../pavlab/rdp/services/TaxonServiceImpl.java | 5 -- .../rdp/services/UserDetailsServiceImpl.java | 9 +-- .../pavlab/rdp/services/UserGeneService.java | 14 ++-- .../rdp/services/UserGeneServiceImpl.java | 11 +-- .../rdp/services/UserOrganServiceImpl.java | 6 +- .../rdp/services/UserPrivacyService.java | 19 ++--- .../ubc/pavlab/rdp/services/UserService.java | 10 ++- .../pavlab/rdp/services/UserServiceImpl.java | 72 +++++++++---------- .../rdp/settings/ApplicationSettings.java | 13 +++- .../ubc/pavlab/rdp/settings/SiteSettings.java | 3 +- .../java/ubc/pavlab/rdp/util/CacheUtils.java | 1 - .../ubc/pavlab/rdp/util/CollectionUtils.java | 6 +- .../ubc/pavlab/rdp/util/GeneInfoParser.java | 2 + .../pavlab/rdp/util/GeneOrthologsParser.java | 2 - .../java/ubc/pavlab/rdp/util/OBOParser.java | 3 + .../rdp/util/OntologyMessageSource.java | 8 +-- .../ubc/pavlab/rdp/util/ParseException.java | 4 +- .../ubc/pavlab/rdp/util/PurlResolver.java | 8 +-- .../ubc/pavlab/rdp/util/SearchResult.java | 3 + .../rdp/util/UncheckedParseException.java | 4 +- .../java/ubc/pavlab/rdp/util/Version.java | 4 +- .../ubc/pavlab/rdp/validation/Recaptcha.java | 3 +- src/main/resources/ehcache.xml | 4 -- .../rdp/controllers/AdminControllerTest.java | 11 ++- .../PasswordResetTokenRepositoryTest.java | 12 +--- .../rdp/repositories/RoleRepositoryTest.java | 4 +- .../rdp/repositories/UserRepositoryTest.java | 24 ++++--- .../VerificationTokenRepositoryTest.java | 13 +--- .../rdp/security/PrivacyServiceImplTest.java | 4 +- .../rdp/services/GeneInfoServiceImplTest.java | 14 ++-- .../rdp/services/OntologyServiceTest.java | 16 ++--- .../rdp/services/ReactomeServiceTest.java | 5 +- .../services/RemoteResourceServiceTest.java | 7 +- .../rdp/services/UserGeneServiceImplTest.java | 4 +- .../rdp/services/UserServiceImplTest.java | 20 +++--- .../rdp/util/OntologyMessageSourceTest.java | 4 +- 87 files changed, 321 insertions(+), 342 deletions(-) create mode 100644 src/main/java/ubc/pavlab/rdp/model/enums/package-info.java create mode 100644 src/main/java/ubc/pavlab/rdp/model/ontology/package-info.java create mode 100644 src/main/java/ubc/pavlab/rdp/repositories/ontology/package-info.java diff --git a/src/main/java/ubc/pavlab/rdp/Application.java b/src/main/java/ubc/pavlab/rdp/Application.java index 9f48a2fb..321e52ae 100644 --- a/src/main/java/ubc/pavlab/rdp/Application.java +++ b/src/main/java/ubc/pavlab/rdp/Application.java @@ -4,7 +4,6 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication diff --git a/src/main/java/ubc/pavlab/rdp/ResourceLoaderConfig.java b/src/main/java/ubc/pavlab/rdp/ResourceLoaderConfig.java index 505c2b00..0057c867 100644 --- a/src/main/java/ubc/pavlab/rdp/ResourceLoaderConfig.java +++ b/src/main/java/ubc/pavlab/rdp/ResourceLoaderConfig.java @@ -1,12 +1,8 @@ package ubc.pavlab.rdp; import lombok.extern.apachecommons.CommonsLog; -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; import org.springframework.context.ResourceLoaderAware; import org.springframework.context.annotation.Configuration; -import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.ResourceLoader; import ubc.pavlab.rdp.util.PurlResolver; diff --git a/src/main/java/ubc/pavlab/rdp/ValidationConfig.java b/src/main/java/ubc/pavlab/rdp/ValidationConfig.java index 034cfdd1..4fedb6b4 100644 --- a/src/main/java/ubc/pavlab/rdp/ValidationConfig.java +++ b/src/main/java/ubc/pavlab/rdp/ValidationConfig.java @@ -8,6 +8,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.io.Resource; import org.springframework.http.converter.FormHttpMessageConverter; +import org.springframework.lang.Nullable; import org.springframework.web.client.RestTemplate; import ubc.pavlab.rdp.validation.*; @@ -27,8 +28,8 @@ public class ValidationConfig { @Bean public EmailValidator emailValidator( - @Value("${rdp.settings.allowed-email-domains}") List allowedEmailDomains, - @Value("${rdp.settings.allowed-email-domains-file}") Resource allowedEmailDomainsFile, + @Value("${rdp.settings.allowed-email-domains}") @Nullable List allowedEmailDomains, + @Value("${rdp.settings.allowed-email-domains-file}") @Nullable Resource allowedEmailDomainsFile, @Value("${rdp.settings.allowed-email-domains-file-refresh-delay}") @DurationUnit(ChronoUnit.SECONDS) Duration refreshDelay, @Value("${rdp.settings.allow-internationalized-email-domains}") boolean allowIdn ) throws IOException { List strategies = new ArrayList<>(); diff --git a/src/main/java/ubc/pavlab/rdp/WebSecurityConfig.java b/src/main/java/ubc/pavlab/rdp/WebSecurityConfig.java index b0e1a44b..e140cba2 100644 --- a/src/main/java/ubc/pavlab/rdp/WebSecurityConfig.java +++ b/src/main/java/ubc/pavlab/rdp/WebSecurityConfig.java @@ -25,7 +25,6 @@ import ubc.pavlab.rdp.security.authentication.TokenBasedAuthenticationManager; import ubc.pavlab.rdp.services.UserService; import ubc.pavlab.rdp.settings.ApplicationSettings; -import ubc.pavlab.rdp.settings.SiteSettings; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; @@ -63,9 +62,6 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserService userService; - @Autowired - private SiteSettings siteSettings; - @Override protected void configure( AuthenticationManagerBuilder auth ) throws Exception { auth.userDetailsService( userDetailsService ).passwordEncoder( bCryptPasswordEncoder ); diff --git a/src/main/java/ubc/pavlab/rdp/controllers/AdminController.java b/src/main/java/ubc/pavlab/rdp/controllers/AdminController.java index 377d95d2..5c8a35d5 100644 --- a/src/main/java/ubc/pavlab/rdp/controllers/AdminController.java +++ b/src/main/java/ubc/pavlab/rdp/controllers/AdminController.java @@ -148,7 +148,7 @@ public Object createServiceAccount( @Validated(User.ValidationServiceAccount.cla } @PostMapping(value = "/admin/users/{user}/roles") - public Object updateRoles( @PathVariable User user, @RequestParam(required = false) Set roles, RedirectAttributes redirectAttributes, Locale locale ) { + public Object updateRoles( @PathVariable User user, @RequestParam(required = false) @Nullable Set roles, RedirectAttributes redirectAttributes, Locale locale ) { if ( roles == null ) { roles = Collections.emptySet(); } @@ -176,7 +176,7 @@ public Object updateRoles( @PathVariable User user, @RequestParam(required = fal * Retrieve a user's details. */ @GetMapping(value = "/admin/users/{user}") - public Object getUser( @PathVariable(required = false) User user, @SuppressWarnings("unused") ConfirmEmailForm confirmEmailForm, Locale locale ) { + public Object getUser( @PathVariable(required = false) @Nullable User user, @SuppressWarnings("unused") ConfirmEmailForm confirmEmailForm, Locale locale ) { if ( user == null ) { return new ModelAndView( "error/404", HttpStatus.NOT_FOUND ) .addObject( "message", messageSource.getMessage( "AdminController.userNotFoundById", null, locale ) ); @@ -185,7 +185,7 @@ public Object getUser( @PathVariable(required = false) User user, @SuppressWarni } @PostMapping(value = "/admin/users/{user}/create-access-token") - public Object createAccessTokenForUser( @PathVariable(required = false) User user, RedirectAttributes redirectAttributes, Locale locale ) { + public Object createAccessTokenForUser( @PathVariable(required = false) @Nullable User user, RedirectAttributes redirectAttributes, Locale locale ) { if ( user == null ) { return new ModelAndView( "error/404", HttpStatus.NOT_FOUND ) .addObject( "message", messageSource.getMessage( "AdminController.userNotFoundById", null, locale ) ); @@ -196,7 +196,7 @@ public Object createAccessTokenForUser( @PathVariable(required = false) User use } @PostMapping(value = "/admin/users/{user}/revoke-access-token/{accessToken}") - public Object revokeAccessTn( @PathVariable(required = false) User user, @PathVariable(required = false) AccessToken accessToken, RedirectAttributes redirectAttributes, Locale locale ) { + public Object revokeAccessTn( @PathVariable(required = false) @Nullable User user, @PathVariable(required = false) @Nullable AccessToken accessToken, RedirectAttributes redirectAttributes, Locale locale ) { if ( user == null ) { return new ModelAndView( "error/404", HttpStatus.NOT_FOUND ) .addObject( "message", messageSource.getMessage( "AdminController.userNotFoundById", null, locale ) ); @@ -218,7 +218,7 @@ public static class ConfirmEmailForm { * Delete a given user. */ @DeleteMapping(value = "/admin/users/{user}") - public Object deleteUser( @PathVariable(required = false) User user, + public Object deleteUser( @PathVariable(required = false) @Nullable User user, @Valid ConfirmEmailForm confirmEmailForm, BindingResult bindingResult, Locale locale ) { if ( user == null ) { @@ -245,7 +245,7 @@ public ModelAndView getOntologies( @SuppressWarnings("unused") ImportOntologyFor } @GetMapping("/admin/ontologies/{ontology}") - public ModelAndView getOntology( @PathVariable(required = false) Ontology ontology, Locale locale ) { + public ModelAndView getOntology( @PathVariable(required = false) @Nullable Ontology ontology, Locale locale ) { if ( ontology == null ) { return new ModelAndView( "error/404", HttpStatus.NOT_FOUND ) .addObject( "message", messageSource.getMessage( "AdminController.ontologyNotFoundById", null, locale ) ); @@ -293,15 +293,17 @@ public static UpdateOntologyForm fromOntology( Ontology ontology ) { @Size(min = 1, max = Ontology.MAX_NAME_LENGTH) private String name; + @Nullable private String definition; + @Nullable private URL ontologyUrl; private boolean availableForGeneSearch; } @PostMapping("/admin/ontologies/{ontology}") - public ModelAndView updateOntology( @PathVariable(required = false) Ontology ontology, + public ModelAndView updateOntology( @PathVariable(required = false) @Nullable Ontology ontology, @Valid UpdateOntologyForm updateOntologyForm, BindingResult bindingResult, Locale locale ) { if ( ontology == null ) { @@ -337,7 +339,7 @@ public ModelAndView updateOntology( @PathVariable(required = false) Ontology ont } @DeleteMapping("/admin/ontologies/{ontology}") - public Object deleteOntology( @PathVariable(required = false) Ontology ontology, + public Object deleteOntology( @PathVariable(required = false) @Nullable Ontology ontology, @Valid DeleteOntologyForm deleteOntologyForm, BindingResult bindingResult, RedirectAttributes redirectAttributes, Locale locale ) { @@ -395,7 +397,7 @@ public Object createSimpleOntology( @SuppressWarnings("unused") ImportOntologyFo } @PostMapping("/admin/ontologies/{ontology}/update-simple-ontology") - public Object updateSimpleOntology( @PathVariable(required = false) Ontology ontology, + public Object updateSimpleOntology( @PathVariable(required = false) @Nullable Ontology ontology, @Valid SimpleOntologyForm simpleOntologyForm, BindingResult bindingResult, RedirectAttributes redirectAttributes, Locale locale ) { if ( ontology == null ) { @@ -483,6 +485,7 @@ public static SimpleOntologyTermForm emptyRow() { /** * Auto-generated if null or empty, which is why we allow zero as a size. */ + @Nullable @Size(max = OntologyTermInfo.MAX_TERM_ID_LENGTH, groups = RowNotEmpty.class) private String termId; @NotNull(groups = RowNotEmpty.class) @@ -631,7 +634,7 @@ public void initBinding2( WebDataBinder webDataBinder ) { } @PostMapping("/admin/ontologies/{ontology}/update") - public Object updateOntology( @PathVariable(required = false) Ontology ontology, + public Object updateOntology( @PathVariable(required = false) @Nullable Ontology ontology, RedirectAttributes redirectAttributes, Locale locale ) { if ( ontology == null ) { @@ -716,7 +719,12 @@ public Object importReactomePathways( RedirectAttributes redirectAttributes ) { @PostMapping("/admin/ontologies/{ontology}/update-reactome-pathways") public Object updateReactomePathways( @PathVariable(required = false) @Nullable Ontology ontology, RedirectAttributes redirectAttributes, Locale locale ) { // null-check is not necessary, but can save a database call - if ( ontology == null || !ontology.equals( reactomeService.findPathwaysOntology() ) ) { + if ( ontology == null ) { + return new ModelAndView( "error/404", HttpStatus.NOT_FOUND ) + .addObject( "message", messageSource.getMessage( "AdminController.ontologyNotFoundById", null, locale ) ); + } + Ontology reactome = reactomeService.findPathwaysOntology(); + if ( reactome == null || !reactome.equals( ontology ) ) { return new ModelAndView( "error/404", HttpStatus.NOT_FOUND ) .addObject( "message", messageSource.getMessage( "AdminController.ontologyNotFoundById", null, locale ) ); } @@ -821,7 +829,7 @@ public static class DeactivateOntologyForm extends ActivateOrDeactivateOntologyF } @PostMapping("/admin/ontologies/{ontology}/activate") - public Object activateOntology( @PathVariable(required = false) Ontology ontology, ActivateOntologyForm activateOntologyForm, RedirectAttributes redirectAttributes, Locale locale ) { + public Object activateOntology( @PathVariable(required = false) @Nullable Ontology ontology, ActivateOntologyForm activateOntologyForm, RedirectAttributes redirectAttributes, Locale locale ) { if ( ontology == null ) { return new ModelAndView( "error/404", HttpStatus.NOT_FOUND ) .addObject( "message", messageSource.getMessage( "AdminController.ontologyNotFoundById", null, locale ) ); @@ -833,7 +841,7 @@ public Object activateOntology( @PathVariable(required = false) Ontology ontolog } @PostMapping("/admin/ontologies/{ontology}/deactivate") - public Object deactivateOntology( @PathVariable(required = false) Ontology ontology, DeactivateOntologyForm deactivateOntologyForm, RedirectAttributes redirectAttributes, Locale locale ) { + public Object deactivateOntology( @PathVariable(required = false) @Nullable Ontology ontology, DeactivateOntologyForm deactivateOntologyForm, RedirectAttributes redirectAttributes, Locale locale ) { if ( ontology == null ) { return new ModelAndView( "error/404", HttpStatus.NOT_FOUND ) .addObject( "message", messageSource.getMessage( "AdminController.ontologyNotFoundById", null, locale ) ); @@ -890,7 +898,7 @@ public Object deactivateTerm( @PathVariable(required = false) Ontology ontology, return activateOrDeactivateTerm( ontology, deactivateTermForm, bindingResult, redirectAttributes, locale ); } - private Object activateOrDeactivateTerm( Ontology ontology, + private Object activateOrDeactivateTerm( @Nullable Ontology ontology, ActivateOrDeactivateTermForm activateOrDeactivateTermForm, BindingResult bindingResult, RedirectAttributes redirectAttributes, Locale locale ) { @@ -901,7 +909,7 @@ private Object activateOrDeactivateTerm( Ontology ontology, OntologyTermInfo ontologyTermInfo = null; if ( !bindingResult.hasFieldErrors( "ontologyTermInfoId" ) ) { - ontologyTermInfo = ontologyService.findTermByTermIdAndOntology( activateOrDeactivateTermForm.ontologyTermInfoId, ontology ); + ontologyTermInfo = ontologyService.findTermByTermIdAndOntology( activateOrDeactivateTermForm.ontologyTermInfoId, ontology ).orElse( null ); if ( ontologyTermInfo == null ) { bindingResult.rejectValue( "ontologyTermInfoId", "AdminController.ActivateOrDeactivateTermForm.unknownTermInOntology", new String[]{ activateOrDeactivateTermForm.getOntologyTermInfoId(), messageSource.getMessage( ontology.getResolvableTitle(), locale ) }, null ); @@ -953,7 +961,7 @@ private Object activateOrDeactivateTerm( Ontology ontology, * Provides the ontology in OBO format. */ @GetMapping(value = "/admin/ontologies/{ontology}/download", produces = "text/plain") - public ResponseEntity downloadOntology( @PathVariable(required = false) Ontology ontology, TimeZone timeZone ) { + public ResponseEntity downloadOntology( @PathVariable(required = false) @Nullable Ontology ontology, TimeZone timeZone ) { if ( ontology == null ) { return ResponseEntity.notFound().build(); } @@ -969,7 +977,7 @@ public ResponseEntity downloadOntology( @PathVariable(req @ResponseBody @GetMapping("/admin/ontologies/{ontology}/autocomplete-terms") - public Object autocompleteOntologyTerms( @PathVariable(required = false) Ontology ontology, @RequestParam String query, Locale locale ) { + public Object autocompleteOntologyTerms( @PathVariable(required = false) @Nullable Ontology ontology, @RequestParam String query, Locale locale ) { if ( ontology == null ) { return ResponseEntity.status( HttpStatus.NOT_FOUND ) .body( messageSource.getMessage( "AdminController.ontologyNotFoundById", null, locale ) ); @@ -993,7 +1001,7 @@ public ResponseEntity refreshMessages() { } @PostMapping("/admin/ontologies/{ontology}/move") - public Object move( @PathVariable(required = false) Ontology ontology, @RequestParam String direction, + public Object move( @PathVariable(required = false) @Nullable Ontology ontology, @RequestParam String direction, @SuppressWarnings("unused") ImportOntologyForm importOntologyForm, Locale locale ) { if ( ontology == null ) { diff --git a/src/main/java/ubc/pavlab/rdp/controllers/LoginController.java b/src/main/java/ubc/pavlab/rdp/controllers/LoginController.java index 7cb7cc22..89e8bb04 100644 --- a/src/main/java/ubc/pavlab/rdp/controllers/LoginController.java +++ b/src/main/java/ubc/pavlab/rdp/controllers/LoginController.java @@ -26,6 +26,7 @@ import ubc.pavlab.rdp.validation.Recaptcha; import ubc.pavlab.rdp.validation.RecaptchaValidator; +import javax.annotation.Nullable; import javax.servlet.http.HttpServletRequest; import java.util.List; import java.util.Locale; @@ -110,8 +111,8 @@ public ModelAndView registration() { @PostMapping("/registration") public ModelAndView createNewUser( @Validated(User.ValidationUserAccount.class) User user, BindingResult bindingResult, - @RequestParam(name = "g-recaptcha-response", required = false) String recaptchaResponse, - @RequestHeader(name = "X-Forwarded-For", required = false) List clientIp, + @RequestParam(name = "g-recaptcha-response", required = false) @Nullable String recaptchaResponse, + @RequestHeader(name = "X-Forwarded-For", required = false) @Nullable List clientIp, RedirectAttributes redirectAttributes, Locale locale ) { ModelAndView modelAndView = new ModelAndView( "registration" ); @@ -129,19 +130,10 @@ public ModelAndView createNewUser( @Validated(User.ValidationUserAccount.class) } User existingUser = userService.findUserByEmailNoAuth( user.getEmail() ); - - // profile can be missing of no profile.* fields have been set - if ( user.getProfile() == null ) { - user.setProfile( new Profile() ); - } - user.setEnabled( false ); // initialize a basic user profile Profile userProfile = user.getProfile(); - if ( userProfile == null ) { - userProfile = new Profile(); - } userProfile.setPrivacyLevel( privacyService.getDefaultPrivacyLevel() ); userProfile.setShared( applicationSettings.getPrivacy().isDefaultSharing() ); userProfile.setHideGenelist( false ); diff --git a/src/main/java/ubc/pavlab/rdp/controllers/PasswordController.java b/src/main/java/ubc/pavlab/rdp/controllers/PasswordController.java index a7c918a0..d6451548 100644 --- a/src/main/java/ubc/pavlab/rdp/controllers/PasswordController.java +++ b/src/main/java/ubc/pavlab/rdp/controllers/PasswordController.java @@ -22,6 +22,8 @@ import javax.validation.Valid; import java.util.Locale; +import static java.util.Objects.requireNonNull; + /** * Created by mjacobson on 23/01/18. */ @@ -103,7 +105,7 @@ public ModelAndView showChangePasswordPage( @RequestParam("id") int id, @Request } // Log in - User user = userService.findUserByIdNoAuth( id ); + User user = requireNonNull( userService.findUserByIdNoAuth( id ) ); UserPrinciple principle = new UserPrinciple( user ); Authentication auth = new UsernamePasswordAuthenticationToken( principle, null, principle.getAuthorities() ); SecurityContextHolder.getContext().setAuthentication( auth ); diff --git a/src/main/java/ubc/pavlab/rdp/controllers/SearchViewController.java b/src/main/java/ubc/pavlab/rdp/controllers/SearchViewController.java index 33dd4885..4b3f1259 100644 --- a/src/main/java/ubc/pavlab/rdp/controllers/SearchViewController.java +++ b/src/main/java/ubc/pavlab/rdp/controllers/SearchViewController.java @@ -264,8 +264,8 @@ public ModelAndView searchUsersByGeneView( @RequestParam String symbol, @GetMapping(value = "/search/view/orthologs") public ModelAndView searchOrthologsForGene( @RequestParam String symbol, @RequestParam Integer taxonId, - @RequestParam(required = false) Set tiers, - @RequestParam(required = false) Integer orthologTaxonId, + @RequestParam(required = false) @Nullable Set tiers, + @RequestParam(required = false) @Nullable Integer orthologTaxonId, Locale locale ) { // Only look for orthologs when taxon is human if ( taxonId != 9606 ) { @@ -324,7 +324,7 @@ public ModelAndView searchOrthologsForGene( @RequestParam String symbol, */ @PreAuthorize("hasPermission(null, 'international-search')") @GetMapping("/search/view/international/available-terms-by-partner") - public ModelAndView getAvailableTermsByPartner( @RequestParam(required = false) List ontologyTermIds ) { + public ModelAndView getAvailableTermsByPartner( @RequestParam(required = false) @Nullable List ontologyTermIds ) { if ( ontologyTermIds == null || ontologyTermIds.isEmpty() ) { return new ModelAndView( "fragments/error::message", HttpStatus.BAD_REQUEST ) .addObject( "errorMessage", "There must be at least one specified ontology term ID via 'ontologyTermIds'." ); diff --git a/src/main/java/ubc/pavlab/rdp/controllers/TermController.java b/src/main/java/ubc/pavlab/rdp/controllers/TermController.java index accf24cf..ee4e7ca7 100644 --- a/src/main/java/ubc/pavlab/rdp/controllers/TermController.java +++ b/src/main/java/ubc/pavlab/rdp/controllers/TermController.java @@ -3,21 +3,13 @@ import lombok.extern.apachecommons.CommonsLog; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; -import ubc.pavlab.rdp.model.GeneInfo; import ubc.pavlab.rdp.model.GeneOntologyTerm; import ubc.pavlab.rdp.model.GeneOntologyTermInfo; import ubc.pavlab.rdp.model.Taxon; import ubc.pavlab.rdp.services.GOService; import ubc.pavlab.rdp.services.TaxonService; -import ubc.pavlab.rdp.util.SearchResult; - -import java.util.Collection; -import java.util.Comparator; -import java.util.List; -import java.util.stream.Collectors; /** * Created by mjacobson on 18/01/18. diff --git a/src/main/java/ubc/pavlab/rdp/controllers/UserController.java b/src/main/java/ubc/pavlab/rdp/controllers/UserController.java index a92f278a..cab4d0d3 100644 --- a/src/main/java/ubc/pavlab/rdp/controllers/UserController.java +++ b/src/main/java/ubc/pavlab/rdp/controllers/UserController.java @@ -171,6 +171,7 @@ public static class SupportForm { @NotNull(message = "The message must be provided.") @Size(min = 1, message = "The message must not be empty.") private String message; + @Nullable private MultipartFile attachment; } @@ -359,7 +360,9 @@ static class ProfileSavedModel { @Data static class FieldErrorModel { private final String field; + @Nullable private final String message; + @Nullable private final Object rejectedValue; public static FieldErrorModel fromFieldError( FieldError fieldError ) { diff --git a/src/main/java/ubc/pavlab/rdp/events/OnRegistrationCompleteEvent.java b/src/main/java/ubc/pavlab/rdp/events/OnRegistrationCompleteEvent.java index b9e10ac9..e6fc04ae 100644 --- a/src/main/java/ubc/pavlab/rdp/events/OnRegistrationCompleteEvent.java +++ b/src/main/java/ubc/pavlab/rdp/events/OnRegistrationCompleteEvent.java @@ -2,7 +2,6 @@ import lombok.EqualsAndHashCode; import lombok.Getter; -import lombok.Setter; import org.springframework.context.ApplicationEvent; import ubc.pavlab.rdp.model.User; import ubc.pavlab.rdp.model.VerificationToken; diff --git a/src/main/java/ubc/pavlab/rdp/events/OnRequestAccessEvent.java b/src/main/java/ubc/pavlab/rdp/events/OnRequestAccessEvent.java index b804a5e0..a837298d 100644 --- a/src/main/java/ubc/pavlab/rdp/events/OnRequestAccessEvent.java +++ b/src/main/java/ubc/pavlab/rdp/events/OnRequestAccessEvent.java @@ -11,9 +11,9 @@ @EqualsAndHashCode(callSuper = false) public class OnRequestAccessEvent extends ApplicationEvent { - private User user; - private T object; - private String reason; + private final User user; + private final T object; + private final String reason; public OnRequestAccessEvent( User user, T object, String reason ) { super( user ); diff --git a/src/main/java/ubc/pavlab/rdp/listeners/UserListener.java b/src/main/java/ubc/pavlab/rdp/listeners/UserListener.java index 05d2e9f5..837994b6 100644 --- a/src/main/java/ubc/pavlab/rdp/listeners/UserListener.java +++ b/src/main/java/ubc/pavlab/rdp/listeners/UserListener.java @@ -2,9 +2,7 @@ import lombok.extern.apachecommons.CommonsLog; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; -import org.springframework.transaction.event.TransactionPhase; import org.springframework.transaction.event.TransactionalEventListener; import ubc.pavlab.rdp.events.OnContactEmailUpdateEvent; import ubc.pavlab.rdp.events.OnRegistrationCompleteEvent; diff --git a/src/main/java/ubc/pavlab/rdp/model/Gene.java b/src/main/java/ubc/pavlab/rdp/model/Gene.java index cad98756..e5e18f2b 100644 --- a/src/main/java/ubc/pavlab/rdp/model/Gene.java +++ b/src/main/java/ubc/pavlab/rdp/model/Gene.java @@ -6,6 +6,7 @@ import lombok.Setter; import lombok.ToString; import org.hibernate.annotations.NaturalId; +import org.springframework.lang.Nullable; import javax.persistence.*; import java.io.Serializable; @@ -42,5 +43,6 @@ public abstract class Gene implements Serializable { @JsonIgnore @Column(name = "modification_date") + @Nullable private LocalDate modificationDate; } diff --git a/src/main/java/ubc/pavlab/rdp/model/GeneInfo.java b/src/main/java/ubc/pavlab/rdp/model/GeneInfo.java index 0363ca0e..1a12aea0 100644 --- a/src/main/java/ubc/pavlab/rdp/model/GeneInfo.java +++ b/src/main/java/ubc/pavlab/rdp/model/GeneInfo.java @@ -4,7 +4,6 @@ import lombok.Getter; import javax.persistence.*; -import java.io.Serializable; import java.util.Comparator; import java.util.HashSet; import java.util.Set; diff --git a/src/main/java/ubc/pavlab/rdp/model/GeneOntologyTermInfo.java b/src/main/java/ubc/pavlab/rdp/model/GeneOntologyTermInfo.java index 0b8fffe0..a7321c24 100644 --- a/src/main/java/ubc/pavlab/rdp/model/GeneOntologyTermInfo.java +++ b/src/main/java/ubc/pavlab/rdp/model/GeneOntologyTermInfo.java @@ -1,17 +1,14 @@ package ubc.pavlab.rdp.model; import com.fasterxml.jackson.annotation.JsonIgnore; -import lombok.Data; import lombok.Getter; import lombok.Setter; import lombok.ToString; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; -import ubc.pavlab.rdp.model.enums.RelationshipType; import ubc.pavlab.rdp.services.GOService; import java.util.*; -import java.util.stream.Collectors; @Getter @Setter diff --git a/src/main/java/ubc/pavlab/rdp/model/Profile.java b/src/main/java/ubc/pavlab/rdp/model/Profile.java index cafcc688..33b07f90 100644 --- a/src/main/java/ubc/pavlab/rdp/model/Profile.java +++ b/src/main/java/ubc/pavlab/rdp/model/Profile.java @@ -9,6 +9,7 @@ import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.Email; import org.hibernate.validator.constraints.URL; +import org.springframework.lang.Nullable; import ubc.pavlab.rdp.model.enums.PrivacyLevelType; import ubc.pavlab.rdp.model.enums.ResearcherCategory; import ubc.pavlab.rdp.model.enums.ResearcherPosition; @@ -55,6 +56,7 @@ public String getFullName() { @Lob @Column(name = "description", columnDefinition = "TEXT") + @Nullable private String description; @Column(name = "organization") @@ -66,6 +68,7 @@ public String getFullName() { @Column(name = "phone") private String phone; + @Nullable @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) @Email(message = "Your email address is not valid.") @Column(name = "contact_email") @@ -76,6 +79,7 @@ public String getFullName() { private boolean contactEmailVerified; @JsonIgnore + @Nullable @Column(name = "contact_email_verified_at") private Instant contactEmailVerifiedAt; @@ -83,6 +87,7 @@ public String getFullName() { @URL private String website; + @Nullable @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) @Enumerated(EnumType.ORDINAL) @Column(name = "privacy_level") @@ -102,6 +107,7 @@ public String getFullName() { @JoinColumn(name = "user_id") private final Set publications = new HashSet<>(); + @Nullable @Enumerated(EnumType.STRING) @Column(name = "researcher_position") private ResearcherPosition researcherPosition; diff --git a/src/main/java/ubc/pavlab/rdp/model/Taxon.java b/src/main/java/ubc/pavlab/rdp/model/Taxon.java index 4d54b9ea..555cb1a4 100644 --- a/src/main/java/ubc/pavlab/rdp/model/Taxon.java +++ b/src/main/java/ubc/pavlab/rdp/model/Taxon.java @@ -7,6 +7,7 @@ import org.hibernate.annotations.Immutable; import org.springframework.context.MessageSourceResolvable; import org.springframework.context.support.DefaultMessageSourceResolvable; +import org.springframework.lang.Nullable; import javax.persistence.*; import java.io.Serializable; @@ -43,6 +44,7 @@ public static Comparator getComparator() { private String commonName; + @Nullable @JsonIgnore private URL geneUrl; diff --git a/src/main/java/ubc/pavlab/rdp/model/User.java b/src/main/java/ubc/pavlab/rdp/model/User.java index 7639a7b4..2311f931 100644 --- a/src/main/java/ubc/pavlab/rdp/model/User.java +++ b/src/main/java/ubc/pavlab/rdp/model/User.java @@ -63,7 +63,7 @@ public static UserBuilder builder( Profile profile ) { public static Comparator getComparator() { return Comparator - .comparing( ( User u ) -> u.getProfile().getFullName() ) + .comparing( ( User u ) -> u.getProfile().getFullName(), Comparator.nullsLast( Comparator.naturalOrder() ) ) .thenComparing( User::getOriginUrl, Comparator.nullsLast( Comparator.naturalOrder() ) ) // at least one of the two must be non-null .thenComparing( User::getId, Comparator.nullsLast( Comparator.naturalOrder() ) ) @@ -140,15 +140,15 @@ public static Comparator getComparator() { private final Set passwordResetTokens = new HashSet<>(); @Valid - @NotNull @Embedded @JsonUnwrapped - private Profile profile; + private Profile profile = new Profile(); @Transient private String origin; @Transient + @Nullable private URI originUrl; /* Research related information */ @@ -258,7 +258,7 @@ public String getVerifiedContactEmailJsonValue() { @JsonIgnore @Transient public Optional getVerifiedAtContactEmail() { - if ( profile.isContactEmailVerified() ) { + if ( profile != null && profile.isContactEmailVerified() ) { return Optional.ofNullable( profile.getContactEmailVerifiedAt() ); } else if ( enabled ) { return Optional.ofNullable( enabledAt ); @@ -276,11 +276,13 @@ public Optional getOwner() { @Override @JsonProperty(value = "privacyLevel") public PrivacyLevelType getEffectivePrivacyLevel() { + // profile can be null when deserialized by Jackson + PrivacyLevelType privacyLevel = profile != null ? profile.getPrivacyLevel() : PrivacyLevelType.PRIVATE; // this is a fallback - if ( getProfile() == null || getProfile().getPrivacyLevel() == null ) { - log.warn( MessageFormat.format( "User {0} has no profile or a null privacy level defined in its profile.", this ) ); + if ( privacyLevel == null ) { + log.warn( MessageFormat.format( this + " has a null privacy level defined in its profile, defaulting to PRIVATE.", this ) ); return PrivacyLevelType.PRIVATE; } - return getProfile().getPrivacyLevel(); + return privacyLevel; } } diff --git a/src/main/java/ubc/pavlab/rdp/model/UserContent.java b/src/main/java/ubc/pavlab/rdp/model/UserContent.java index 0a22ec57..d0e79272 100644 --- a/src/main/java/ubc/pavlab/rdp/model/UserContent.java +++ b/src/main/java/ubc/pavlab/rdp/model/UserContent.java @@ -1,6 +1,5 @@ package ubc.pavlab.rdp.model; -import org.springframework.lang.NonNull; import ubc.pavlab.rdp.model.enums.PrivacyLevelType; import java.time.Instant; diff --git a/src/main/java/ubc/pavlab/rdp/model/UserGene.java b/src/main/java/ubc/pavlab/rdp/model/UserGene.java index a5290d1c..0dc51de5 100644 --- a/src/main/java/ubc/pavlab/rdp/model/UserGene.java +++ b/src/main/java/ubc/pavlab/rdp/model/UserGene.java @@ -142,12 +142,16 @@ public Optional getOwner() { @Override @JsonProperty("privacyLevel") public PrivacyLevelType getEffectivePrivacyLevel() { - PrivacyLevelType privacyLevel = getPrivacyLevel() != null ? getPrivacyLevel() : getUser().getProfile().getPrivacyLevel(); + PrivacyLevelType privacyLevel = getPrivacyLevel(); // the user can be null if it was deserialized by Jackson (see @JsonIgnore on user above) - if ( getUser() != null && privacyLevel.ordinal() > getUser().getEffectivePrivacyLevel().ordinal() ) { + PrivacyLevelType userPrivacyLevel = user != null ? getUser().getEffectivePrivacyLevel() : PrivacyLevelType.PRIVATE; + if ( privacyLevel == null ) { + privacyLevel = userPrivacyLevel; + } + if ( privacyLevel.ordinal() > userPrivacyLevel.ordinal() ) { log.warn( MessageFormat.format( "Gene privacy level {0} of {1} is looser than that of the user profile {2}, and will be capped to {3}.", - privacyLevel, this, getUser(), getUser().getEffectivePrivacyLevel() ) ); - return getUser().getEffectivePrivacyLevel(); + privacyLevel, this, user, userPrivacyLevel ) ); + privacyLevel = userPrivacyLevel; } return privacyLevel; } diff --git a/src/main/java/ubc/pavlab/rdp/model/enums/TierType.java b/src/main/java/ubc/pavlab/rdp/model/enums/TierType.java index e088fbe5..f4b38a1e 100644 --- a/src/main/java/ubc/pavlab/rdp/model/enums/TierType.java +++ b/src/main/java/ubc/pavlab/rdp/model/enums/TierType.java @@ -4,7 +4,6 @@ import lombok.Getter; import java.util.EnumSet; -import java.util.Set; /** * Created by mjacobson on 28/01/18. diff --git a/src/main/java/ubc/pavlab/rdp/model/enums/package-info.java b/src/main/java/ubc/pavlab/rdp/model/enums/package-info.java new file mode 100644 index 00000000..440e2a9b --- /dev/null +++ b/src/main/java/ubc/pavlab/rdp/model/enums/package-info.java @@ -0,0 +1,7 @@ +/** + * + */ +@NonNullApi +package ubc.pavlab.rdp.model.enums; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/src/main/java/ubc/pavlab/rdp/model/ontology/Ontology.java b/src/main/java/ubc/pavlab/rdp/model/ontology/Ontology.java index a769898f..2bb40352 100644 --- a/src/main/java/ubc/pavlab/rdp/model/ontology/Ontology.java +++ b/src/main/java/ubc/pavlab/rdp/model/ontology/Ontology.java @@ -7,6 +7,7 @@ import org.hibernate.annotations.LazyCollectionOption; import org.springframework.context.MessageSourceResolvable; import org.springframework.context.support.DefaultMessageSourceResolvable; +import org.springframework.lang.Nullable; import javax.persistence.*; import java.net.URL; @@ -65,6 +66,7 @@ public static Comparator getComparator() { @Lob @Column(columnDefinition = "TEXT") + @Nullable private String definition; /** @@ -101,6 +103,7 @@ public static Comparator getComparator() { * The only supported format for now is OBO. */ @JsonIgnore + @Nullable private URL ontologyUrl; /** @@ -155,6 +158,6 @@ public DefaultMessageSourceResolvable getResolvableTitle() { @JsonIgnore public DefaultMessageSourceResolvable getResolvableDefinition() { - return new DefaultMessageSourceResolvable( new String[]{ "rdp.ontologies." + name + ".definition" }, definition ); + return new DefaultMessageSourceResolvable( new String[]{ "rdp.ontologies." + name + ".definition" }, null, definition ); } } diff --git a/src/main/java/ubc/pavlab/rdp/model/ontology/OntologyTermInfo.java b/src/main/java/ubc/pavlab/rdp/model/ontology/OntologyTermInfo.java index 73ae4f81..c260dff4 100644 --- a/src/main/java/ubc/pavlab/rdp/model/ontology/OntologyTermInfo.java +++ b/src/main/java/ubc/pavlab/rdp/model/ontology/OntologyTermInfo.java @@ -9,6 +9,7 @@ import org.hibernate.annotations.SortComparator; import org.springframework.context.MessageSourceResolvable; import org.springframework.context.support.DefaultMessageSourceResolvable; +import org.springframework.lang.Nullable; import javax.persistence.*; import java.text.Collator; @@ -103,6 +104,7 @@ public int compare( String a, String b ) { @Lob @Column(columnDefinition = "TEXT") + @Nullable private String definition; /** @@ -138,6 +140,7 @@ public int compare( String a, String b ) { */ @JsonIgnore @Column + @Nullable private Integer ordering; /** @@ -214,6 +217,6 @@ public int compareTo( OntologyTermInfo ontologyTermInfo ) { @Override @JsonIgnore public DefaultMessageSourceResolvable getResolvableDefinition() { - return new DefaultMessageSourceResolvable( new String[]{ "rdp.ontologies." + getOntology().getName() + ".terms." + getName() + ".definition" }, definition ); + return new DefaultMessageSourceResolvable( new String[]{ "rdp.ontologies." + getOntology().getName() + ".terms." + getName() + ".definition" }, null, definition ); } } diff --git a/src/main/java/ubc/pavlab/rdp/model/ontology/package-info.java b/src/main/java/ubc/pavlab/rdp/model/ontology/package-info.java new file mode 100644 index 00000000..9d99120c --- /dev/null +++ b/src/main/java/ubc/pavlab/rdp/model/ontology/package-info.java @@ -0,0 +1,7 @@ +/** + * + */ +@NonNullApi +package ubc.pavlab.rdp.model.ontology; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/src/main/java/ubc/pavlab/rdp/ontology/resolvers/OntobeeResolver.java b/src/main/java/ubc/pavlab/rdp/ontology/resolvers/OntobeeResolver.java index 62ab1af1..04b5531f 100644 --- a/src/main/java/ubc/pavlab/rdp/ontology/resolvers/OntobeeResolver.java +++ b/src/main/java/ubc/pavlab/rdp/ontology/resolvers/OntobeeResolver.java @@ -21,7 +21,7 @@ public class OntobeeResolver implements OntologyResolver { @Override public boolean accepts( Ontology ontology ) { - return ontology.getOntologyUrl().toExternalForm().startsWith( DEFAULT_IRI_PREFIX ); + return ontology.getOntologyUrl() != null && ontology.getOntologyUrl().toExternalForm().startsWith( DEFAULT_IRI_PREFIX ); } @Override diff --git a/src/main/java/ubc/pavlab/rdp/ontology/resolvers/ReactomeResolver.java b/src/main/java/ubc/pavlab/rdp/ontology/resolvers/ReactomeResolver.java index fd7fd7a1..eaf27026 100644 --- a/src/main/java/ubc/pavlab/rdp/ontology/resolvers/ReactomeResolver.java +++ b/src/main/java/ubc/pavlab/rdp/ontology/resolvers/ReactomeResolver.java @@ -23,7 +23,8 @@ public class ReactomeResolver implements OntologyResolver { @Override public boolean accepts( Ontology ontology ) { - return ontology.equals( reactomeService.findPathwaysOntology() ); + Ontology reactome = reactomeService.findPathwaysOntology(); + return reactome != null && reactome.equals( ontology ); } @Override diff --git a/src/main/java/ubc/pavlab/rdp/repositories/AccessTokenRepository.java b/src/main/java/ubc/pavlab/rdp/repositories/AccessTokenRepository.java index 77045999..ec0e7302 100644 --- a/src/main/java/ubc/pavlab/rdp/repositories/AccessTokenRepository.java +++ b/src/main/java/ubc/pavlab/rdp/repositories/AccessTokenRepository.java @@ -4,8 +4,10 @@ import org.springframework.stereotype.Repository; import ubc.pavlab.rdp.model.AccessToken; +import java.util.Optional; + @Repository public interface AccessTokenRepository extends JpaRepository { - AccessToken findByToken( String token ); + Optional findByToken( String token ); } diff --git a/src/main/java/ubc/pavlab/rdp/repositories/GeneInfoRepository.java b/src/main/java/ubc/pavlab/rdp/repositories/GeneInfoRepository.java index cff84890..cedcfa8a 100644 --- a/src/main/java/ubc/pavlab/rdp/repositories/GeneInfoRepository.java +++ b/src/main/java/ubc/pavlab/rdp/repositories/GeneInfoRepository.java @@ -3,29 +3,26 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import org.springframework.lang.Nullable; import org.springframework.stereotype.Repository; import ubc.pavlab.rdp.model.GeneInfo; import ubc.pavlab.rdp.model.Taxon; import java.util.Collection; +import java.util.Optional; @Repository public interface GeneInfoRepository extends JpaRepository { - @Nullable - GeneInfo findByGeneId( Integer geneId ); + Optional findByGeneId( Integer geneId ); Collection findAllByGeneIdIn( Collection geneIds ); @Query("select gene from GeneInfo gene left join fetch gene.orthologs where gene.geneId in :geneIds") Collection findAllByGeneIdWithOrthologs( @Param("geneIds") Collection geneIds ); - @Nullable - GeneInfo findByGeneIdAndTaxon( Integer geneId, Taxon taxon ); + Optional findByGeneIdAndTaxon( Integer geneId, Taxon taxon ); - @Nullable - GeneInfo findBySymbolAndTaxon( String symbol, Taxon taxon ); + Optional findBySymbolAndTaxon( String symbol, Taxon taxon ); Collection findBySymbolInAndTaxon( Collection symbols, Taxon taxon ); @@ -37,7 +34,5 @@ public interface GeneInfoRepository extends JpaRepository { Collection findAllByAliasesContainingIgnoreCaseAndTaxon( String query, Taxon taxon ); - Collection findAllByTaxonActiveTrue(); - long countByTaxon( Taxon taxon ); } diff --git a/src/main/java/ubc/pavlab/rdp/repositories/OrganInfoRepository.java b/src/main/java/ubc/pavlab/rdp/repositories/OrganInfoRepository.java index 219bc795..d713e812 100644 --- a/src/main/java/ubc/pavlab/rdp/repositories/OrganInfoRepository.java +++ b/src/main/java/ubc/pavlab/rdp/repositories/OrganInfoRepository.java @@ -5,11 +5,12 @@ import ubc.pavlab.rdp.model.OrganInfo; import java.util.Collection; +import java.util.Optional; @Repository public interface OrganInfoRepository extends JpaRepository { - OrganInfo findByUberonId( String id ); + Optional findByUberonId( String id ); Collection findByActiveTrueOrderByOrdering(); diff --git a/src/main/java/ubc/pavlab/rdp/repositories/PasswordResetTokenRepository.java b/src/main/java/ubc/pavlab/rdp/repositories/PasswordResetTokenRepository.java index 87c2320b..269b4e80 100644 --- a/src/main/java/ubc/pavlab/rdp/repositories/PasswordResetTokenRepository.java +++ b/src/main/java/ubc/pavlab/rdp/repositories/PasswordResetTokenRepository.java @@ -3,16 +3,16 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; -import org.springframework.lang.Nullable; import org.springframework.stereotype.Repository; import ubc.pavlab.rdp.model.PasswordResetToken; import java.time.Instant; +import java.util.Optional; @Repository public interface PasswordResetTokenRepository extends JpaRepository { - @Nullable - PasswordResetToken findByToken( String token ); + + Optional findByToken( String token ); @Modifying @Query("delete from PasswordResetToken t where t.expiryDate <= :since") diff --git a/src/main/java/ubc/pavlab/rdp/repositories/RoleRepository.java b/src/main/java/ubc/pavlab/rdp/repositories/RoleRepository.java index 751a6094..678b5c8a 100644 --- a/src/main/java/ubc/pavlab/rdp/repositories/RoleRepository.java +++ b/src/main/java/ubc/pavlab/rdp/repositories/RoleRepository.java @@ -1,16 +1,16 @@ package ubc.pavlab.rdp.repositories; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.lang.Nullable; import org.springframework.stereotype.Repository; import ubc.pavlab.rdp.model.Role; +import java.util.Optional; + /** * Created by mjacobson on 16/01/18. */ @Repository public interface RoleRepository extends JpaRepository { - @Nullable - Role findByRole( String role ); + Optional findByRole( String role ); } \ No newline at end of file diff --git a/src/main/java/ubc/pavlab/rdp/repositories/TaxonRepository.java b/src/main/java/ubc/pavlab/rdp/repositories/TaxonRepository.java index 45daa0c3..5cb3d08b 100644 --- a/src/main/java/ubc/pavlab/rdp/repositories/TaxonRepository.java +++ b/src/main/java/ubc/pavlab/rdp/repositories/TaxonRepository.java @@ -13,6 +13,7 @@ public interface TaxonRepository extends JpaRepository { @QueryHints(@QueryHint(name = "org.hibernate.cacheable", value = "true")) List findByActiveTrue(); + @QueryHints(@QueryHint(name = "org.hibernate.cacheable", value = "true")) List findByActiveTrueOrderByOrdering(); } diff --git a/src/main/java/ubc/pavlab/rdp/repositories/UserGeneRepository.java b/src/main/java/ubc/pavlab/rdp/repositories/UserGeneRepository.java index f1b6e5e2..fbbba932 100644 --- a/src/main/java/ubc/pavlab/rdp/repositories/UserGeneRepository.java +++ b/src/main/java/ubc/pavlab/rdp/repositories/UserGeneRepository.java @@ -15,6 +15,7 @@ import javax.persistence.QueryHint; import java.util.Collection; +import java.util.Optional; import java.util.Set; @Repository @@ -55,7 +56,7 @@ public interface UserGeneRepository extends JpaRepository { Page findByPrivacyLevelAndUserEnabledTrueAndUserProfilePrivacyLevel( @Param("privacyLevel") PrivacyLevelType privacyLevel, @Nullable Pageable pageable ); @QueryHints(@QueryHint(name = "org.hibernate.cacheable", value = "true")) - UserGene findById( int id ); + Optional findById( int id ); @QueryHints(@QueryHint(name = "org.hibernate.cacheable", value = "true")) Collection findByGeneId( int geneId ); @@ -75,7 +76,7 @@ public interface UserGeneRepository extends JpaRepository { @QueryHints(@QueryHint(name = "org.hibernate.cacheable", value = "true")) Collection findBySymbolContainingIgnoreCaseAndTaxonAndTierIn( String symbolContaining, Taxon taxon, Set tiers ); - UserGene findBySymbolAndTaxon( String symbol, Taxon taxon ); + Optional findBySymbolAndTaxon( String symbol, Taxon taxon ); /** * Find all user genes ortholog to a given gene. diff --git a/src/main/java/ubc/pavlab/rdp/repositories/UserRepository.java b/src/main/java/ubc/pavlab/rdp/repositories/UserRepository.java index bdf3180b..8db2b504 100644 --- a/src/main/java/ubc/pavlab/rdp/repositories/UserRepository.java +++ b/src/main/java/ubc/pavlab/rdp/repositories/UserRepository.java @@ -13,8 +13,8 @@ import javax.persistence.QueryHint; import java.util.Collection; -import java.util.Optional; import java.util.List; +import java.util.Optional; @Repository public interface UserRepository extends JpaRepository { @@ -39,7 +39,7 @@ public interface UserRepository extends JpaRepository { Page findByEnabledTrueAndProfilePrivacyLevel( PrivacyLevelType privacyLevel, Pageable pageable ); @Query("select user from User user left join fetch user.roles where lower(user.email) = lower(:email)") - User findByEmailIgnoreCase( @Param("email") String email ); + Optional findByEmailIgnoreCase( @Param("email") String email ); @QueryHints(@QueryHint(name = "org.hibernate.cacheable", value = "true")) @Query("select u from User u where u.profile.lastName is not NULL and u.profile.lastName <> '' and u.profile.privacyLevel >= :privacyLevel") diff --git a/src/main/java/ubc/pavlab/rdp/repositories/VerificationTokenRepository.java b/src/main/java/ubc/pavlab/rdp/repositories/VerificationTokenRepository.java index be0210e9..035d863a 100644 --- a/src/main/java/ubc/pavlab/rdp/repositories/VerificationTokenRepository.java +++ b/src/main/java/ubc/pavlab/rdp/repositories/VerificationTokenRepository.java @@ -3,16 +3,16 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; -import org.springframework.lang.Nullable; import org.springframework.stereotype.Repository; import ubc.pavlab.rdp.model.VerificationToken; import java.time.Instant; +import java.util.Optional; @Repository public interface VerificationTokenRepository extends JpaRepository { - @Nullable - VerificationToken findByToken( String token ); + + Optional findByToken( String token ); @Modifying @Query("delete from VerificationToken t where t.expiryDate <= :since") diff --git a/src/main/java/ubc/pavlab/rdp/repositories/ontology/OntologyRepository.java b/src/main/java/ubc/pavlab/rdp/repositories/ontology/OntologyRepository.java index e9f56f8a..9632e927 100644 --- a/src/main/java/ubc/pavlab/rdp/repositories/ontology/OntologyRepository.java +++ b/src/main/java/ubc/pavlab/rdp/repositories/ontology/OntologyRepository.java @@ -8,6 +8,7 @@ import ubc.pavlab.rdp.model.ontology.Ontology; import java.util.List; +import java.util.Optional; /** * @author poirigui @@ -21,9 +22,9 @@ public interface OntologyRepository extends JpaRepository { List findAllByNameIn( List asList ); - Ontology findByName( String name ); + Optional findByName( String name ); - Ontology findByNameAndActiveTrue( String name ); + Optional findByNameAndActiveTrue( String name ); boolean existsByName( String name ); diff --git a/src/main/java/ubc/pavlab/rdp/repositories/ontology/OntologyTermInfoRepository.java b/src/main/java/ubc/pavlab/rdp/repositories/ontology/OntologyTermInfoRepository.java index 8580a350..c5405bc0 100644 --- a/src/main/java/ubc/pavlab/rdp/repositories/ontology/OntologyTermInfoRepository.java +++ b/src/main/java/ubc/pavlab/rdp/repositories/ontology/OntologyTermInfoRepository.java @@ -15,6 +15,7 @@ import java.io.Reader; import java.util.Collection; import java.util.List; +import java.util.Optional; import java.util.Set; /** @@ -25,7 +26,7 @@ @Repository public interface OntologyTermInfoRepository extends JpaRepository { - OntologyTermInfo findByTermIdAndOntology( String ontologyTermInfoId, Ontology ontology ); + Optional findByTermIdAndOntology( String ontologyTermInfoId, Ontology ontology ); List findAllByActiveTrueAndIdIn( Collection ids ); @@ -178,14 +179,14 @@ public interface OntologyTermInfoRepository extends JpaRepository findSubTermsIdsByTermIdIn( @Param("termIds") Set termIds ); - OntologyTermInfo findByTermIdAndOntologyName( String termId, String ontologyName ); + Optional findByTermIdAndOntologyName( String termId, String ontologyName ); /** * Retrieve the definition of an ontology. */ @QueryHints(@QueryHint(name = "org.hibernate.cacheable", value = "true")) @Query("select o.definition from Ontology o where o.name = :ontologyName") - String findDefinitionByOntologyName( @Param("ontologyName") String ontologyName ); + Optional findDefinitionByOntologyName( @Param("ontologyName") String ontologyName ); /** * Retrieve all the definitions matching an term name and its corresponding ontology name. diff --git a/src/main/java/ubc/pavlab/rdp/repositories/ontology/package-info.java b/src/main/java/ubc/pavlab/rdp/repositories/ontology/package-info.java new file mode 100644 index 00000000..0790a608 --- /dev/null +++ b/src/main/java/ubc/pavlab/rdp/repositories/ontology/package-info.java @@ -0,0 +1,7 @@ +/** + * + */ +@NonNullApi +package ubc.pavlab.rdp.repositories.ontology; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/src/main/java/ubc/pavlab/rdp/security/PermissionEvaluatorImpl.java b/src/main/java/ubc/pavlab/rdp/security/PermissionEvaluatorImpl.java index d041d5cc..52baa9f8 100644 --- a/src/main/java/ubc/pavlab/rdp/security/PermissionEvaluatorImpl.java +++ b/src/main/java/ubc/pavlab/rdp/security/PermissionEvaluatorImpl.java @@ -2,6 +2,7 @@ import lombok.extern.apachecommons.CommonsLog; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.lang.Nullable; import org.springframework.security.access.PermissionEvaluator; import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.core.Authentication; @@ -25,7 +26,7 @@ public class PermissionEvaluatorImpl implements PermissionEvaluator { private UserPrivacyService privacyService; @Override - public boolean hasPermission( Authentication authentication, Object targetDomainObject, Object permission ) { + public boolean hasPermission( Authentication authentication, @Nullable Object targetDomainObject, Object permission ) { User user = authentication instanceof AnonymousAuthenticationToken ? null : userService.findUserByIdNoAuth( ( (UserPrinciple) authentication.getPrincipal() ).getId() ); if ( permission.equals( Permissions.SEARCH ) ) { return privacyService.checkUserCanSearch( user, false ); diff --git a/src/main/java/ubc/pavlab/rdp/security/SecureTokenChallenge.java b/src/main/java/ubc/pavlab/rdp/security/SecureTokenChallenge.java index d45f1527..e46b627b 100644 --- a/src/main/java/ubc/pavlab/rdp/security/SecureTokenChallenge.java +++ b/src/main/java/ubc/pavlab/rdp/security/SecureTokenChallenge.java @@ -7,7 +7,7 @@ public interface SecureTokenChallenge { /** * @param token the token being challenged - * @throws TokenException + * @throws TokenException if the challenge fails */ void challenge( Token token, T object ) throws TokenException; diff --git a/src/main/java/ubc/pavlab/rdp/services/EmailServiceImpl.java b/src/main/java/ubc/pavlab/rdp/services/EmailServiceImpl.java index 4ea4ae4d..80986220 100644 --- a/src/main/java/ubc/pavlab/rdp/services/EmailServiceImpl.java +++ b/src/main/java/ubc/pavlab/rdp/services/EmailServiceImpl.java @@ -10,6 +10,7 @@ import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service; +import org.springframework.util.Assert; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.util.UriComponentsBuilder; import ubc.pavlab.rdp.model.PasswordResetToken; @@ -155,6 +156,7 @@ public Future sendRegistrationMessage( User user, VerificationToken token, Lo @Override public Future sendContactEmailVerificationMessage( User user, VerificationToken token, Locale locale ) throws MessagingException { + Assert.notNull( user.getProfile().getContactEmail(), "User must have a contact email." ); InternetAddress recipientAddress = new InternetAddress( user.getProfile().getContactEmail() ); String subject = messageSource.getMessage( "EmailService.sendContactEmailVerificationMessage.subject", new Object[]{ Messages.SHORTNAME }, locale ); URI confirmationUrl = UriComponentsBuilder.fromUri( siteSettings.getHostUrl() ) diff --git a/src/main/java/ubc/pavlab/rdp/services/GOServiceImpl.java b/src/main/java/ubc/pavlab/rdp/services/GOServiceImpl.java index 7352a58d..f153b8ab 100644 --- a/src/main/java/ubc/pavlab/rdp/services/GOServiceImpl.java +++ b/src/main/java/ubc/pavlab/rdp/services/GOServiceImpl.java @@ -226,7 +226,7 @@ private SearchResult queryTerm( String queryString, GeneOn } List splitPatterns = Arrays.stream( queryString.split( " " ) ) - .filter( s -> !s.equals( "" ) ) + .filter( s -> !s.isEmpty() ) .map( s -> "(?i:.*" + Pattern.quote( s ) + ".*)" ).collect( Collectors.toList() ); for ( String splitPattern : splitPatterns ) { diff --git a/src/main/java/ubc/pavlab/rdp/services/GeneInfoServiceImpl.java b/src/main/java/ubc/pavlab/rdp/services/GeneInfoServiceImpl.java index 8dc3188d..22208889 100644 --- a/src/main/java/ubc/pavlab/rdp/services/GeneInfoServiceImpl.java +++ b/src/main/java/ubc/pavlab/rdp/services/GeneInfoServiceImpl.java @@ -7,7 +7,6 @@ import org.springframework.core.io.UrlResource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import ubc.pavlab.rdp.model.Gene; import ubc.pavlab.rdp.model.GeneInfo; import ubc.pavlab.rdp.model.Taxon; import ubc.pavlab.rdp.model.enums.GeneMatchType; @@ -50,7 +49,7 @@ public class GeneInfoServiceImpl implements GeneInfoService { @Override public GeneInfo load( Integer id ) { - return geneInfoRepository.findByGeneId( id ); + return geneInfoRepository.findByGeneId( id ).orElse( null ); } @Override @@ -60,7 +59,7 @@ public Collection load( Collection ids ) { @Override public GeneInfo findBySymbolAndTaxon( String symbol, Taxon taxon ) { - return geneInfoRepository.findBySymbolAndTaxon( symbol, taxon ); + return geneInfoRepository.findBySymbolAndTaxon( symbol, taxon ).orElse( null ); } @Override diff --git a/src/main/java/ubc/pavlab/rdp/services/LoggingEmailServiceImpl.java b/src/main/java/ubc/pavlab/rdp/services/LoggingEmailServiceImpl.java index 7819ed1e..206d3ae2 100644 --- a/src/main/java/ubc/pavlab/rdp/services/LoggingEmailServiceImpl.java +++ b/src/main/java/ubc/pavlab/rdp/services/LoggingEmailServiceImpl.java @@ -3,6 +3,7 @@ import lombok.extern.apachecommons.CommonsLog; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Profile; +import org.springframework.lang.Nullable; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.util.UriComponentsBuilder; @@ -32,7 +33,7 @@ public class LoggingEmailServiceImpl implements EmailService { private SiteSettings siteSettings; @Override - public Future sendSupportMessage( String message, String name, User user, String userAgent, MultipartFile attachment, Locale locale ) { + public Future sendSupportMessage( String message, String name, User user, String userAgent, @Nullable MultipartFile attachment, Locale locale ) { log.info( MessageFormat.format( "Support message for {0}:\n{1}", user, message ) ); return CompletableFuture.completedFuture( null ); } diff --git a/src/main/java/ubc/pavlab/rdp/services/OntologyService.java b/src/main/java/ubc/pavlab/rdp/services/OntologyService.java index 9e6558ec..12a1441e 100644 --- a/src/main/java/ubc/pavlab/rdp/services/OntologyService.java +++ b/src/main/java/ubc/pavlab/rdp/services/OntologyService.java @@ -114,12 +114,12 @@ public Ontology findById( Integer id ) { @Nullable public Ontology findByName( String name ) { - return ontologyRepository.findByName( name ); + return ontologyRepository.findByName( name ).orElse( null ); } @Nullable public Ontology findByNameAndActiveTrue( String name ) { - return ontologyRepository.findByNameAndActiveTrue( name ); + return ontologyRepository.findByNameAndActiveTrue( name ).orElse( null ); } @Transactional(readOnly = true) @@ -489,10 +489,7 @@ public List findTermByTermIdsAndOntologyNames( List te } LinkedHashSet results = new LinkedHashSet<>( termIds.size() ); for ( int i = 0; i < ontologyNames.size(); i++ ) { - OntologyTermInfo term = ontologyTermInfoRepository.findByTermIdAndOntologyName( termIds.get( i ), ontologyNames.get( i ) ); - if ( term != null ) { - results.add( term ); - } + ontologyTermInfoRepository.findByTermIdAndOntologyName( termIds.get( i ), ontologyNames.get( i ) ).ifPresent( results::add ); } return new ArrayList<>( results ); } @@ -634,7 +631,7 @@ public void saveTermsNoAuth( Iterable terms ) { @Nullable @Transactional(readOnly = true) public OntologyTermInfo findTermByTermIdAndOntologyName( String termId, String ontologyName ) { - return ontologyTermInfoRepository.findByTermIdAndOntologyName( termId, ontologyName ); + return ontologyTermInfoRepository.findByTermIdAndOntologyName( termId, ontologyName ).orElse( null ); } @Transactional @@ -655,7 +652,7 @@ public Ontology updateNoAuth( Ontology ontology ) { } @Transactional(readOnly = true) - public String findDefinitionByOntologyName( String ontologyName ) { + public Optional findDefinitionByOntologyName( String ontologyName ) { return ontologyTermInfoRepository.findDefinitionByOntologyName( ontologyName ); } @@ -746,7 +743,7 @@ private List> autocompleteTerms( String query, Se .collect( Collectors.joining( " " ) ); // make last term, if available a prefix match - if ( fullTextQuery.length() > 0 ) { + if ( !fullTextQuery.isEmpty() ) { fullTextQuery += "*"; } @@ -1066,7 +1063,7 @@ private Comparator getTopologicalComparator( Set findTermByTermIdAndOntology( String ontologyTermInfoId, Ontology ontology ) { return ontologyTermInfoRepository.findByTermIdAndOntology( ontologyTermInfoId, ontology ); } diff --git a/src/main/java/ubc/pavlab/rdp/services/PrivacyServiceImpl.java b/src/main/java/ubc/pavlab/rdp/services/PrivacyServiceImpl.java index 87cc55e2..bfa4fd9c 100644 --- a/src/main/java/ubc/pavlab/rdp/services/PrivacyServiceImpl.java +++ b/src/main/java/ubc/pavlab/rdp/services/PrivacyServiceImpl.java @@ -2,18 +2,10 @@ import lombok.extern.apachecommons.CommonsLog; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; -import ubc.pavlab.rdp.model.Profile; -import ubc.pavlab.rdp.model.Role; -import ubc.pavlab.rdp.model.User; -import ubc.pavlab.rdp.model.UserContent; import ubc.pavlab.rdp.model.enums.PrivacyLevelType; -import ubc.pavlab.rdp.repositories.RoleRepository; import ubc.pavlab.rdp.settings.ApplicationSettings; -import java.text.MessageFormat; - /** * Logic regarding privacy */ diff --git a/src/main/java/ubc/pavlab/rdp/services/ReactomeService.java b/src/main/java/ubc/pavlab/rdp/services/ReactomeService.java index 7e7b29df..b062688a 100644 --- a/src/main/java/ubc/pavlab/rdp/services/ReactomeService.java +++ b/src/main/java/ubc/pavlab/rdp/services/ReactomeService.java @@ -52,9 +52,6 @@ public ReactomeService( OntologyService ontologyService, ApplicationSettings app this.restTemplate = restTemplate; } - /** - * @return - */ @Nullable public Ontology findPathwaysOntology() { return ontologyService.findByName( applicationSettings.getOntology().getReactomePathwaysOntologyName() ); @@ -199,7 +196,7 @@ public void updatePathwaySummations( @Nullable ProgressCallback progressCallback ProgressUtils.emitProgress( progressCallback, ( i * 20L ) + page.getNumberOfElements(), page.getTotalElements(), timer.getTime( TimeUnit.MILLISECONDS ) ); if ( entity.getStatusCode().is2xxSuccessful() && entity.getBody() != null ) { Map results = Arrays.stream( entity.getBody() ) - .filter( e -> e.getSummation() != null && e.getSummation().size() > 0 ) + .filter( e -> e.getSummation() != null && !e.getSummation().isEmpty() ) .collect( Collectors.toMap( ReactomeEntity::getStId, e -> e.getSummation().get( 0 ).getText() ) ); for ( OntologyTermInfo term : page ) { if ( results.containsKey( term.getTermId() ) ) { @@ -220,6 +217,7 @@ public void updatePathwaySummations( @Nullable ProgressCallback progressCallback @Data public static class ReactomeEntity { private String stId; + @Nullable private List summation; } diff --git a/src/main/java/ubc/pavlab/rdp/services/RemoteResourceServiceImpl.java b/src/main/java/ubc/pavlab/rdp/services/RemoteResourceServiceImpl.java index daf49e53..1accef9f 100644 --- a/src/main/java/ubc/pavlab/rdp/services/RemoteResourceServiceImpl.java +++ b/src/main/java/ubc/pavlab/rdp/services/RemoteResourceServiceImpl.java @@ -27,10 +27,7 @@ import org.springframework.web.util.UriComponentsBuilder; import ubc.pavlab.rdp.exception.RemoteException; import ubc.pavlab.rdp.exception.UnknownRemoteApiException; -import ubc.pavlab.rdp.model.RemoteResource; -import ubc.pavlab.rdp.model.Taxon; -import ubc.pavlab.rdp.model.User; -import ubc.pavlab.rdp.model.UserGene; +import ubc.pavlab.rdp.model.*; import ubc.pavlab.rdp.model.enums.ResearcherCategory; import ubc.pavlab.rdp.model.enums.ResearcherPosition; import ubc.pavlab.rdp.model.enums.TierType; @@ -199,12 +196,13 @@ public static class Server { private URI url; } + @Nullable private Info info; private List servers; } @Override - public List findUsersByLikeName( String nameLike, Boolean prefix, Set researcherPositions, Collection researcherCategories, Collection organUberonIds, Map> ontologyTermInfos ) { + public List findUsersByLikeName( String nameLike, Boolean prefix, @Nullable Set researcherPositions, @Nullable Collection researcherCategories, @Nullable Collection organUberonIds, @Nullable Map> ontologyTermInfos ) { MultiValueMap params = new LinkedMultiValueMap<>(); params.add( "nameLike", nameLike ); params.add( "prefix", prefix.toString() ); @@ -227,7 +225,7 @@ public List findUsersByLikeName( String nameLike, Boolean prefix, Set findUsersByDescription( String descriptionLike, Set researcherPositions, Collection researcherCategories, Collection organUberonIds, Map> ontologyTermInfos ) { + public List findUsersByDescription( String descriptionLike, @Nullable Set researcherPositions, @Nullable Collection researcherCategories, @Nullable Collection organUberonIds, @Nullable Map> ontologyTermInfos ) { MultiValueMap params = new LinkedMultiValueMap<>(); params.add( "descriptionLike", descriptionLike ); params.putAll( UserSearchParams.builder() @@ -533,7 +531,8 @@ private URI prepareApiUri( URI apiUri, boolean authenticate ) { .replaceQueryParam( "noauth" ); if ( authenticate ) { User user = userService.findCurrentUser(); - if ( user != null && user.getRoles().contains( roleRepository.findByRole( "ROLE_ADMIN" ) ) ) { + Role adminRole = roleRepository.findByRole( "ROLE_ADMIN" ).orElseThrow( NullPointerException::new ); + if ( user != null && user.getRoles().contains( adminRole ) ) { UriComponents apiUriComponents = UriComponentsBuilder.fromUri( apiUri ).build(); //noinspection StatementWithEmptyBody if ( apiUriComponents.getQueryParams().containsKey( "noauth" ) ) { @@ -605,9 +604,13 @@ private RequestFilter satisfiesVersion( String minimumVersion ) { @SuperBuilder private static class UserSearchParams { + @Nullable private Collection researcherPositions; + @Nullable private Collection researcherCategories; + @Nullable private Collection organUberonIds; + @Nullable private Map> ontologyTermInfos; public MultiValueMap toMultiValueMap() { @@ -646,6 +649,7 @@ private static class UserGeneSearchParams extends UserSearchParams { private Integer taxonId; private TierType tier; + @Nullable private Integer orthologTaxonId; @Override diff --git a/src/main/java/ubc/pavlab/rdp/services/TaxonService.java b/src/main/java/ubc/pavlab/rdp/services/TaxonService.java index 647b0452..04f87581 100644 --- a/src/main/java/ubc/pavlab/rdp/services/TaxonService.java +++ b/src/main/java/ubc/pavlab/rdp/services/TaxonService.java @@ -14,7 +14,4 @@ public interface TaxonService { Taxon findById( final Integer id ); Collection findByActiveTrue(); - - Collection loadAll(); - } diff --git a/src/main/java/ubc/pavlab/rdp/services/TaxonServiceImpl.java b/src/main/java/ubc/pavlab/rdp/services/TaxonServiceImpl.java index 86397d47..f346bcab 100644 --- a/src/main/java/ubc/pavlab/rdp/services/TaxonServiceImpl.java +++ b/src/main/java/ubc/pavlab/rdp/services/TaxonServiceImpl.java @@ -26,9 +26,4 @@ public Collection findByActiveTrue() { return taxonRepository.findByActiveTrueOrderByOrdering(); } - @Override - public Collection loadAll() { - return taxonRepository.findAll(); - } - } diff --git a/src/main/java/ubc/pavlab/rdp/services/UserDetailsServiceImpl.java b/src/main/java/ubc/pavlab/rdp/services/UserDetailsServiceImpl.java index b933a5c3..268c2bb3 100644 --- a/src/main/java/ubc/pavlab/rdp/services/UserDetailsServiceImpl.java +++ b/src/main/java/ubc/pavlab/rdp/services/UserDetailsServiceImpl.java @@ -5,7 +5,6 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import ubc.pavlab.rdp.model.User; import ubc.pavlab.rdp.model.UserPrinciple; import ubc.pavlab.rdp.repositories.UserRepository; @@ -21,11 +20,9 @@ public class UserDetailsServiceImpl implements UserDetailsService { @Override @Transactional(readOnly = true) public UserPrinciple loadUserByUsername( String email ) { - User user = userRepository.findByEmailIgnoreCase( email ); - if ( user == null ) { - throw new UsernameNotFoundException( email ); - } - return new UserPrinciple( user ); + return userRepository.findByEmailIgnoreCase( email ) + .map( UserPrinciple::new ) + .orElseThrow( () -> new UsernameNotFoundException( email ) ); } } diff --git a/src/main/java/ubc/pavlab/rdp/services/UserGeneService.java b/src/main/java/ubc/pavlab/rdp/services/UserGeneService.java index 65fcea46..c52f48e4 100644 --- a/src/main/java/ubc/pavlab/rdp/services/UserGeneService.java +++ b/src/main/java/ubc/pavlab/rdp/services/UserGeneService.java @@ -67,12 +67,14 @@ public interface UserGeneService { * * @param tiers only retain results in the given {@link TierType}, or any if null * @param orthologTaxon only retain results in the given ortholog {@link Taxon}, or any if null - * @param researcherPositions only retain results where the corresponding {@link User} holds any given {@link ResearcherPosition}, - * or any if null - * @param researcherTypes only retain results where the corresponding {@link User} has any of the given {@link ResearcherCategory} - * or any if null - * @param organs only retain results where the corresponding {@link User} tracks any of the given {@link OrganInfo} - * @param ontologyTermInfos + * @param researcherPositions only retain results where the corresponding {@link User} holds any given + * {@link ResearcherPosition}, or any if null + * @param researcherTypes only retain results where the corresponding {@link User} has any of the given + * {@link ResearcherCategory}, or any if null + * @param organs only retain results where the corresponding {@link User} tracks any of the given + * {@link OrganInfo}, or any if null + * @param ontologyTermInfos only retain results where the corresponding {@link User} tracks any of the given + * {@link OntologyTermInfo}, or any if null */ List handleGeneSearch( Gene gene, @Nullable Set tiers, @Nullable Taxon orthologTaxon, @Nullable Set researcherPositions, @Nullable Collection researcherTypes, @Nullable Collection organs, @Nullable Map> ontologyTermInfos ); diff --git a/src/main/java/ubc/pavlab/rdp/services/UserGeneServiceImpl.java b/src/main/java/ubc/pavlab/rdp/services/UserGeneServiceImpl.java index ae9e4229..89fbcc23 100644 --- a/src/main/java/ubc/pavlab/rdp/services/UserGeneServiceImpl.java +++ b/src/main/java/ubc/pavlab/rdp/services/UserGeneServiceImpl.java @@ -24,6 +24,7 @@ import org.springframework.cache.annotation.Cacheable; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.lang.Nullable; import org.springframework.security.access.PermissionEvaluator; import org.springframework.security.access.prepost.PostFilter; import org.springframework.security.core.Authentication; @@ -144,7 +145,7 @@ public long countUniqueAssociationsToHumanAllTiers() { @Override @PostFilter("hasPermission(filterObject, 'read')") - public List handleGeneSearch( Gene gene, Set tiers, Taxon orthologTaxon, Set researcherPositions, Collection researcherCategories, Collection organs, Map> ontologyTermInfos ) { + public List handleGeneSearch( Gene gene, @Nullable Set tiers, @Nullable Taxon orthologTaxon, @Nullable Set researcherPositions, @Nullable Collection researcherCategories, @Nullable Collection organs, @Nullable Map> ontologyTermInfos ) { Stream results = handleGeneSearchInternal( gene, tiers, orthologTaxon, researcherPositions, researcherCategories, organs, ontologyTermInfos ).stream(); if ( applicationSettings.getPrivacy().isEnableAnonymizedSearchResults() ) { Authentication auth = SecurityContextHolder.getContext().getAuthentication(); @@ -160,7 +161,7 @@ public List handleGeneSearch( Gene gene, Set tiers, Taxon or .collect( Collectors.toList() ); // we need to preserve the search order } - private Set handleGeneSearchInternal( Gene gene, Set tiers, Taxon orthologTaxon, Set researcherPositions, Collection researcherCategories, Collection organs, Map> ontologyTermInfos ) { + private Set handleGeneSearchInternal( Gene gene, @Nullable Set tiers, @Nullable Taxon orthologTaxon, @Nullable Set researcherPositions, @Nullable Collection researcherCategories, @Nullable Collection organs, @Nullable Map> ontologyTermInfos ) { Set uGenes = new LinkedHashSet<>(); // do this once to save time in the inner loop @@ -183,7 +184,7 @@ private Set handleGeneSearchInternal( Gene gene, Set tiers, // ortholog relationship is not reflexive (i.e. a gene is not its own ortholog), but we still want to display // that gene first when ortholog search is performed in the same MO if ( orthologTaxon == null || gene.getTaxon().equals( orthologTaxon ) ) { - uGenes.addAll( userGeneRepository.findByGeneIdAndTierIn( gene.getGeneId(), tiers ).stream() + uGenes.addAll( tiers == null ? userGeneRepository.findByGeneId( gene.getGeneId() ) : userGeneRepository.findByGeneIdAndTierIn( gene.getGeneId(), tiers ).stream() .filter( ug -> researcherPositions == null || researcherPositions.contains( ug.getUser().getProfile().getResearcherPosition() ) ) .filter( ug -> nullOrContainsAtLeastOne( researcherCategories, () -> ug.getUser().getProfile().getResearcherCategories() ) ) .filter( ortholog -> nullOrContainsAtLeastOne( organUberonIds, () -> ortholog.getUser().getUserOrgans().values().stream().map( UserOrgan::getUberonId ).collect( Collectors.toSet() ) ) ) @@ -196,9 +197,9 @@ private Set handleGeneSearchInternal( Gene gene, Set tiers, return uGenes; } - private Set handleOrthologSearchInternal( Gene gene, Set tiers, Taxon orthologTaxon, Set researcherPositions, Collection researcherCategories, Collection organUberonIds, Map> ontologyTermInfoIds ) { + private Set handleOrthologSearchInternal( Gene gene, @Nullable Set tiers, @Nullable Taxon orthologTaxon, @Nullable Set researcherPositions, @Nullable Collection researcherCategories, @Nullable Collection organUberonIds, @Nullable Map> ontologyTermInfoIds ) { return ( orthologTaxon == null ? userGeneRepository.findOrthologsByGeneId( gene.getGeneId() ) : userGeneRepository.findOrthologsByGeneIdAndTaxon( gene.getGeneId(), orthologTaxon ) ).stream() - .filter( ortholog -> tiers.contains( ortholog.getTier() ) ) + .filter( ortholog -> tiers == null || tiers.contains( ortholog.getTier() ) ) .filter( ug -> researcherPositions == null || researcherPositions.contains( ug.getUser().getProfile().getResearcherPosition() ) ) .filter( ug -> nullOrContainsAtLeastOne( researcherCategories, () -> ug.getUser().getProfile().getResearcherCategories() ) ) .filter( ortholog -> nullOrContainsAtLeastOne( organUberonIds, () -> ortholog.getUser().getUserOrgans().values().stream().map( UserOrgan::getUberonId ).collect( Collectors.toSet() ) ) ) diff --git a/src/main/java/ubc/pavlab/rdp/services/UserOrganServiceImpl.java b/src/main/java/ubc/pavlab/rdp/services/UserOrganServiceImpl.java index a574dea7..80ed8cec 100644 --- a/src/main/java/ubc/pavlab/rdp/services/UserOrganServiceImpl.java +++ b/src/main/java/ubc/pavlab/rdp/services/UserOrganServiceImpl.java @@ -4,7 +4,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import ubc.pavlab.rdp.model.OrganInfo; import ubc.pavlab.rdp.model.UserOrgan; import ubc.pavlab.rdp.repositories.OrganInfoRepository; import ubc.pavlab.rdp.repositories.UserOrganRepository; @@ -24,11 +23,10 @@ public class UserOrganServiceImpl implements UserOrganService { public void updateUserOrgans() { log.info( "Updating user organs..." ); for ( UserOrgan userOrgan : userOrganRepository.findAll() ) { - OrganInfo organInfo = organInfoRepository.findByUberonId( userOrgan.getUberonId() ); - if ( organInfo != null ) { + organInfoRepository.findByUberonId( userOrgan.getUberonId() ).ifPresent( organInfo -> { userOrgan.updateOrgan( organInfo ); userOrganRepository.save( userOrgan ); - } + } ); } log.info( "Done updating user organs." ); } diff --git a/src/main/java/ubc/pavlab/rdp/services/UserPrivacyService.java b/src/main/java/ubc/pavlab/rdp/services/UserPrivacyService.java index ee0ff87c..a0a21845 100644 --- a/src/main/java/ubc/pavlab/rdp/services/UserPrivacyService.java +++ b/src/main/java/ubc/pavlab/rdp/services/UserPrivacyService.java @@ -2,7 +2,6 @@ import lombok.extern.apachecommons.CommonsLog; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cache.annotation.Cacheable; import org.springframework.lang.Nullable; import org.springframework.stereotype.Service; import ubc.pavlab.rdp.model.Profile; @@ -15,8 +14,6 @@ import java.text.MessageFormat; -import static java.util.Objects.requireNonNull; - @Service @CommonsLog public class UserPrivacyService { @@ -56,7 +53,7 @@ public boolean checkUserCanUpdate( @Nullable User user, UserContent userContent private boolean checkUserCanSeeOtherUserContentWithPrivacyLevel( @Nullable User currentUser, @Nullable User otherUser, PrivacyLevelType privacyLevel ) { // Never show the remote admin profile (or accidental null users) - if ( otherUser == null || ( applicationSettings.getIsearch() != null && isRemoteSearchUser( otherUser ) ) ) { + if ( otherUser == null || isRemoteSearchUser( otherUser ) ) { return false; } @@ -67,7 +64,7 @@ private boolean checkUserCanSeeOtherUserContentWithPrivacyLevel( @Nullable User Profile profile = otherUser.getProfile(); - if ( profile == null || profile.getPrivacyLevel() == null ) { + if ( profile.getPrivacyLevel() == null ) { log.error( MessageFormat.format( "User without a profile, privacy levels or sharing set: {0}", otherUser ) ); return false; } @@ -75,7 +72,7 @@ private boolean checkUserCanSeeOtherUserContentWithPrivacyLevel( @Nullable User // Either the user is looking at himself, or the user is public, or shared with registered users - check for any logged-in user, or private - check for admin; If logged-in user is admin, we have to // check whether this user is the designated actor for the authenticated remote search, in which case we have to check for remote search privileges on the user. - return otherUser.equals( currentUser ) // User is looking at himself + return ( currentUser != null && currentUser.equals( otherUser ) ) // User is looking at himself || ( privacyLevel == PrivacyLevelType.PUBLIC ) // Data is public || ( privacyLevel == PrivacyLevelType.SHARED && currentUser != null && !isRemoteSearchUser( currentUser ) )// data is accessible for registerd users and there is a user logged in who is not the remote admin || ( privacyLevel == PrivacyLevelType.PRIVATE && currentUser != null && isAdminOrServiceAccount( currentUser ) && !isRemoteSearchUser( currentUser ) ) // data is private and there is an admin (or service account) logged in who is not the remote search user @@ -97,14 +94,12 @@ public boolean checkCurrentUserCanSeeGeneList( User otherUser ) { || ( currentUser != null && currentUser.getRoles().contains( getAdminRole() ) ) ); } - @Cacheable(value = "ubc.pavlab.rdp.model.Role.byRole", key = "'ROLE_ADMIN'") - public Role getAdminRole() { - return requireNonNull( roleRepository.findByRole( "ROLE_ADMIN" ) ); + private Role getAdminRole() { + return roleRepository.findByRole( "ROLE_ADMIN" ).orElseThrow( NullPointerException::new ); } - @Cacheable(value = "ubc.pavlab.rdp.model.Role.byRole", key = "'ROLE_SERVICE_ACCOUNT'") - public Role getServiceAccountRole() { - return requireNonNull( roleRepository.findByRole( "ROLE_SERVICE_ACCOUNT" ) ); + private Role getServiceAccountRole() { + return roleRepository.findByRole( "ROLE_SERVICE_ACCOUNT" ).orElseThrow( NullPointerException::new ); } private boolean isRemoteSearchUser( User user ) { diff --git a/src/main/java/ubc/pavlab/rdp/services/UserService.java b/src/main/java/ubc/pavlab/rdp/services/UserService.java index 79eca75d..d7877137 100644 --- a/src/main/java/ubc/pavlab/rdp/services/UserService.java +++ b/src/main/java/ubc/pavlab/rdp/services/UserService.java @@ -69,6 +69,7 @@ public interface UserService { @Nullable User findUserByEmailNoAuth( String email ); + @Nullable User findUserByAccessTokenNoAuth( String accessToken ) throws TokenException; /** @@ -83,7 +84,7 @@ public interface UserService { * Note: when using this, ensure that the user is enabled as per {@link User#isEnabled()}, otherwise a * {@link org.springframework.security.access.AccessDeniedException} will be raised. That is because a non-enabled * user will not satisfy the 'read' permission for any user as defined in {@link ubc.pavlab.rdp.security.PermissionEvaluatorImpl} - * and {@link PrivacyService#checkUserCanSee(User, UserContent)}. + * and {@link UserPrivacyService#checkUserCanSee(User, UserContent)}. * * @throws org.springframework.security.access.AccessDeniedException if the user is not enabled */ @@ -219,15 +220,12 @@ User updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( User user, * inference from {@link OntologyService#inferTermIds(Collection)}. * * @param ontologyTermInfoIdsByOntology the term IDs grouped by ontology - * @return true if all the ontologies possess at least one match - or zero if empty, false otherwise + * @return a predicate that indicates if all the ontologies possess at least one match - or zero if empty, false otherwise */ - Predicate hasOntologyTermIn( Map> ontologyTermInfoIdsByOntology ); + Predicate hasOntologyTermIn( @Nullable Map> ontologyTermInfoIdsByOntology ); /** * Indicate if there are users with terms in the given ontology. - * - * @param ontology - * @return */ boolean existsByOntology( Ontology ontology ); } diff --git a/src/main/java/ubc/pavlab/rdp/services/UserServiceImpl.java b/src/main/java/ubc/pavlab/rdp/services/UserServiceImpl.java index dd6ece3e..71d9ea08 100644 --- a/src/main/java/ubc/pavlab/rdp/services/UserServiceImpl.java +++ b/src/main/java/ubc/pavlab/rdp/services/UserServiceImpl.java @@ -128,7 +128,7 @@ public void afterPropertiesSet() { @Override public User create( User user ) { user.setPassword( bCryptPasswordEncoder.encode( user.getPassword() ) ); - Role userRole = roleRepository.findByRole( "ROLE_USER" ); + Role userRole = roleRepository.findByRole( "ROLE_USER" ).orElseThrow( NullPointerException::new ); user.getRoles().add( userRole ); return userRepository.save( user ); } @@ -138,7 +138,7 @@ public User create( User user ) { @Override public User createAdmin( User admin ) { admin.setPassword( bCryptPasswordEncoder.encode( admin.getPassword() ) ); - Role adminRole = roleRepository.findByRole( "ROLE_ADMIN" ); + Role adminRole = roleRepository.findByRole( "ROLE_ADMIN" ).orElseThrow( NullPointerException::new ); admin.getRoles().add( adminRole ); return userRepository.save( admin ); } @@ -148,7 +148,7 @@ public User createAdmin( User admin ) { @Transactional public User createServiceAccount( User user ) { user.setPassword( bCryptPasswordEncoder.encode( createSecureRandomToken() ) ); - Role serviceAccountRole = roleRepository.findByRole( "ROLE_SERVICE_ACCOUNT" ); + Role serviceAccountRole = roleRepository.findByRole( "ROLE_SERVICE_ACCOUNT" ).orElseThrow( NullPointerException::new ); user.getRoles().add( serviceAccountRole ); user = userRepository.save( user ); createAccessTokenForUser( user ); @@ -165,7 +165,7 @@ public List findAllRoles() { @Secured("ROLE_ADMIN") @Transactional(rollbackFor = RoleException.class) public void updateRoles( User user, Set roles ) throws RoleException { - Role adminRole = roleRepository.findByRole( "ROLE_ADMIN" ); + Role adminRole = roleRepository.findByRole( "ROLE_ADMIN" ).orElseThrow( NullPointerException::new ); if ( isCurrentUser( user ) && !roles.containsAll( user.getRoles() ) ) { throw new CannotRevokeOwnRolesException( "You cannot revoke your own roles." ); } else if ( user.getRoles().contains( adminRole ) && !roles.containsAll( user.getRoles() ) ) { @@ -178,18 +178,13 @@ public void updateRoles( User user, Set roles ) throws RoleException { @Override @PreAuthorize("hasPermission(#user, 'update')") public User update( User user ) { - if ( applicationSettings.getPrivacy() == null ) { - // FIXME: this should not be possible... - log.warn( MessageFormat.format( "{0} attempted to update, but applicationSettings.privacy is null.", user.getEmail() ) ); - } else { - PrivacyLevelType defaultPrivacyLevel = PrivacyLevelType.values()[applicationSettings.getPrivacy().getDefaultLevel()]; - boolean defaultSharing = applicationSettings.getPrivacy().isDefaultSharing(); - boolean defaultGenelist = applicationSettings.getPrivacy().isAllowHideGenelist(); + PrivacyLevelType defaultPrivacyLevel = PrivacyLevelType.values()[applicationSettings.getPrivacy().getDefaultLevel()]; + boolean defaultSharing = applicationSettings.getPrivacy().isDefaultSharing(); + boolean defaultGenelist = applicationSettings.getPrivacy().isAllowHideGenelist(); - if ( user.getProfile().getPrivacyLevel() == null ) { - log.warn( "Received a null 'privacyLevel' value in profile." ); - user.getProfile().setPrivacyLevel( defaultPrivacyLevel ); - } + if ( user.getProfile().getPrivacyLevel() == null ) { + log.warn( "Received a null 'privacyLevel' value in profile." ); + user.getProfile().setPrivacyLevel( defaultPrivacyLevel ); } PrivacyLevelType userPrivacyLevel = user.getProfile().getPrivacyLevel(); @@ -220,14 +215,12 @@ public void delete( User user ) { @Transactional @Override - public User changePassword( String oldPassword, String newPassword ) - throws BadCredentialsException, ValidationException { + public User changePassword( String oldPassword, String newPassword ) throws BadCredentialsException, ValidationException { User user = requireNonNull( findCurrentUser() ); if ( bCryptPasswordEncoder.matches( oldPassword, user.getPassword() ) ) { if ( newPassword.length() >= 6 ) { //TODO: Tie in with hibernate constraint on User or not necessary? - user.setPassword( bCryptPasswordEncoder.encode( newPassword ) ); - return update( user ); + return userRepository.save( user ); } else { throw new ValidationException( "Password must be a minimum of 6 characters" ); } @@ -317,12 +310,12 @@ public User findUserByIdNoAuth( int id ) { @Override public User findUserByEmailNoAuth( String email ) { - return userRepository.findByEmailIgnoreCase( email ); + return userRepository.findByEmailIgnoreCase( email ).orElse( null ); } @Override public User findUserByAccessTokenNoAuth( String accessToken ) throws TokenException { - AccessToken token = accessTokenRepository.findByToken( accessToken ); + AccessToken token = accessTokenRepository.findByToken( accessToken ).orElse( null ); if ( token == null ) { return null; } @@ -420,7 +413,7 @@ public Page findByEnabledTrueAndPrivacyLevelNoAuth( PrivacyLevelType priva @Override @PostFilter("hasPermission(filterObject, 'read')") - public List findByLikeName( String nameLike, Set researcherPositions, Set researcherTypes, Collection organs, Map> ontologyTermInfos ) { + public List findByLikeName( String nameLike, @Nullable Set researcherPositions, @Nullable Set researcherTypes, @Nullable Collection organs, @Nullable Map> ontologyTermInfos ) { final Set organUberonIds = organUberonIdsFromOrgans( organs ); Map> ontologyTermInfoIds = ontologyTermInfoIdsFromOntologyTermInfo( ontologyTermInfos ); return userRepository.findByProfileNameContainingIgnoreCaseOrProfileLastNameContainingIgnoreCase( nameLike, nameLike ).stream() @@ -434,7 +427,7 @@ public List findByLikeName( String nameLike, Set resea @Override @PostFilter("hasPermission(filterObject, 'read')") - public List findByStartsName( String startsName, Set researcherPositions, Set researcherTypes, Collection organs, Map> ontologyTermInfos ) { + public List findByStartsName( String startsName, @Nullable Set researcherPositions, @Nullable Set researcherTypes, @Nullable Collection organs, @Nullable Map> ontologyTermInfos ) { final Set organUberonIds = organUberonIdsFromOrgans( organs ); Map> ontologyTermInfoIds = ontologyTermInfoIdsFromOntologyTermInfo( ontologyTermInfos ); return userRepository.findByProfileLastNameStartsWithIgnoreCase( startsName ).stream() @@ -448,7 +441,7 @@ public List findByStartsName( String startsName, Set r @Override @PostFilter("hasPermission(filterObject, 'read')") - public List findByDescription( String descriptionLike, Set researcherPositions, Collection researcherTypes, Collection organs, Map> ontologyTermInfos ) { + public List findByDescription( String descriptionLike, @Nullable Set researcherPositions, @Nullable Collection researcherTypes, @Nullable Collection organs, @Nullable Map> ontologyTermInfos ) { final Set organUberonIds = organUberonIdsFromOrgans( organs ); Map> ontologyTermInfoIds = ontologyTermInfoIdsFromOntologyTermInfo( ontologyTermInfos ); return userRepository.findDistinctByProfileDescriptionLikeIgnoreCaseOrTaxonDescriptionsLikeIgnoreCaseOrUserOntologyTermsNameLikeIgnoreCase( "%" + descriptionLike + "%" ).stream() @@ -462,7 +455,7 @@ public List findByDescription( String descriptionLike, Set findByNameAndDescription( String nameLike, boolean prefix, String descriptionLike, Set researcherPositions, Set researcherCategories, Collection organs, Map> ontologyTermInfos ) { + public List findByNameAndDescription( String nameLike, boolean prefix, String descriptionLike, @Nullable Set researcherPositions, @Nullable Set researcherCategories, @Nullable Collection organs, @Nullable Map> ontologyTermInfos ) { final Set organUberonIds = organUberonIdsFromOrgans( organs ); String namePattern = prefix ? nameLike + "%" : "%" + nameLike + "%"; String descriptionPattern = "%" + descriptionLike + "%"; @@ -482,7 +475,8 @@ public List findByNameAndDescription( String nameLike, boolean prefix, Str .collect( Collectors.toList() ); } - private Set organUberonIdsFromOrgans( Collection organs ) { + @Nullable + private Set organUberonIdsFromOrgans( @Nullable Collection organs ) { if ( organs != null ) { return organs.stream().map( Organ::getUberonId ).collect( Collectors.toSet() ); } else { @@ -490,7 +484,8 @@ private Set organUberonIdsFromOrgans( Collection organs ) { } } - private Map> ontologyTermInfoIdsFromOntologyTermInfo( Map> ontologyTermInfos ) { + @Nullable + private Map> ontologyTermInfoIdsFromOntologyTermInfo( @Nullable Map> ontologyTermInfos ) { if ( ontologyTermInfos != null ) { return ontologyTermInfos.entrySet().stream() .collect( Collectors.toMap( Map.Entry::getKey, e -> ontologyService.inferTermIds( e.getValue() ) ) ); @@ -500,7 +495,7 @@ private Map> ontologyTermInfoIdsFromOntologyTermInfo( Map } @Override - public Predicate hasOntologyTermIn( Map> ontologyTermInfoIdsByOntology ) { + public Predicate hasOntologyTermIn( @Nullable Map> ontologyTermInfoIdsByOntology ) { return u -> ontologyTermInfoIdsByOntology == null || ontologyTermInfoIdsByOntology.values().stream() .allMatch( entry -> containsAtLeastOne( entry, () -> getUserTermInfoIds( u ) ) ); } @@ -767,14 +762,12 @@ public User updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( User user user.getProfile().setResearcherPosition( profile.getResearcherPosition() ); user.getProfile().setOrganization( profile.getOrganization() ); - if ( profile.getResearcherCategories() != null ) { - if ( applicationSettings.getProfile().getEnabledResearcherCategories().containsAll( profile.getResearcherCategories() ) ) { - user.getProfile().getResearcherCategories().retainAll( profile.getResearcherCategories() ); - user.getProfile().getResearcherCategories().addAll( profile.getResearcherCategories() ); - } else { - log.warn( MessageFormat.format( "User {0} attempted to set user {1} researcher type to an unknown value {2}.", - findCurrentUser(), user, profile.getResearcherCategories() ) ); - } + if ( applicationSettings.getProfile().getEnabledResearcherCategories().containsAll( profile.getResearcherCategories() ) ) { + user.getProfile().getResearcherCategories().retainAll( profile.getResearcherCategories() ); + user.getProfile().getResearcherCategories().addAll( profile.getResearcherCategories() ); + } else { + log.warn( MessageFormat.format( "User {0} attempted to set user {1} researcher type to an unknown value {2}.", + findCurrentUser(), user, profile.getResearcherCategories() ) ); } if ( user.getProfile().getContactEmail() == null || @@ -802,7 +795,7 @@ public User updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( User user // privacy settings if ( applicationSettings.getPrivacy().isCustomizableLevel() ) { - if ( privacyService.isPrivacyLevelEnabled( profile.getPrivacyLevel() ) ) { + if ( profile.getPrivacyLevel() == null || privacyService.isPrivacyLevelEnabled( profile.getPrivacyLevel() ) ) { // reset gene privacy levels if the profile value is changed if ( applicationSettings.getPrivacy().isCustomizableGeneLevel() && user.getProfile().getPrivacyLevel() != profile.getPrivacyLevel() ) { @@ -864,7 +857,7 @@ public PasswordResetToken createPasswordResetTokenForUser( User user, Locale loc @Override public PasswordResetToken verifyPasswordResetToken( int userId, String token, HttpServletRequest request ) throws TokenException { - PasswordResetToken passToken = passwordResetTokenRepository.findByToken( token ); + PasswordResetToken passToken = passwordResetTokenRepository.findByToken( token ).orElse( null ); if ( passToken == null ) { throw new TokenException( "Password reset token is invalid." ); @@ -914,6 +907,7 @@ public VerificationToken createVerificationTokenForUser( User user, Locale local @Transactional @Override public VerificationToken createContactEmailVerificationTokenForUser( User user, Locale locale ) { + Assert.notNull( user.getProfile().getContactEmail(), "User does not have a contact email." ); VerificationToken userToken = new VerificationToken(); userToken.setUser( user ); userToken.setEmail( user.getProfile().getContactEmail() ); @@ -926,7 +920,7 @@ public VerificationToken createContactEmailVerificationTokenForUser( User user, @Override @Transactional(rollbackFor = { TokenException.class }) public User confirmVerificationToken( String token, HttpServletRequest request ) throws TokenException { - VerificationToken verificationToken = tokenRepository.findByToken( token ); + VerificationToken verificationToken = tokenRepository.findByToken( token ).orElse( null ); if ( verificationToken == null ) { throw new TokenNotFoundException( "Verification token is invalid." ); diff --git a/src/main/java/ubc/pavlab/rdp/settings/ApplicationSettings.java b/src/main/java/ubc/pavlab/rdp/settings/ApplicationSettings.java index b2254bcf..0a5fa36f 100644 --- a/src/main/java/ubc/pavlab/rdp/settings/ApplicationSettings.java +++ b/src/main/java/ubc/pavlab/rdp/settings/ApplicationSettings.java @@ -5,6 +5,7 @@ import org.springframework.boot.convert.DurationUnit; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; import org.springframework.validation.annotation.Validated; import ubc.pavlab.rdp.model.GeneInfo; import ubc.pavlab.rdp.model.enums.PrivacyLevelType; @@ -55,22 +56,24 @@ public static class CacheSettings { /** * Location of GO terms. */ + @Nullable private String termFile; /** * Location of gene2go annotations. - *

- * FIXME: use a {@link Resource}, but resolving is not supported at the config-level (see #192) */ + @Nullable private Resource annotationFile; /** * Location of gene orthologs. */ + @Nullable private Resource orthologFile; /** * Location of organ system terms. *

* FIXME: use a {@link Resource}, but resolving is not supported at the config-level (see #192) */ + @Nullable private String organFile; } @@ -197,6 +200,7 @@ public static class InternationalSearchSettings { *

* If set, the user must exist at startup and there must be at least one {@link #authTokens} specified. */ + @Nullable private Integer userId; /** * List of partner APIs endpoints. @@ -210,6 +214,7 @@ public static class InternationalSearchSettings { /** * Token used to query other partner registries. */ + @Nullable private String searchToken; /** * Request timeout when querying partner registries, or null to disable. @@ -221,16 +226,19 @@ public static class InternationalSearchSettings { * defining the timeout. */ @Deprecated + @Nullable @DurationUnit(value = ChronoUnit.SECONDS) private Duration requestTimeout; /** * Connection timeout in milliseconds, or null to disable. */ + @Nullable @DurationUnit(value = ChronoUnit.MILLIS) private Duration connectTimeout; /** * Read timeout in milliseconds, or null to disable. */ + @Nullable @DurationUnit(value = ChronoUnit.MILLIS) private Duration readTimeout; } @@ -261,6 +269,7 @@ public static class OntologySettings { private OrganSettings organs; private OntologySettings ontology; + @Nullable private Resource faqFile; private boolean sendEmailOnRegistration; /** diff --git a/src/main/java/ubc/pavlab/rdp/settings/SiteSettings.java b/src/main/java/ubc/pavlab/rdp/settings/SiteSettings.java index 403fafcc..8e7e9121 100644 --- a/src/main/java/ubc/pavlab/rdp/settings/SiteSettings.java +++ b/src/main/java/ubc/pavlab/rdp/settings/SiteSettings.java @@ -3,8 +3,8 @@ import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; +import org.springframework.lang.Nullable; import org.springframework.validation.annotation.Validated; -import org.springframework.web.util.UriComponentsBuilder; import javax.validation.constraints.Email; import javax.validation.constraints.NotEmpty; @@ -34,6 +34,7 @@ public URI getHostUrl() { * If configured, CORS policies will be setup so that scripts running on the main site can freely access the * '/stats' and '/api/**' endpoints. */ + @Nullable private URI mainsite; @Pattern(regexp = "#[a-fA-F\\d]{6}", message = "The theme color must be a valid hex color (i.e. '#FFFFFF').") diff --git a/src/main/java/ubc/pavlab/rdp/util/CacheUtils.java b/src/main/java/ubc/pavlab/rdp/util/CacheUtils.java index 266eb362..81caa9fc 100644 --- a/src/main/java/ubc/pavlab/rdp/util/CacheUtils.java +++ b/src/main/java/ubc/pavlab/rdp/util/CacheUtils.java @@ -5,7 +5,6 @@ import org.springframework.cache.CacheManager; import java.util.Collection; -import java.util.Map; /** * Utilities for working with {@link CacheManager} and {@link Cache}. diff --git a/src/main/java/ubc/pavlab/rdp/util/CollectionUtils.java b/src/main/java/ubc/pavlab/rdp/util/CollectionUtils.java index 405367cb..30c34dc1 100644 --- a/src/main/java/ubc/pavlab/rdp/util/CollectionUtils.java +++ b/src/main/java/ubc/pavlab/rdp/util/CollectionUtils.java @@ -1,6 +1,6 @@ package ubc.pavlab.rdp.util; -import org.springframework.lang.NonNull; +import org.springframework.lang.Nullable; import java.util.Collection; import java.util.HashMap; @@ -88,11 +88,11 @@ public static Predicate by( Function s * will return false regardless of the supplied candidates * @see org.springframework.util.CollectionUtils#containsAny(Collection, Collection) */ - public static boolean nullOrContainsAtLeastOne( Collection source, Supplier> candidates ) { + public static boolean nullOrContainsAtLeastOne( @Nullable Collection source, Supplier> candidates ) { return source == null || containsAtLeastOne( source, candidates ); } - public static boolean containsAtLeastOne( @NonNull Collection source, Supplier> candidates ) { + public static boolean containsAtLeastOne( Collection source, Supplier> candidates ) { return ( !source.isEmpty() && containsAny( source, candidates.get() ) ); } } diff --git a/src/main/java/ubc/pavlab/rdp/util/GeneInfoParser.java b/src/main/java/ubc/pavlab/rdp/util/GeneInfoParser.java index d596594d..514ffc5c 100644 --- a/src/main/java/ubc/pavlab/rdp/util/GeneInfoParser.java +++ b/src/main/java/ubc/pavlab/rdp/util/GeneInfoParser.java @@ -4,6 +4,7 @@ import lombok.Data; import lombok.extern.apachecommons.CommonsLog; import org.apache.commons.lang3.ArrayUtils; +import org.springframework.lang.Nullable; import org.springframework.stereotype.Component; import java.io.*; @@ -67,6 +68,7 @@ public static class Record { private String symbol; private String synonyms; private String description; + @Nullable private LocalDate modificationDate; public static Record parseLine( String line, String[] header, int lineNumber ) throws UncheckedParseException { diff --git a/src/main/java/ubc/pavlab/rdp/util/GeneOrthologsParser.java b/src/main/java/ubc/pavlab/rdp/util/GeneOrthologsParser.java index 84876f0b..32d419d6 100644 --- a/src/main/java/ubc/pavlab/rdp/util/GeneOrthologsParser.java +++ b/src/main/java/ubc/pavlab/rdp/util/GeneOrthologsParser.java @@ -8,7 +8,6 @@ import java.io.*; import java.util.List; -import java.util.Objects; import java.util.stream.Collectors; /** @@ -64,7 +63,6 @@ public List parse( InputStream is ) throws ParseException, IOException { } return br.lines() .map( line -> Record.parseLine( line, header, br.getLineNumber() ) ) - .filter( Objects::nonNull ) .collect( Collectors.toList() ); } catch ( UncheckedIOException ioe ) { throw ioe.getCause(); diff --git a/src/main/java/ubc/pavlab/rdp/util/OBOParser.java b/src/main/java/ubc/pavlab/rdp/util/OBOParser.java index 4e8c7c5d..e48615ef 100644 --- a/src/main/java/ubc/pavlab/rdp/util/OBOParser.java +++ b/src/main/java/ubc/pavlab/rdp/util/OBOParser.java @@ -2,6 +2,7 @@ import lombok.*; import lombok.extern.apachecommons.CommonsLog; +import org.springframework.lang.Nullable; import org.springframework.stereotype.Component; import java.io.IOException; @@ -30,6 +31,7 @@ public static class Ontology { private String formatVersion; private String dataVersion; private String defaultNamespace; + @Nullable private String name; } @@ -77,6 +79,7 @@ public static class Relationship { private String name; private String definition; private List synonyms = new ArrayList<>(); + @Nullable private Boolean obsolete; /* we map both directions of a relationship */ diff --git a/src/main/java/ubc/pavlab/rdp/util/OntologyMessageSource.java b/src/main/java/ubc/pavlab/rdp/util/OntologyMessageSource.java index 2c01e0b9..5119542a 100644 --- a/src/main/java/ubc/pavlab/rdp/util/OntologyMessageSource.java +++ b/src/main/java/ubc/pavlab/rdp/util/OntologyMessageSource.java @@ -1,16 +1,10 @@ package ubc.pavlab.rdp.util; -import lombok.SneakyThrows; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.support.AbstractMessageSource; import org.springframework.stereotype.Component; -import org.springframework.web.util.UriComponentsBuilder; -import ubc.pavlab.rdp.model.ontology.OntologyTermInfo; -import ubc.pavlab.rdp.repositories.ontology.OntologyTermInfoRepository; import ubc.pavlab.rdp.services.OntologyService; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; import java.text.MessageFormat; import java.util.Locale; import java.util.regex.Matcher; @@ -50,7 +44,7 @@ protected String resolveCodeWithoutArguments( String code, Locale locale ) { return ontologyService.findDefinitionByTermNameAndOntologyName( termName, ontologyName ).orElse( null ); } else if ( ( matcher = ONTOLOGY_DEFINITION.matcher( code ) ).matches() ) { String ontologyName = matcher.group( 1 ); - return ontologyService.findDefinitionByOntologyName( ontologyName ); + return ontologyService.findDefinitionByOntologyName( ontologyName ).orElse( null ); } else { return super.resolveCodeWithoutArguments( code, locale ); } diff --git a/src/main/java/ubc/pavlab/rdp/util/ParseException.java b/src/main/java/ubc/pavlab/rdp/util/ParseException.java index 80ac309a..7e6c02fc 100644 --- a/src/main/java/ubc/pavlab/rdp/util/ParseException.java +++ b/src/main/java/ubc/pavlab/rdp/util/ParseException.java @@ -7,10 +7,10 @@ /** * Exception raised when a parsing error occurs for biological data. */ +@Getter public class ParseException extends Exception { - @Getter - private int lineNumber; + private final int lineNumber; public ParseException( String message, int lineNumber ) { super( MessageFormat.format( "{0}: {1}", lineNumber, message ) ); diff --git a/src/main/java/ubc/pavlab/rdp/util/PurlResolver.java b/src/main/java/ubc/pavlab/rdp/util/PurlResolver.java index 4251b5e6..90c289a3 100644 --- a/src/main/java/ubc/pavlab/rdp/util/PurlResolver.java +++ b/src/main/java/ubc/pavlab/rdp/util/PurlResolver.java @@ -5,13 +5,6 @@ import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.UrlResource; -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.context.ResourceLoaderAware; -import org.springframework.context.support.GenericApplicationContext; -import org.springframework.core.io.*; -import org.springframework.stereotype.Component; import java.io.IOException; import java.net.HttpURLConnection; @@ -54,6 +47,7 @@ public Resource resolve( String location, ResourceLoader resourceLoader ) { log.warn( String.format( "Invalid 'Location' header for PURL %s.", url ) ); } catch ( IOException e ) { log.error( String.format( "Failed to resolve PURL %s.", url ), e ); + } finally { if ( con != null ) { con.disconnect(); } diff --git a/src/main/java/ubc/pavlab/rdp/util/SearchResult.java b/src/main/java/ubc/pavlab/rdp/util/SearchResult.java index aa84e14e..d991f84f 100644 --- a/src/main/java/ubc/pavlab/rdp/util/SearchResult.java +++ b/src/main/java/ubc/pavlab/rdp/util/SearchResult.java @@ -19,10 +19,12 @@ @EqualsAndHashCode(of = { "match" }) public class SearchResult> implements Comparable> { + @Nullable private final MatchType matchType; /** * A unique, internal ID that disambiguate results with the same {@link #label}. This is not being displayed. */ + @Nullable private final Integer id; /** * A label to identify the result. @@ -31,6 +33,7 @@ public class SearchResult> implements Comparable FACTORS.length ) { throw new VersionException( "Version must have at most " + FACTORS.length + " components." ); } diff --git a/src/main/java/ubc/pavlab/rdp/validation/Recaptcha.java b/src/main/java/ubc/pavlab/rdp/validation/Recaptcha.java index 32695818..79ef5c0f 100644 --- a/src/main/java/ubc/pavlab/rdp/validation/Recaptcha.java +++ b/src/main/java/ubc/pavlab/rdp/validation/Recaptcha.java @@ -2,11 +2,10 @@ import lombok.Value; import org.springframework.lang.Nullable; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.RequestParam; @Value public class Recaptcha { + @Nullable String response; @Nullable String remoteIp; diff --git a/src/main/resources/ehcache.xml b/src/main/resources/ehcache.xml index 44e47f08..aada3763 100644 --- a/src/main/resources/ehcache.xml +++ b/src/main/resources/ehcache.xml @@ -26,10 +26,6 @@ maxElementsInMemory="10" eternal="true"/> - - diff --git a/src/test/java/ubc/pavlab/rdp/controllers/AdminControllerTest.java b/src/test/java/ubc/pavlab/rdp/controllers/AdminControllerTest.java index bca4cea6..4187d5c5 100644 --- a/src/test/java/ubc/pavlab/rdp/controllers/AdminControllerTest.java +++ b/src/test/java/ubc/pavlab/rdp/controllers/AdminControllerTest.java @@ -27,7 +27,6 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import org.springframework.util.LinkedMultiValueMap; @@ -202,7 +201,7 @@ public void givenLoggedIn_whenCreateAccessToken_thenRedirect3xx() throws Excepti AccessToken accessToken = TestUtils.createAccessToken( 1, user, "1234" ); when( userService.findUserById( 1 ) ).thenReturn( user ); when( userService.createAccessTokenForUser( user ) ).thenReturn( accessToken ); - when( roleRepository.findByRole( "ROLE_USER" ) ).thenReturn( createRole( 1, "ROLE_USER" ) ); + when( roleRepository.findByRole( "ROLE_USER" ) ).thenReturn( Optional.of( createRole( 1, "ROLE_USER" ) ) ); mvc.perform( post( "/admin/users/{user}/create-access-token", user.getId() ) ) .andExpect( status().is3xxRedirection() ) .andExpect( redirectedUrl( "/admin/users/1" ) ); @@ -718,7 +717,7 @@ public void activateOntologyTermInfo() throws Exception { Ontology ontology = Ontology.builder( "mondo" ).id( 1 ).build(); OntologyTermInfo term = OntologyTermInfo.builder( ontology, "test" ).build(); when( ontologyService.findById( 1 ) ).thenReturn( ontology ); - when( ontologyService.findTermByTermIdAndOntology( "test", ontology ) ).thenReturn( term ); + when( ontologyService.findTermByTermIdAndOntology( "test", ontology ) ).thenReturn( Optional.of( term ) ); mvc.perform( post( "/admin/ontologies/{ontologyId}/activate-term", ontology.getId() ) .param( "ontologyTermInfoId", "test" ) ) .andExpect( status().is3xxRedirection() ) @@ -734,7 +733,7 @@ public void activateOntologyTermInfo_whenIncludeSubtree() throws Exception { Ontology ontology = Ontology.builder( "mondo" ).id( 1 ).build(); OntologyTermInfo term = OntologyTermInfo.builder( ontology, "test" ).build(); when( ontologyService.findById( 1 ) ).thenReturn( ontology ); - when( ontologyService.findTermByTermIdAndOntology( "test", ontology ) ).thenReturn( term ); + when( ontologyService.findTermByTermIdAndOntology( "test", ontology ) ).thenReturn( Optional.of( term ) ); mvc.perform( post( "/admin/ontologies/{ontologyId}/activate-term", ontology.getId() ) .param( "ontologyTermInfoId", "test" ) .param( "includeSubtree", "true" ) ) @@ -751,7 +750,7 @@ public void activateOntologyTermInfo_whenTermFieldIsEmpty() throws Exception { Ontology ontology = Ontology.builder( "mondo" ).id( 1 ).build(); OntologyTermInfo term = OntologyTermInfo.builder( ontology, "test" ).build(); when( ontologyService.findById( 1 ) ).thenReturn( ontology ); - when( ontologyService.findTermByTermIdAndOntology( "test", ontology ) ).thenReturn( term ); + when( ontologyService.findTermByTermIdAndOntology( "test", ontology ) ).thenReturn( Optional.of( term ) ); mvc.perform( post( "/admin/ontologies/{ontologyId}/activate-term", ontology.getId() ) .param( "ontologyTermInfoId", "" ) .param( "includeSubtree", "true" ) ) @@ -770,7 +769,7 @@ public void activateOntologyTermInfo_whenTermFieldIsEmpty() throws Exception { public void activateOntologyTermInfo_whenTermIsNotInOntology() throws Exception { Ontology ontology = Ontology.builder( "mondo" ).id( 1 ).build(); when( ontologyService.findById( 1 ) ).thenReturn( ontology ); - when( ontologyService.findTermByTermIdAndOntology( "test", ontology ) ).thenReturn( null ); + when( ontologyService.findTermByTermIdAndOntology( "test", ontology ) ).thenReturn( Optional.empty() ); mvc.perform( post( "/admin/ontologies/{ontologyId}/activate-term", ontology.getId() ) .param( "ontologyTermInfoId", "test" ) ) .andExpect( status().isBadRequest() ) diff --git a/src/test/java/ubc/pavlab/rdp/repositories/PasswordResetTokenRepositoryTest.java b/src/test/java/ubc/pavlab/rdp/repositories/PasswordResetTokenRepositoryTest.java index 535d5532..dc78358b 100644 --- a/src/test/java/ubc/pavlab/rdp/repositories/PasswordResetTokenRepositoryTest.java +++ b/src/test/java/ubc/pavlab/rdp/repositories/PasswordResetTokenRepositoryTest.java @@ -60,23 +60,17 @@ public void setUp() { @Test public void findByToken_whenValidToken_thenReturnToken() { - - PasswordResetToken found = passwordResetTokenRepository.findByToken( "validtoken" ); - assertThat( found ).isEqualTo( validToken ); + assertThat( passwordResetTokenRepository.findByToken( "validtoken" ) ).hasValue( validToken ); } @Test public void findByToken_whenExpredToken_thenReturnToken() { - - PasswordResetToken found = passwordResetTokenRepository.findByToken( "expiredtoken" ); - assertThat( found ).isEqualTo( expiredToken ); + assertThat( passwordResetTokenRepository.findByToken( "expiredtoken" ) ).hasValue( expiredToken ); } @Test public void findByToken_whenInvalidToken_thenReturnNull() { - - PasswordResetToken found = passwordResetTokenRepository.findByToken( "invalidtoken" ); - assertThat( found ).isNull(); + assertThat( passwordResetTokenRepository.findByToken( "invalidtoken" ) ).isEmpty(); } @Test diff --git a/src/test/java/ubc/pavlab/rdp/repositories/RoleRepositoryTest.java b/src/test/java/ubc/pavlab/rdp/repositories/RoleRepositoryTest.java index 2e08a70a..5c7154bf 100644 --- a/src/test/java/ubc/pavlab/rdp/repositories/RoleRepositoryTest.java +++ b/src/test/java/ubc/pavlab/rdp/repositories/RoleRepositoryTest.java @@ -47,7 +47,7 @@ public void findByRole_whenValidRole_thenReturnRole() { entityManager.persist( role ); entityManager.flush(); - Role found = roleRepository.findByRole( "TEST_ROLE" ); + Role found = roleRepository.findByRole( "TEST_ROLE" ).orElse( null ); assertThat( found ).isEqualTo( role ); @@ -57,7 +57,7 @@ public void findByRole_whenValidRole_thenReturnRole() { @Test public void findByRole_whenInvalidRole_thenReturnNull() { - Role found = roleRepository.findByRole( "XXX" ); + Role found = roleRepository.findByRole( "XXX" ).orElse( null ); assertThat( found ).isNull(); diff --git a/src/test/java/ubc/pavlab/rdp/repositories/UserRepositoryTest.java b/src/test/java/ubc/pavlab/rdp/repositories/UserRepositoryTest.java index 2069c806..80a17e30 100644 --- a/src/test/java/ubc/pavlab/rdp/repositories/UserRepositoryTest.java +++ b/src/test/java/ubc/pavlab/rdp/repositories/UserRepositoryTest.java @@ -48,11 +48,11 @@ public void findByEmail_whenMatch_thenReturnUser() { entityManager.flush(); // when - User found = userRepository.findByEmailIgnoreCase( user.getEmail() ); - - // then - assertThat( found.getEmail() ) - .isEqualTo( user.getEmail() ); + assertThat( userRepository.findByEmailIgnoreCase( user.getEmail() ) ).hasValueSatisfying( found -> { + // then + assertThat( found.getEmail() ) + .isEqualTo( user.getEmail() ); + } ); } @Test @@ -65,10 +65,10 @@ public void findByEmail_whenCaseInsensitiveMatch_thenReturnUser() { entityManager.flush(); // when - User found = userRepository.findByEmailIgnoreCase( user.getEmail().toUpperCase() ); - - // then - assertThat( found ).isEqualTo( user ); + assertThat( userRepository.findByEmailIgnoreCase( user.getEmail().toUpperCase() ) ).hasValueSatisfying( found -> { + // then + assertThat( found ).isEqualTo( user ); + } ); } @Test @@ -326,6 +326,7 @@ public void findByDescriptionLike_whenCaseInsensitiveMatch_thenReturnUser() { entityManager.flush(); // when + assertThat( user.getProfile().getDescription() ).isNotNull(); String search = user.getProfile().getDescription().toUpperCase(); Collection found = userRepository.findDistinctByProfileDescriptionLikeIgnoreCaseOrTaxonDescriptionsLikeIgnoreCaseOrUserOntologyTermsNameLikeIgnoreCase( "%" + search + "%" ); @@ -344,6 +345,7 @@ public void findByDescriptionLike_whenDescriptionStartsWithMatch_thenReturnUser( entityManager.flush(); // when + assertThat( user.getProfile().getDescription() ).isNotNull(); String search = user.getProfile().getDescription().substring( 0, 3 ); Collection found = userRepository.findDistinctByProfileDescriptionLikeIgnoreCaseOrTaxonDescriptionsLikeIgnoreCaseOrUserOntologyTermsNameLikeIgnoreCase( "%" + search + "%" ); @@ -362,6 +364,7 @@ public void findByDescriptionLike_whenDescriptionEndsWithMatch_thenReturnUser() entityManager.flush(); // when + assertThat( user.getProfile().getDescription() ).isNotNull(); String search = user.getProfile().getDescription().substring( 3 ); Collection found = userRepository.findDistinctByProfileDescriptionLikeIgnoreCaseOrTaxonDescriptionsLikeIgnoreCaseOrUserOntologyTermsNameLikeIgnoreCase( "%" + search + "%" ); @@ -380,6 +383,7 @@ public void findByDescriptionLike_whenDescriptionContainsMatch_thenReturnUser() entityManager.flush(); // when + assertThat( user.getProfile().getDescription() ).isNotNull(); String search = user.getProfile().getDescription().substring( 1, 3 ); Collection found = userRepository.findDistinctByProfileDescriptionLikeIgnoreCaseOrTaxonDescriptionsLikeIgnoreCaseOrUserOntologyTermsNameLikeIgnoreCase( "%" + search + "%" ); @@ -551,7 +555,7 @@ public void delete_whenUserHasMultipleAssociations_thenSucceed() { UserOrgan userOrgan = entityManager.persistAndFlush( createUserOrgan( user, organInfo ) ); user.getVerificationTokens().add( token ); - user.getRoles().add( roleRepository.findByRole( "ROLE_USER" ) ); + user.getRoles().add( roleRepository.findByRole( "ROLE_USER" ).orElseThrow( NullPointerException::new ) ); user.getProfile().getResearcherCategories().add( ResearcherCategory.IN_SILICO ); user.getUserOrgans().put( userOrgan.getUberonId(), userOrgan ); user.getTaxonDescriptions().put( humanTaxon, "I'm a human researcher." ); diff --git a/src/test/java/ubc/pavlab/rdp/repositories/VerificationTokenRepositoryTest.java b/src/test/java/ubc/pavlab/rdp/repositories/VerificationTokenRepositoryTest.java index 0e224c4b..3a9f745d 100644 --- a/src/test/java/ubc/pavlab/rdp/repositories/VerificationTokenRepositoryTest.java +++ b/src/test/java/ubc/pavlab/rdp/repositories/VerificationTokenRepositoryTest.java @@ -1,6 +1,5 @@ package ubc.pavlab.rdp.repositories; -import org.assertj.core.data.TemporalUnitOffset; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -63,23 +62,17 @@ public void setUp() { @Test public void findByToken_whenValidToken_thenReturnToken() { - - VerificationToken found = verificationTokenRepository.findByToken( "validtoken" ); - assertThat( found ).isEqualTo( validToken ); + assertThat( verificationTokenRepository.findByToken( "validtoken" ) ).hasValue( validToken ); } @Test public void findByToken_whenExpredToken_thenReturnToken() { - - VerificationToken found = verificationTokenRepository.findByToken( "expiredtoken" ); - assertThat( found ).isEqualTo( expiredToken ); + assertThat( verificationTokenRepository.findByToken( "expiredtoken" ) ).hasValue( expiredToken ); } @Test public void findByToken_whenInvalidToken_thenReturnNull() { - - VerificationToken found = verificationTokenRepository.findByToken( "invalidtoken" ); - assertThat( found ).isNull(); + assertThat( verificationTokenRepository.findByToken( "invalidtoken" ) ).isEmpty(); } @Test diff --git a/src/test/java/ubc/pavlab/rdp/security/PrivacyServiceImplTest.java b/src/test/java/ubc/pavlab/rdp/security/PrivacyServiceImplTest.java index fe19ab93..638c7220 100644 --- a/src/test/java/ubc/pavlab/rdp/security/PrivacyServiceImplTest.java +++ b/src/test/java/ubc/pavlab/rdp/security/PrivacyServiceImplTest.java @@ -77,8 +77,8 @@ public void setUp() { otherUser.setEnabledAt( Instant.now() ); adminUser = createUserWithRoles( 3, roleAdmin ); serviceAccountUser = createUserWithRoles( 4, roleServiceAccount ); - when( roleRepository.findByRole( "ROLE_ADMIN" ) ).thenReturn( roleAdmin ); - when( roleRepository.findByRole( "ROLE_SERVICE_ACCOUNT" ) ).thenReturn( roleServiceAccount ); + when( roleRepository.findByRole( "ROLE_ADMIN" ) ).thenReturn( Optional.of( roleAdmin ) ); + when( roleRepository.findByRole( "ROLE_SERVICE_ACCOUNT" ) ).thenReturn( Optional.of( roleServiceAccount ) ); when( applicationSettings.getPrivacy() ).thenReturn( privacySettings ); when( applicationSettings.getIsearch() ).thenReturn( iSearchSettings ); when( privacySettings.isRegisteredSearch() ).thenReturn( true ); diff --git a/src/test/java/ubc/pavlab/rdp/services/GeneInfoServiceImplTest.java b/src/test/java/ubc/pavlab/rdp/services/GeneInfoServiceImplTest.java index 6f53b81c..3cd2d1a0 100644 --- a/src/test/java/ubc/pavlab/rdp/services/GeneInfoServiceImplTest.java +++ b/src/test/java/ubc/pavlab/rdp/services/GeneInfoServiceImplTest.java @@ -27,7 +27,6 @@ import java.io.IOException; import java.net.URL; -import java.time.Instant; import java.time.LocalDate; import java.util.Collection; import java.util.Collections; @@ -37,10 +36,7 @@ import java.util.stream.IntStream; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.eq; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; +import static org.mockito.Mockito.*; import static ubc.pavlab.rdp.util.TestUtils.createGene; import static ubc.pavlab.rdp.util.TestUtils.createTaxon; @@ -303,7 +299,7 @@ public void updateGenes_thenSucceed() throws ParseException, IOException { verify( taxonService ).findByActiveTrue(); verify( geneInfoParser ).parse( any(), eq( humanTaxon.getId() ) ); assertThat( geneInfoRepository.findByGeneId( 4 ) ) - .isNotNull() + .get() .hasFieldOrPropertyWithValue( "symbol", "FOO" ) .hasFieldOrPropertyWithValue( "name", "BAR" ) .hasFieldOrPropertyWithValue( "taxon", humanTaxon ); @@ -318,7 +314,7 @@ public void updateGenes_whenTaxonDiffers_thenIgnoreGeneRecord() throws ParseExce geneService.updateGenes(); verify( taxonService ).findByActiveTrue(); verify( geneInfoParser ).parse( any(), eq( 9606 ) ); - assertThat( geneInfoRepository.findByGeneId( 4 ) ).isNull(); + assertThat( geneInfoRepository.findByGeneId( 4 ) ).isEmpty(); } @Test @@ -332,7 +328,7 @@ public void updateGenes_whenTaxonIsChanged_thenUpdateGene() throws ParseExceptio geneService.updateGenes(); verify( taxonService ).findByActiveTrue(); assertThat( geneInfoRepository.findByGeneId( 4 ) ) - .isNotNull() + .get() .hasFieldOrPropertyWithValue( "symbol", "FOO" ) .hasFieldOrPropertyWithValue( "name", "BAR" ) .hasFieldOrPropertyWithValue( "taxon", humanTaxon ); @@ -350,7 +346,7 @@ public void updateGenes_whenGeneInfoContainsMultipleTaxon_thenIgnoreUnrelatedTax verify( taxonService ).findByActiveTrue(); verify( geneInfoParser ).parse( any(), eq( fissionYeastTaxon.getId() ) ); assertThat( geneInfoRepository.findByGeneId( 4 ) ) - .isNotNull() + .get() .hasFieldOrPropertyWithValue( "symbol", "FOO" ) .hasFieldOrPropertyWithValue( "name", "BAR" ) .hasFieldOrPropertyWithValue( "taxon", fissionYeastTaxon ); diff --git a/src/test/java/ubc/pavlab/rdp/services/OntologyServiceTest.java b/src/test/java/ubc/pavlab/rdp/services/OntologyServiceTest.java index 789ffeac..4c0ef93c 100644 --- a/src/test/java/ubc/pavlab/rdp/services/OntologyServiceTest.java +++ b/src/test/java/ubc/pavlab/rdp/services/OntologyServiceTest.java @@ -111,7 +111,7 @@ public static class OntologyTestSetupService { public Ontology setupOntology( String ont, boolean activateTerms ) throws IOException, OntologyNameAlreadyUsedException, ParseException { if ( ontologyRepository.existsByName( ont ) ) { log.info( String.format( "%s ontology already setup, skipping...", ont ) ); - return ontologyRepository.findByName( ont ); + return ontologyRepository.findByName( ont ).orElseThrow( NullPointerException::new ); } Resource resource = new ClassPathResource( "cache/" + ont + ".obo" ); try ( Reader reader = new InputStreamReader( resource.getInputStream() ) ) { @@ -137,11 +137,11 @@ public void createFromObo() throws IOException, ParseException, OntologyNameAlre assertThat( term.getSynonyms() ) .hasSize( 9 ) .contains( "canalis cervicis uteri" ); - term = ontologyService.findTermByTermIdAndOntology( "UBERON:0000044", ontology ); + term = ontologyService.findTermByTermIdAndOntology( "UBERON:0000044", ontology ).orElse( null ); assertThat( term ).isNotNull(); assertThat( term.getAltTermIds() ) .containsExactly( "UBERON:0026602" ); - OntologyTermInfo termWithMixedCaseSynonym = ontologyService.findTermByTermIdAndOntology( "UBERON:8000005", ontology ); + OntologyTermInfo termWithMixedCaseSynonym = ontologyService.findTermByTermIdAndOntology( "UBERON:8000005", ontology ).orElse( null ); assertThat( termWithMixedCaseSynonym ).isNotNull(); assertThat( termWithMixedCaseSynonym.getSynonyms() ) .contains( "nerve fiber layer of Henle".toLowerCase() ); @@ -169,7 +169,7 @@ public void updateFromObo_whenSynonymChangeCase_thenIgnoreNewValue() throws Onto Ontology ontology = ontologySetupService.setupOntology( "mondo", false ); // need to rehash because the sorted set is case insensitive - synonyms = new HashSet<>( ontologyService.findTermByTermIdAndOntology( "MONDO:0005296", ontology ).getSynonyms() ); + synonyms = new HashSet<>( ontologyService.findTermByTermIdAndOntology( "MONDO:0005296", ontology ).get().getSynonyms() ); assertThat( synonyms ).contains( "sleep Apneas, mixed" ); // the casing has changed to "sleep apneas, mixed" in mondo2 @@ -177,7 +177,7 @@ public void updateFromObo_whenSynonymChangeCase_thenIgnoreNewValue() throws Onto try ( Reader reader = new InputStreamReader( resource.getInputStream() ) ) { ontologyService.updateFromObo( ontology, reader ); } - synonyms = new HashSet<>( ontologyService.findTermByTermIdAndOntology( "MONDO:0005296", ontology ).getSynonyms() ); + synonyms = new HashSet<>( ontologyService.findTermByTermIdAndOntology( "MONDO:0005296", ontology ).get().getSynonyms() ); assertThat( synonyms ).contains( "sleep Apneas, mixed" ); } @@ -330,7 +330,7 @@ public void writeObo_whenFedBackToOboParser_thenProduceExactlyTheSameStructure() @Test public void activateTerm() throws OntologyNameAlreadyUsedException, IOException, ParseException { Ontology mondo = ontologySetupService.setupOntology( "mondo", true ); - OntologyTermInfo term = ontologyService.findTermByTermIdAndOntology( "MONDO:0000001", mondo ); + OntologyTermInfo term = ontologyService.findTermByTermIdAndOntology( "MONDO:0000001", mondo ).orElse( null ); ontologyService.activateTerm( term ); entityManager.refresh( term ); assertThat( term.isActive() ).isTrue(); @@ -342,7 +342,7 @@ public void activateTerm() throws OntologyNameAlreadyUsedException, IOException, @Test public void activateTermSubtree() throws OntologyNameAlreadyUsedException, IOException, ParseException { Ontology mondo = ontologySetupService.setupOntology( "mondo", false ); - OntologyTermInfo term = ontologyService.findTermByTermIdAndOntology( "MONDO:0000001", mondo ); + OntologyTermInfo term = ontologyService.findTermByTermIdAndOntology( "MONDO:0000001", mondo ).orElse( null ); int activatedTerms = ontologyService.activateTermSubtree( term ); assertThat( activatedTerms ).isEqualTo( 22027 ); } @@ -361,7 +361,7 @@ public void inferTermIds() throws OntologyNameAlreadyUsedException, IOException, public void inferTermIds_whenTopTermIsUsed() throws OntologyNameAlreadyUsedException, IOException, ParseException { Ontology uberon = ontologySetupService.setupOntology( "uberon", true ); StopWatch stopWatch = StopWatch.createStarted(); - OntologyTermInfo brainTerm = ontologyService.findTermByTermIdAndOntology( "UBERON:0001062", uberon ); + OntologyTermInfo brainTerm = ontologyService.findTermByTermIdAndOntology( "UBERON:0001062", uberon ).orElse( null ); stopWatch.stop(); Set inferredTerms = ontologyService.inferTermIds( Collections.singleton( brainTerm ) ); assertThat( inferredTerms ).hasSize( 13848 ); diff --git a/src/test/java/ubc/pavlab/rdp/services/ReactomeServiceTest.java b/src/test/java/ubc/pavlab/rdp/services/ReactomeServiceTest.java index 7bf01b64..41eb948f 100644 --- a/src/test/java/ubc/pavlab/rdp/services/ReactomeServiceTest.java +++ b/src/test/java/ubc/pavlab/rdp/services/ReactomeServiceTest.java @@ -134,8 +134,9 @@ public void updateSummations() throws ReactomeException { reactomeService.updatePathwaySummations( null ); assertThat( ontologyService.findTermByTermIdAndOntology( "R-HSA-164843", reactome ) ) - .isNotNull() - .hasFieldOrPropertyWithValue( "definition", "the new summation" ); + .hasValueSatisfying( term -> { + assertThat( term ).hasFieldOrPropertyWithValue( "definition", "the new summation" ); + } ); mockServer.verify(); } diff --git a/src/test/java/ubc/pavlab/rdp/services/RemoteResourceServiceTest.java b/src/test/java/ubc/pavlab/rdp/services/RemoteResourceServiceTest.java index c780a859..b62cd1ed 100644 --- a/src/test/java/ubc/pavlab/rdp/services/RemoteResourceServiceTest.java +++ b/src/test/java/ubc/pavlab/rdp/services/RemoteResourceServiceTest.java @@ -34,10 +34,7 @@ import java.net.URI; import java.net.URISyntaxException; -import java.util.Arrays; -import java.util.Collections; -import java.util.EnumSet; -import java.util.UUID; +import java.util.*; import java.util.concurrent.TimeUnit; import static org.assertj.core.api.Assertions.assertThat; @@ -126,7 +123,7 @@ public void setUp() { adminRole.setId( 1 ); adminRole.setRole( "ADMIN" ); adminUser.getRoles().add( adminRole ); - when( roleRepository.findByRole( "ROLE_ADMIN" ) ).thenReturn( adminRole ); + when( roleRepository.findByRole( "ROLE_ADMIN" ) ).thenReturn( Optional.ofNullable( adminRole ) ); } @After diff --git a/src/test/java/ubc/pavlab/rdp/services/UserGeneServiceImplTest.java b/src/test/java/ubc/pavlab/rdp/services/UserGeneServiceImplTest.java index 218c21bb..6d1442ac 100644 --- a/src/test/java/ubc/pavlab/rdp/services/UserGeneServiceImplTest.java +++ b/src/test/java/ubc/pavlab/rdp/services/UserGeneServiceImplTest.java @@ -20,6 +20,8 @@ import ubc.pavlab.rdp.repositories.UserGeneRepository; import ubc.pavlab.rdp.settings.ApplicationSettings; +import java.util.Optional; + import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static ubc.pavlab.rdp.util.TestUtils.*; @@ -69,7 +71,7 @@ public void updateUserGenes_withExistingUser_thenUserGeneAreUpdated() { UserGene userGene = createUserGene( 1, gene, user, TierType.TIER1, PrivacyLevelType.PRIVATE ); userGene.setGeneInfo( gene ); when( userGeneRepository.findAllWithGeneInfo() ).thenReturn( Lists.newArrayList( userGene ) ); - when( geneInfoRepository.findByGeneIdAndTaxon( gene.getGeneId(), gene.getTaxon() ) ).thenReturn( gene ); + when( geneInfoRepository.findByGeneIdAndTaxon( gene.getGeneId(), gene.getTaxon() ) ).thenReturn( Optional.of( gene ) ); userGeneService.updateUserGenes(); verify( userGeneRepository ).save( userGene ); } diff --git a/src/test/java/ubc/pavlab/rdp/services/UserServiceImplTest.java b/src/test/java/ubc/pavlab/rdp/services/UserServiceImplTest.java index 3c2c5799..58300c01 100644 --- a/src/test/java/ubc/pavlab/rdp/services/UserServiceImplTest.java +++ b/src/test/java/ubc/pavlab/rdp/services/UserServiceImplTest.java @@ -190,7 +190,7 @@ public void setUp() { } private void setUpRoleMocks() { - when( roleRepository.findByRole( "ROLE_USER" ) ).thenReturn( createRole( 2, "ROLE_USER" ) ); + when( roleRepository.findByRole( "ROLE_USER" ) ).thenReturn( Optional.of( createRole( 2, "ROLE_USER" ) ) ); } private void setUpPasswordResetTokenMocks() { @@ -199,20 +199,20 @@ private void setUpPasswordResetTokenMocks() { PasswordResetToken token = new PasswordResetToken(); token.setUser( user ); token.updateToken( "token1" ); - when( passwordResetTokenRepository.findByToken( token.getToken() ) ).thenReturn( token ); + when( passwordResetTokenRepository.findByToken( token.getToken() ) ).thenReturn( Optional.of( token ) ); token = new PasswordResetToken(); token.setUser( user ); token.setToken( "token1Expired" ); token.setExpiryDate( Instant.now().minusSeconds( 1 ) ); - when( passwordResetTokenRepository.findByToken( token.getToken() ) ).thenReturn( token ); + when( passwordResetTokenRepository.findByToken( token.getToken() ) ).thenReturn( Optional.of( token ) ); token = new PasswordResetToken(); token.setUser( otherUser ); token.updateToken( "token2" ); - when( passwordResetTokenRepository.findByToken( token.getToken() ) ).thenReturn( token ); + when( passwordResetTokenRepository.findByToken( token.getToken() ) ).thenReturn( Optional.of( token ) ); - when( passwordResetTokenRepository.findByToken( "tokenBad" ) ).thenReturn( null ); + when( passwordResetTokenRepository.findByToken( "tokenBad" ) ).thenReturn( Optional.empty() ); } private void setUpVerificationTokenMocks() { @@ -221,16 +221,16 @@ private void setUpVerificationTokenMocks() { token.setUser( user ); token.setEmail( user.getEmail() ); token.updateToken( "token1" ); - when( tokenRepository.findByToken( token.getToken() ) ).thenReturn( token ); + when( tokenRepository.findByToken( token.getToken() ) ).thenReturn( Optional.of( token ) ); token = new VerificationToken(); token.setUser( user ); token.setEmail( user.getEmail() ); token.setToken( "token1Expired" ); token.setExpiryDate( Instant.now().minus( 1, ChronoUnit.SECONDS ) ); - when( tokenRepository.findByToken( token.getToken() ) ).thenReturn( token ); + when( tokenRepository.findByToken( token.getToken() ) ).thenReturn( Optional.of( token ) ); - when( tokenRepository.findByToken( "tokenBad" ) ).thenReturn( null ); + when( tokenRepository.findByToken( "tokenBad" ) ).thenReturn( Optional.empty() ); } private void setUpRecommendTermsMocks() { @@ -408,7 +408,7 @@ public void findUserByIdNoAuth_whenInvalidId_thenReturnNull() { @Test public void findUserByEmail_whenValidEmail_thenUserShouldBeFound() { User user = createUser( 1 ); - when( userRepository.findByEmailIgnoreCase( user.getEmail() ) ).thenReturn( user ); + when( userRepository.findByEmailIgnoreCase( user.getEmail() ) ).thenReturn( Optional.of( user ) ); User found = userService.findUserByEmailNoAuth( user.getEmail() ); assertThat( found ).isNotNull(); @@ -807,7 +807,7 @@ public void confirmVerificationToken_whenTokenEmailDoesNotMatch_thenThrowTokenEx token.setUser( user ); token.setEmail( "foo@example.com" ); token.updateToken( "token1" ); - when( tokenRepository.findByToken( token.getToken() ) ).thenReturn( token ); + when( tokenRepository.findByToken( token.getToken() ) ).thenReturn( Optional.of( token ) ); userService.confirmVerificationToken( "token1", new MockHttpServletRequest() ); } diff --git a/src/test/java/ubc/pavlab/rdp/util/OntologyMessageSourceTest.java b/src/test/java/ubc/pavlab/rdp/util/OntologyMessageSourceTest.java index 67aac661..573f87b5 100644 --- a/src/test/java/ubc/pavlab/rdp/util/OntologyMessageSourceTest.java +++ b/src/test/java/ubc/pavlab/rdp/util/OntologyMessageSourceTest.java @@ -69,7 +69,7 @@ public void resolveCode_whenCodeIsReactome_thenUseDefaults() { @Test public void resolveCode_whenCodeIsAnOntologyDefinition() { - when( ontologyService.findDefinitionByOntologyName( "mondo" ) ).thenReturn( "A diseases ontology." ); + when( ontologyService.findDefinitionByOntologyName( "mondo" ) ).thenReturn( Optional.of( "A diseases ontology." ) ); assertThat( messageSource.getMessage( "rdp.ontologies.mondo.definition", null, Locale.getDefault() ) ) .isEqualTo( "A diseases ontology." ); verify( ontologyService ).findDefinitionByOntologyName( "mondo" ); @@ -78,7 +78,7 @@ public void resolveCode_whenCodeIsAnOntologyDefinition() { @Test public void resolveCode_whenCodeIsAnOntologyDefinitionMessageSourceResolvable_thenResolveItCorrectly() { Ontology ontology = Ontology.builder( "mondo" ).build(); - when( ontologyService.findDefinitionByOntologyName( "mondo" ) ).thenReturn( "A disease ontology." ); + when( ontologyService.findDefinitionByOntologyName( "mondo" ) ).thenReturn( Optional.of( "A disease ontology." ) ); assertThat( messageSource.getMessage( ontology.getResolvableDefinition(), Locale.getDefault() ) ) .isEqualTo( "A disease ontology." ); verify( ontologyService ).findDefinitionByOntologyName( "mondo" ); From 38ca90be17020106f9aa7ebb1e1271da2e909b29 Mon Sep 17 00:00:00 2001 From: Guillaume Poirier-Morency Date: Tue, 8 Oct 2024 15:37:27 -0700 Subject: [PATCH 5/9] Update dependencies --- pom.xml | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 7223a820..e2a08699 100644 --- a/pom.xml +++ b/pom.xml @@ -140,13 +140,13 @@ commons-io commons-io - 2.16.1 + 2.17.0 org.apache.commons commons-csv - 1.11.0 + 1.12.0 @@ -159,7 +159,7 @@ nl.basjes.parse.useragent yauaa - 7.26.1 + 7.28.1 @@ -321,6 +321,15 @@ + + org.codehaus.mojo + versions-maven-plugin + 2.17.1 + + false + false + + From c4489d5ff973e508193b3dc8d14dfa8b78712687 Mon Sep 17 00:00:00 2001 From: Guillaume Poirier-Morency Date: Tue, 8 Oct 2024 16:15:40 -0700 Subject: [PATCH 6/9] Use proper @Nullable type in LoginController --- src/main/java/ubc/pavlab/rdp/controllers/LoginController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ubc/pavlab/rdp/controllers/LoginController.java b/src/main/java/ubc/pavlab/rdp/controllers/LoginController.java index 89e8bb04..8b768208 100644 --- a/src/main/java/ubc/pavlab/rdp/controllers/LoginController.java +++ b/src/main/java/ubc/pavlab/rdp/controllers/LoginController.java @@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.http.HttpStatus; +import org.springframework.lang.Nullable; import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; @@ -26,7 +27,6 @@ import ubc.pavlab.rdp.validation.Recaptcha; import ubc.pavlab.rdp.validation.RecaptchaValidator; -import javax.annotation.Nullable; import javax.servlet.http.HttpServletRequest; import java.util.List; import java.util.Locale; From 9052a2252823498fa96092d06db920ddd2d66244 Mon Sep 17 00:00:00 2001 From: Guillaume Poirier-Morency Date: Tue, 8 Oct 2024 16:20:32 -0700 Subject: [PATCH 7/9] Update version in docs --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index b9d65328..3a44f69c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -14,5 +14,5 @@ plugins: markdown_extensions: - admonition extra: - rdp_version: 1.5.8 + rdp_version: 1.5.10 git_ref: master From fbeb4a9a1fadb0c49469cf97f9b8555fc4dda5d3 Mon Sep 17 00:00:00 2001 From: Guillaume Poirier-Morency Date: Tue, 8 Oct 2024 16:52:21 -0700 Subject: [PATCH 8/9] Properly handle null researcher categories when updating a profile Pass it separately so it can be annotated with @Nullable. --- .../rdp/controllers/UserController.java | 8 ++++++- .../ubc/pavlab/rdp/services/UserService.java | 3 ++- .../pavlab/rdp/services/UserServiceImpl.java | 16 +++++++------ .../rdp/controllers/UserControllerTest.java | 8 +++---- .../rdp/services/UserServiceImplTest.java | 24 +++++++++---------- 5 files changed, 34 insertions(+), 25 deletions(-) diff --git a/src/main/java/ubc/pavlab/rdp/controllers/UserController.java b/src/main/java/ubc/pavlab/rdp/controllers/UserController.java index cab4d0d3..dc85f49c 100644 --- a/src/main/java/ubc/pavlab/rdp/controllers/UserController.java +++ b/src/main/java/ubc/pavlab/rdp/controllers/UserController.java @@ -388,7 +388,13 @@ public ResponseEntity saveProfile( @Valid @RequestBody ProfileWithOrganUberon .body( BindingResultModel.fromBindingResult( bindingResult ) ); } else { String previousContactEmail = user.getProfile().getContactEmail(); - user = userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, profileWithOrganUberonIdsAndOntologyTerms.profile, profileWithOrganUberonIdsAndOntologyTerms.profile.getPublications(), profileWithOrganUberonIdsAndOntologyTerms.organUberonIds, profileWithOrganUberonIdsAndOntologyTerms.ontologyTermIds, locale ); + user = userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, + profileWithOrganUberonIdsAndOntologyTerms.profile, + profileWithOrganUberonIdsAndOntologyTerms.profile.getResearcherCategories(), + profileWithOrganUberonIdsAndOntologyTerms.profile.getPublications(), + profileWithOrganUberonIdsAndOntologyTerms.organUberonIds, + profileWithOrganUberonIdsAndOntologyTerms.ontologyTermIds, + locale ); String message = messageSource.getMessage( "UserController.profileSaved", new Object[]{ user.getProfile().getContactEmail() }, locale ); if ( user.getProfile().getContactEmail() != null && !user.getProfile().getContactEmail().equals( previousContactEmail ) && diff --git a/src/main/java/ubc/pavlab/rdp/services/UserService.java b/src/main/java/ubc/pavlab/rdp/services/UserService.java index d7877137..ca1509a9 100644 --- a/src/main/java/ubc/pavlab/rdp/services/UserService.java +++ b/src/main/java/ubc/pavlab/rdp/services/UserService.java @@ -185,7 +185,8 @@ User updateTermsAndGenesInTaxon( User user, User updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( User user, Profile profile, - Set publications, + @Nullable Set researcherCategories, + @Nullable Set publications, @Nullable Set organUberonIds, @Nullable Set ontologyTermIds, Locale locale ); diff --git a/src/main/java/ubc/pavlab/rdp/services/UserServiceImpl.java b/src/main/java/ubc/pavlab/rdp/services/UserServiceImpl.java index 71d9ea08..651fc2f7 100644 --- a/src/main/java/ubc/pavlab/rdp/services/UserServiceImpl.java +++ b/src/main/java/ubc/pavlab/rdp/services/UserServiceImpl.java @@ -748,7 +748,7 @@ public void sendGeneAccessRequest( User requestingUser, UserGene userGene, Strin @Transactional @Override @PreAuthorize("hasPermission(#user, 'update')") - public User updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( User user, Profile profile, @Nullable Set publications, @Nullable Set organUberonIds, @Nullable Set termIdsByOntologyId, Locale locale ) { + public User updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( User user, Profile profile, @Nullable Set researcherCategories, @Nullable Set publications, @Nullable Set organUberonIds, @Nullable Set termIdsByOntologyId, Locale locale ) { user.getProfile().setDepartment( profile.getDepartment() ); user.getProfile().setDescription( profile.getDescription() ); user.getProfile().setLastName( profile.getLastName() ); @@ -762,12 +762,14 @@ public User updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( User user user.getProfile().setResearcherPosition( profile.getResearcherPosition() ); user.getProfile().setOrganization( profile.getOrganization() ); - if ( applicationSettings.getProfile().getEnabledResearcherCategories().containsAll( profile.getResearcherCategories() ) ) { - user.getProfile().getResearcherCategories().retainAll( profile.getResearcherCategories() ); - user.getProfile().getResearcherCategories().addAll( profile.getResearcherCategories() ); - } else { - log.warn( MessageFormat.format( "User {0} attempted to set user {1} researcher type to an unknown value {2}.", - findCurrentUser(), user, profile.getResearcherCategories() ) ); + if ( researcherCategories != null ) { + if ( applicationSettings.getProfile().getEnabledResearcherCategories().containsAll( researcherCategories ) ) { + user.getProfile().getResearcherCategories().retainAll( researcherCategories ); + user.getProfile().getResearcherCategories().addAll( researcherCategories ); + } else { + log.warn( MessageFormat.format( "User {0} attempted to set user {1} researcher type to an unknown value {2}.", + findCurrentUser(), user, researcherCategories ) ); + } } if ( user.getProfile().getContactEmail() == null || diff --git a/src/test/java/ubc/pavlab/rdp/controllers/UserControllerTest.java b/src/test/java/ubc/pavlab/rdp/controllers/UserControllerTest.java index b05124af..08b1c996 100644 --- a/src/test/java/ubc/pavlab/rdp/controllers/UserControllerTest.java +++ b/src/test/java/ubc/pavlab/rdp/controllers/UserControllerTest.java @@ -115,7 +115,7 @@ public class UserControllerTest { @BeforeEach public void setUp() { when( taxonService.findById( any() ) ).then( i -> createTaxon( i.getArgument( 0, Integer.class ) ) ); - when( userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( any(), any(), any(), any(), any(), any() ) ).thenAnswer( arg -> arg.getArgument( 0, User.class ) ); + when( userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( any(), any(), any(), any(), any(), any(), any() ) ).thenAnswer( arg -> arg.getArgument( 0, User.class ) ); } @Test @@ -635,7 +635,7 @@ public void givenLoggedIn_whenSaveProfile_thenReturnSucceed() expectedProfile.setWebsite( "http://test.com" ); expectedProfile.setPrivacyLevel( PrivacyLevelType.PRIVATE ); - verify( userService ).updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, expectedProfile, expectedProfile.getPublications(), null, null, Locale.ENGLISH ); + verify( userService ).updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, expectedProfile, expectedProfile.getResearcherCategories(), expectedProfile.getPublications(), null, null, Locale.ENGLISH ); } @Test @@ -684,7 +684,7 @@ public void givenLoggedIn_whenSaveProfileWithNewPrivacyLevel_thenReturn200() Profile profile = user.getProfile(); profile.setPrivacyLevel( PrivacyLevelType.SHARED ); - verify( userService ).updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, profile, profile.getPublications(), null, null, Locale.ENGLISH ); + verify( userService ).updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, profile, profile.getResearcherCategories(), profile.getPublications(), null, null, Locale.ENGLISH ); } @Test @@ -713,7 +713,7 @@ public void givenLoggedIn_whenSaveProfileWithUberonOrganIds_thenReturnSuccess() .locale( Locale.ENGLISH ) ) .andExpect( status().isOk() ); - verify( userService ).updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, user.getProfile(), user.getProfile().getPublications(), Sets.newSet( organ.getUberonId() ), null, Locale.ENGLISH ); + verify( userService ).updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, user.getProfile(), user.getProfile().getResearcherCategories(), user.getProfile().getPublications(), Sets.newSet( organ.getUberonId() ), null, Locale.ENGLISH ); } @Test diff --git a/src/test/java/ubc/pavlab/rdp/services/UserServiceImplTest.java b/src/test/java/ubc/pavlab/rdp/services/UserServiceImplTest.java index 58300c01..6950f100 100644 --- a/src/test/java/ubc/pavlab/rdp/services/UserServiceImplTest.java +++ b/src/test/java/ubc/pavlab/rdp/services/UserServiceImplTest.java @@ -573,7 +573,7 @@ public void updateUserProfileAndPublications_whenPublications_thenReplaceAll() { } ).collect( Collectors.toSet() ); - User updatedUser = userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, user.getProfile(), newPublications, null, null, Locale.getDefault() ); + User updatedUser = userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, user.getProfile(), null, newPublications, null, null, Locale.getDefault() ); assertThat( updatedUser.getProfile().getPublications() ).containsExactlyElementsOf( newPublications ); @@ -589,7 +589,7 @@ public void updateUserProfileAndPublication_whenOrgansIsEnabled_thenSaveOrgans() .map( id -> createOrgan( id, null, null ) ) .collect( Collectors.toSet() ) ); Set organUberonIds = Sets.newSet( "UBERON:00001", "UBERON:00002" ); - user = userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, user.getProfile(), null, organUberonIds, null, Locale.getDefault() ); + user = userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, user.getProfile(), null, null, organUberonIds, null, Locale.getDefault() ); verify( organInfoService ).findByUberonIdIn( organUberonIds ); assertThat( user.getUserOrgans().values() ) .extracting( "uberonId" ) @@ -601,7 +601,7 @@ public void updateUserProfileAndPublication_whenOrgansIsNotEnabled_thenIgnoreOrg when( applicationSettings.getOrgans().isEnabled() ).thenReturn( false ); User user = createUser( 1 ); Set organUberonIds = Sets.newSet( "UBERON:00001", "UBERON:00002" ); - user = userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, user.getProfile(), null, organUberonIds, null, Locale.getDefault() ); + user = userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, user.getProfile(), null, null, organUberonIds, null, Locale.getDefault() ); verifyNoInteractions( organInfoService ); assertThat( user.getUserOrgans() ).isEmpty(); } @@ -614,7 +614,7 @@ public void updateUserProfileAndPublicationsAndOrgans_whenPrivacyLevelChangeAndC Profile profile = new Profile(); profile.setPrivacyLevel( PrivacyLevelType.SHARED ); - userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, profile, null, null, null, Locale.getDefault() ); + userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, profile, null, null, null, null, Locale.getDefault() ); assertThat( user.getProfile() ).hasFieldOrPropertyWithValue( "privacyLevel", PrivacyLevelType.PUBLIC ); } @@ -630,7 +630,7 @@ public void updateUserProfileAndPublicationsAndOrgans_whenPrivacyLevelChange_the Profile profile = new Profile(); profile.setPrivacyLevel( PrivacyLevelType.SHARED ); - userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, profile, null, null, null, Locale.getDefault() ); + userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, profile, null, null, null, null, Locale.getDefault() ); assertThat( user.getProfile() ) .hasFieldOrPropertyWithValue( "privacyLevel", PrivacyLevelType.SHARED ); @@ -644,12 +644,12 @@ public void updateUserProfileAndPublicationsAndOrgans_whenContactEmailIsSet_then Profile profile = new Profile(); profile.setPrivacyLevel( PrivacyLevelType.PUBLIC ); profile.setContactEmail( "foo@example.com" ); - userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, profile, null, null, null, Locale.getDefault() ); + userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, profile, null, null, null, null, Locale.getDefault() ); verify( userListener ).onContactEmailUpdate( any( OnContactEmailUpdateEvent.class ) ); assertThat( user.getProfile().isContactEmailVerified() ).isFalse(); // make sure that if user update its profile later on, he doesn't get spammed - userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, profile, null, null, null, Locale.getDefault() ); + userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, profile, null, null, null, null, Locale.getDefault() ); verifyNoMoreInteractions( userListener ); assertThat( user.getProfile().isContactEmailVerified() ).isFalse(); } @@ -660,7 +660,7 @@ public void updateUserProfileAndPublicationsAndOrgans_whenContactEmailIsEqualToU Profile profile = new Profile(); profile.setPrivacyLevel( PrivacyLevelType.PUBLIC ); profile.setContactEmail( user.getEmail() ); - userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, profile, null, null, null, Locale.getDefault() ); + userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, profile, null, null, null, null, Locale.getDefault() ); assertThat( user.getProfile().isContactEmailVerified() ).isTrue(); verifyNoInteractions( userListener ); } @@ -674,7 +674,7 @@ public void updateUserProfileAndPublicationsAndOrgans_whenContactEmailIsNull_the Profile profile = new Profile(); profile.setPrivacyLevel( PrivacyLevelType.PUBLIC ); profile.setContactEmail( null ); - userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, profile, null, null, null, Locale.getDefault() ); + userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, profile, null, null, null, null, Locale.getDefault() ); assertThat( user.getProfile().getContactEmail() ).isNull(); assertThat( user.getProfile().isContactEmailVerified() ).isFalse(); assertThat( user.getProfile().getContactEmailVerifiedAt() ).isNull(); @@ -690,7 +690,7 @@ public void updateUserProfileAndPublicationsAndOrgans_whenContactEmailIsEmpty_th Profile profile = new Profile(); profile.setPrivacyLevel( PrivacyLevelType.PUBLIC ); profile.setContactEmail( "" ); - userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, profile, null, null, null, Locale.getDefault() ); + userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, profile, null, null, null, null, Locale.getDefault() ); assertThat( user.getProfile().getContactEmail() ).isEmpty(); assertThat( user.getProfile().isContactEmailVerified() ).isFalse(); assertThat( user.getProfile().getContactEmailVerifiedAt() ).isNull(); @@ -704,7 +704,7 @@ public void updateUserProfileAndPublicationsAndOrgans_whenResearcherPositionIsSe Profile profile = new Profile(); profile.setPrivacyLevel( PrivacyLevelType.PUBLIC ); profile.setResearcherPosition( ResearcherPosition.PRINCIPAL_INVESTIGATOR ); - userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, profile, null, null, null, Locale.getDefault() ); + userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, profile, null, null, null, null, Locale.getDefault() ); assertThat( user.getProfile().getResearcherPosition() ).isEqualTo( ResearcherPosition.PRINCIPAL_INVESTIGATOR ); verify( profileSettings ).getEnabledResearcherPositions(); verify( userRepository ).save( user ); @@ -717,7 +717,7 @@ public void updateUserProfileAndPublicationsAndOrgans_whenResearcherCategoriesAr Profile profile = new Profile(); profile.setPrivacyLevel( PrivacyLevelType.PUBLIC ); profile.getResearcherCategories().add( ResearcherCategory.IN_SILICO ); - userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, profile, null, null, null, Locale.getDefault() ); + userService.updateUserProfileAndPublicationsAndOrgansAndOntologyTerms( user, profile, profile.getResearcherCategories(), null, null, null, Locale.getDefault() ); assertThat( user.getProfile().getResearcherCategories() ).containsExactly( ResearcherCategory.IN_SILICO ); verify( profileSettings ).getEnabledResearcherCategories(); verify( userRepository ).save( user ); From 93954d06e4270db9ae6190f0c43d65343f8f8a83 Mon Sep 17 00:00:00 2001 From: Guillaume Poirier-Morency Date: Tue, 8 Oct 2024 19:06:21 -0700 Subject: [PATCH 9/9] Update frontend dev dependencies --- src/main/resources/package-lock.json | 1911 ++++++++++++++------------ src/main/resources/package.json | 12 +- 2 files changed, 1067 insertions(+), 856 deletions(-) diff --git a/src/main/resources/package-lock.json b/src/main/resources/package-lock.json index 842d58a5..6c6df6a9 100644 --- a/src/main/resources/package-lock.json +++ b/src/main/resources/package-lock.json @@ -17,18 +17,18 @@ "popper.js": "~1.16.1" }, "devDependencies": { - "@babel/core": "^7.25.2", - "@babel/preset-env": "^7.25.3", - "babel-loader": "^9.1.3", + "@babel/core": "^7.25.7", + "@babel/preset-env": "^7.25.7", + "babel-loader": "^9.2.1", "css-loader": "^6.11.0", - "postcss": "^8.4.41", + "postcss": "^8.4.47", "postcss-loader": "^8.1.1", "postcss-preset-env": "^9.6.0", - "sass": "^1.77.8", + "sass": "^1.79.4", "sass-loader": "^14.2.1", "source-map-loader": "^5.0.0", "style-loader": "^3.3.4", - "webpack": "^5.93.0", + "webpack": "^5.95.0", "webpack-cli": "^5.1.4" } }, @@ -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" @@ -46,12 +47,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", + "@babel/highlight": "^7.25.7", "picocolors": "^1.0.0" }, "engines": { @@ -59,30 +61,32 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", - "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz", + "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", + "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -98,54 +102,58 @@ } }, "node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", + "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.25.0", + "@babel/types": "^7.25.7", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz", + "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", - "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.7.tgz", + "integrity": "sha512-12xfNeKNH7jubQNm7PAkzlLwEmCs1tfuX3UjIw6vP6QXi+leKh6+LyC/+Ed4EIQermwd58wsyh070yjDHFlNGg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", + "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -154,17 +162,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz", - "integrity": "sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==", - "dev": true, - "dependencies": { - "@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.0", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz", + "integrity": "sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-member-expression-to-functions": "^7.25.7", + "@babel/helper-optimise-call-expression": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/traverse": "^7.25.7", "semver": "^6.3.1" }, "engines": { @@ -175,13 +184,14 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", - "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.7.tgz", + "integrity": "sha512-byHhumTj/X47wJ6C6eLpK7wW/WBEcnUeb7D0FNc/jFQnQVw7DOso3Zz5u9x/zLrFVkHa89ZGDbkAa1D54NdrCQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "regexpu-core": "^5.3.1", + "@babel/helper-annotate-as-pure": "^7.25.7", + "regexpu-core": "^6.1.1", "semver": "^6.3.1" }, "engines": { @@ -196,6 +206,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -208,41 +219,44 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", - "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz", + "integrity": "sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.8" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", + "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", + "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", "dev": true, + "license": "MIT", "dependencies": { - "@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" + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -252,35 +266,38 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", - "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz", + "integrity": "sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", + "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", - "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.7.tgz", + "integrity": "sha512-kRGE89hLnPfcz6fTrlNU+uhgcwv0mBE4Gv3P9Ke9kLVJYpi4AMVVEElXvB5CabrPZW4nCM8P8UyyjrzCM0O2sw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-wrap-function": "^7.25.0", - "@babel/traverse": "^7.25.0" + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-wrap-function": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -290,14 +307,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", - "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz", + "integrity": "sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@babel/helper-member-expression-to-functions": "^7.25.7", + "@babel/helper-optimise-call-expression": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -307,92 +325,100 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", + "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", - "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz", + "integrity": "sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", + "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", - "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.7.tgz", + "integrity": "sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", - "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", + "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", + "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -402,12 +428,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", - "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", + "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.25.2" + "@babel/types": "^7.25.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -417,13 +444,14 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz", - "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.7.tgz", + "integrity": "sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.3" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -433,12 +461,13 @@ } }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", - "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.7.tgz", + "integrity": "sha512-GDDWeVLNxRIkQTnJn2pDOM1pkCgYdSqPeT1a9vh9yIqu2uzzgw1zcqEb+IJOhy+dTBMlNdThrDIksr2o09qrrQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -448,12 +477,13 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.0", - "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.25.0.tgz", - "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.7.tgz", + "integrity": "sha512-wxyWg2RYaSUYgmd9MR0FyRGyeOMQE/Uzr1wzd/g5cf5bwi9A4v6HFdDm7y1MgDtod/fLOSTZY6jDgV0xU9d5bA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -463,14 +493,15 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", - "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.7.tgz", + "integrity": "sha512-Xwg6tZpLxc4iQjorYsyGMyfJE7nP5MV8t/Ka58BgiA7Jw0fRqQNcANlLfdJ/yvBt9z9LD2We+BEkT7vLqZRWng==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/plugin-transform-optional-chaining": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -480,13 +511,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", - "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.7.tgz", + "integrity": "sha512-UVATLMidXrnH+GMUIuxq55nejlj02HP7F5ETyBONzP6G87fPBogG4CH6kxrSrdIuAjdwNO9VzyaYsrZPscWUrw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.0" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -500,6 +532,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" }, @@ -512,6 +545,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" }, @@ -524,6 +558,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" }, @@ -536,6 +571,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" }, @@ -551,6 +587,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -563,6 +600,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, @@ -571,12 +609,13 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", - "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz", + "integrity": "sha512-ZvZQRmME0zfJnDQnVBKYzHxXT7lYBB3Revz1GuS7oLXWMgqUPX4G+DDbT30ICClht9WKV34QVrZhSw6WdklwZQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -586,12 +625,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", - "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz", + "integrity": "sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -605,6 +645,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" }, @@ -617,6 +658,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" }, @@ -629,6 +671,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" }, @@ -641,6 +684,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" }, @@ -653,6 +697,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" }, @@ -665,6 +710,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" }, @@ -677,6 +723,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" }, @@ -689,6 +736,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" }, @@ -701,6 +749,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" }, @@ -716,6 +765,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" }, @@ -731,6 +781,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -743,12 +794,13 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", - "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.7.tgz", + "integrity": "sha512-EJN2mKxDwfOUCPxMO6MUI58RN3ganiRAG/MS/S3HfB6QFNjroAMelQo/gybyYq97WerCBAZoyrAoW8Tzdq2jWg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -758,15 +810,16 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz", - "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.7.tgz", + "integrity": "sha512-4B6OhTrwYKHYYgcwErvZjbmH9X5TxQBsaBHdzEIB4l71gR5jh/tuHGlb9in47udL2+wVUcOz5XXhhfhVJwEpEg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-remap-async-to-generator": "^7.25.0", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-remap-async-to-generator": "^7.25.7", "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/traverse": "^7.25.0" + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -776,14 +829,15 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", - "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.7.tgz", + "integrity": "sha512-ZUCjAavsh5CESCmi/xCpX1qcCaAglzs/7tmuvoFnJgA1dM7gQplsguljoTg+Ru8WENpX89cQyAtWoaE0I3X3Pg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7" + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-remap-async-to-generator": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -793,12 +847,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", - "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.7.tgz", + "integrity": "sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -808,12 +863,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", - "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.7.tgz", + "integrity": "sha512-ZEPJSkVZaeTFG/m2PARwLZQ+OG0vFIhPlKHK/JdIMy8DbRJ/htz6LRrTFtdzxi9EHmcwbNPAKDnadpNSIW+Aow==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -823,13 +879,14 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", - "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.7.tgz", + "integrity": "sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -839,13 +896,14 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", - "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.7.tgz", + "integrity": "sha512-rvUUtoVlkDWtDWxGAiiQj0aNktTPn3eFynBcMC2IhsXweehwgdI9ODe+XjWw515kEmv22sSOTp/rxIRuTiB7zg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -856,16 +914,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz", - "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.7.tgz", + "integrity": "sha512-9j9rnl+YCQY0IGoeipXvnk3niWicIB6kCsWRGLwX241qSXpbA4MKxtp/EdvFxsc4zI5vqfLxzOd0twIJ7I99zg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/traverse": "^7.25.0", + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7", + "@babel/traverse": "^7.25.7", "globals": "^11.1.0" }, "engines": { @@ -876,13 +935,14 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", - "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.7.tgz", + "integrity": "sha512-QIv+imtM+EtNxg/XBKL3hiWjgdLjMOmZ+XzQwSgmBfKbfxUjBzGgVPklUuE55eq5/uVoh8gg3dqlrwR/jw3ZeA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/template": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/template": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -892,12 +952,13 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", - "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.7.tgz", + "integrity": "sha512-xKcfLTlJYUczdaM1+epcdh1UGewJqr9zATgrNHcLBcV2QmfvPPEixo/sK/syql9cEmbr7ulu5HMFG5vbbt/sEA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -907,13 +968,14 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", - "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.7.tgz", + "integrity": "sha512-kXzXMMRzAtJdDEgQBLF4oaiT6ZCU3oWHgpARnTKDAqPkDJ+bs3NrZb310YYevR5QlRo3Kn7dzzIdHbZm1VzJdQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -923,12 +985,13 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", - "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.7.tgz", + "integrity": "sha512-by+v2CjoL3aMnWDOyCIg+yxU9KXSRa9tN6MbqggH5xvymmr9p4AMjYkNlQy4brMceBnUyHZ9G8RnpvT8wP7Cfg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -938,13 +1001,14 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", - "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.7.tgz", + "integrity": "sha512-HvS6JF66xSS5rNKXLqkk7L9c/jZ/cdIVIcoPVrnl8IsVpLggTjXs8OWekbLHs/VtYDDh5WXnQyeE3PPUGm22MA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -954,12 +1018,13 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", - "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.7.tgz", + "integrity": "sha512-UvcLuual4h7/GfylKm2IAA3aph9rwvAM2XBA0uPKU3lca+Maai4jBjjEVUS568ld6kJcgbouuumCBhMd/Yz17w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -970,13 +1035,14 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", - "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.7.tgz", + "integrity": "sha512-yjqtpstPfZ0h/y40fAXRv2snciYr0OAoMXY/0ClC7tm4C/nG5NJKmIItlaYlLbIVAWNfrYuy9dq1bE0SbX0PEg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -986,12 +1052,13 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", - "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.7.tgz", + "integrity": "sha512-h3MDAP5l34NQkkNulsTNyjdaR+OiB0Im67VU//sFupouP8Q6m9Spy7l66DcaAQxtmCqGdanPByLsnwFttxKISQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1002,13 +1069,14 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", - "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.7.tgz", + "integrity": "sha512-n/TaiBGJxYFWvpJDfsxSj9lEEE44BFM1EPGz4KEiTipTgkoFVVcCmzAL3qA7fdQU96dpo4gGf5HBx/KnDvqiHw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1018,14 +1086,15 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", - "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.7.tgz", + "integrity": "sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.1" + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1035,12 +1104,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", - "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.7.tgz", + "integrity": "sha512-Ot43PrL9TEAiCe8C/2erAjXMeVSnE/BLEx6eyrKLNFCCw5jvhTHKyHxdI1pA0kz5njZRYAnMO2KObGqOCRDYSA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1051,12 +1121,13 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", - "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.7.tgz", + "integrity": "sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1066,12 +1137,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", - "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.7.tgz", + "integrity": "sha512-iImzbA55BjiovLyG2bggWS+V+OLkaBorNvc/yJoeeDQGztknRnDdYfp2d/UPmunZYEnZi6Lg8QcTmNMHOB0lGA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1082,12 +1154,13 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", - "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.7.tgz", + "integrity": "sha512-Std3kXwpXfRV0QtQy5JJcRpkqP8/wG4XL7hSKZmGlxPlDqmpXtEPRmhF7ztnlTCtUN3eXRUJp+sBEZjaIBVYaw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1097,13 +1170,14 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", - "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.7.tgz", + "integrity": "sha512-CgselSGCGzjQvKzghCvDTxKHP3iooenLpJDO842ehn5D2G5fJB222ptnDwQho0WjEvg7zyoxb9P+wiYxiJX5yA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1113,14 +1187,15 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", - "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz", + "integrity": "sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-simple-access": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1130,15 +1205,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", - "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.7.tgz", + "integrity": "sha512-t9jZIvBmOXJsiuyOwhrIGs8dVcD6jDyg2icw1VL4A/g+FnWyJKwUfSSU2nwJuMV2Zqui856El9u+ElB+j9fV1g==", "dev": true, + "license": "MIT", "dependencies": { - "@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" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1148,13 +1224,14 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", - "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.7.tgz", + "integrity": "sha512-p88Jg6QqsaPh+EB7I9GJrIqi1Zt4ZBHUQtjw3z1bzEXcLh6GfPqzZJ6G+G1HBGKUNukT58MnKG7EN7zXQBCODw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1164,13 +1241,14 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", - "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.7.tgz", + "integrity": "sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1180,12 +1258,13 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", - "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.7.tgz", + "integrity": "sha512-CfCS2jDsbcZaVYxRFo2qtavW8SpdzmBXC2LOI4oO0rP+JSRDxxF3inF4GcPsLgfb5FjkhXG5/yR/lxuRs2pySA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1195,12 +1274,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", - "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.7.tgz", + "integrity": "sha512-FbuJ63/4LEL32mIxrxwYaqjJxpbzxPVQj5a+Ebrc8JICV6YX8nE53jY+K0RZT3um56GoNWgkS2BQ/uLGTjtwfw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1211,12 +1291,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", - "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.7.tgz", + "integrity": "sha512-8CbutzSSh4hmD+jJHIA8vdTNk15kAzOnFLVVgBSMGr28rt85ouT01/rezMecks9pkU939wDInImwCKv4ahU4IA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1227,15 +1308,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", - "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.7.tgz", + "integrity": "sha512-1JdVKPhD7Y5PvgfFy0Mv2brdrolzpzSoUq2pr6xsR+m+3viGGeHEokFKsCgOkbeFOQxfB1Vt2F0cPJLRpFI4Zg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.7" + "@babel/plugin-transform-parameters": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1245,13 +1327,14 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", - "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.7.tgz", + "integrity": "sha512-pWT6UXCEW3u1t2tcAGtE15ornCBvopHj9Bps9D2DsH15APgNVOTwwczGckX+WkAvBmuoYKRCFa4DK+jM8vh5AA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1261,12 +1344,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", - "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.7.tgz", + "integrity": "sha512-m9obYBA39mDPN7lJzD5WkGGb0GO54PPLXsbcnj1Hyeu8mSRz7Gb4b1A6zxNX32ZuUySDK4G6it8SDFWD1nCnqg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1277,13 +1361,14 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", - "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.7.tgz", + "integrity": "sha512-h39agClImgPWg4H8mYVAbD1qP9vClFbEjqoJmt87Zen8pjqK8FTPUwrOXAvqu5soytwxrLMd2fx2KSCp2CHcNg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1294,12 +1379,13 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", - "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz", + "integrity": "sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1309,13 +1395,14 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", - "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz", + "integrity": "sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1325,14 +1412,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", - "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.7.tgz", + "integrity": "sha512-LzA5ESzBy7tqj00Yjey9yWfs3FKy4EmJyKOSWld144OxkTji81WWnUT8nkLUn+imN/zHL8ZQlOu/MTUAhHaX3g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1343,12 +1431,13 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", - "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.7.tgz", + "integrity": "sha512-lQEeetGKfFi0wHbt8ClQrUSUMfEeI3MMm74Z73T9/kuz990yYVtfofjf3NuA42Jy3auFOpbjDyCSiIkTs1VIYw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1358,12 +1447,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", - "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.7.tgz", + "integrity": "sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1374,12 +1464,13 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", - "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.7.tgz", + "integrity": "sha512-3OfyfRRqiGeOvIWSagcwUTVk2hXBsr/ww7bLn6TRTuXnexA+Udov2icFOxFX9abaj4l96ooYkcNN1qi2Zvqwng==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1389,12 +1480,13 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", - "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.7.tgz", + "integrity": "sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1404,13 +1496,14 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", - "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz", + "integrity": "sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1420,12 +1513,13 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", - "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.7.tgz", + "integrity": "sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1435,12 +1529,13 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", - "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.7.tgz", + "integrity": "sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1450,12 +1545,13 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", - "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.7.tgz", + "integrity": "sha512-OmWmQtTHnO8RSUbL0NTdtpbZHeNTnm68Gj5pA4Y2blFNh+V4iZR68V1qL9cI37J21ZN7AaCnkfdHtLExQPf2uA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1465,12 +1561,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", - "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.7.tgz", + "integrity": "sha512-BN87D7KpbdiABA+t3HbVqHzKWUDN3dymLaTnPFAMyc8lV+KN3+YzNhVRNdinaCPA4AUqx7ubXbQ9shRjYBl3SQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1480,13 +1577,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", - "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.7.tgz", + "integrity": "sha512-IWfR89zcEPQGB/iB408uGtSPlQd3Jpq11Im86vUgcmSTcoWAiQMCTOa2K2yNNqFJEBVICKhayctee65Ka8OB0w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1496,13 +1594,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", - "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.7.tgz", + "integrity": "sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1512,13 +1611,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", - "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.7.tgz", + "integrity": "sha512-YRW8o9vzImwmh4Q3Rffd09bH5/hvY0pxg+1H1i0f7APoUeg12G7+HhLj9ZFNIrYkgBXhIijPJ+IXypN0hLTIbw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1528,28 +1628,29 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.3.tgz", - "integrity": "sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-option": "^7.24.8", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.7.tgz", + "integrity": "sha512-Gibz4OUdyNqqLj+7OAvBZxOD7CklCtMA5/j0JgUEwOnaRULsPDXmic2iKxL2DX2vQduPR5wH2hjZas/Vr/Oc0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.7", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.7", - "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-assertions": "^7.25.7", + "@babel/plugin-syntax-import-attributes": "^7.25.7", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -1561,60 +1662,60 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.0", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.24.7", - "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.25.0", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-dotall-regex": "^7.24.7", - "@babel/plugin-transform-duplicate-keys": "^7.24.7", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", - "@babel/plugin-transform-dynamic-import": "^7.24.7", - "@babel/plugin-transform-exponentiation-operator": "^7.24.7", - "@babel/plugin-transform-export-namespace-from": "^7.24.7", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-member-expression-literals": "^7.24.7", - "@babel/plugin-transform-modules-amd": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-modules-systemjs": "^7.25.0", - "@babel/plugin-transform-modules-umd": "^7.24.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-new-target": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-object-super": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-property-literals": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-reserved-words": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-template-literals": "^7.24.7", - "@babel/plugin-transform-typeof-symbol": "^7.24.8", - "@babel/plugin-transform-unicode-escapes": "^7.24.7", - "@babel/plugin-transform-unicode-property-regex": "^7.24.7", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", + "@babel/plugin-transform-arrow-functions": "^7.25.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.7", + "@babel/plugin-transform-async-to-generator": "^7.25.7", + "@babel/plugin-transform-block-scoped-functions": "^7.25.7", + "@babel/plugin-transform-block-scoping": "^7.25.7", + "@babel/plugin-transform-class-properties": "^7.25.7", + "@babel/plugin-transform-class-static-block": "^7.25.7", + "@babel/plugin-transform-classes": "^7.25.7", + "@babel/plugin-transform-computed-properties": "^7.25.7", + "@babel/plugin-transform-destructuring": "^7.25.7", + "@babel/plugin-transform-dotall-regex": "^7.25.7", + "@babel/plugin-transform-duplicate-keys": "^7.25.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.7", + "@babel/plugin-transform-dynamic-import": "^7.25.7", + "@babel/plugin-transform-exponentiation-operator": "^7.25.7", + "@babel/plugin-transform-export-namespace-from": "^7.25.7", + "@babel/plugin-transform-for-of": "^7.25.7", + "@babel/plugin-transform-function-name": "^7.25.7", + "@babel/plugin-transform-json-strings": "^7.25.7", + "@babel/plugin-transform-literals": "^7.25.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.7", + "@babel/plugin-transform-member-expression-literals": "^7.25.7", + "@babel/plugin-transform-modules-amd": "^7.25.7", + "@babel/plugin-transform-modules-commonjs": "^7.25.7", + "@babel/plugin-transform-modules-systemjs": "^7.25.7", + "@babel/plugin-transform-modules-umd": "^7.25.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.7", + "@babel/plugin-transform-new-target": "^7.25.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.7", + "@babel/plugin-transform-numeric-separator": "^7.25.7", + "@babel/plugin-transform-object-rest-spread": "^7.25.7", + "@babel/plugin-transform-object-super": "^7.25.7", + "@babel/plugin-transform-optional-catch-binding": "^7.25.7", + "@babel/plugin-transform-optional-chaining": "^7.25.7", + "@babel/plugin-transform-parameters": "^7.25.7", + "@babel/plugin-transform-private-methods": "^7.25.7", + "@babel/plugin-transform-private-property-in-object": "^7.25.7", + "@babel/plugin-transform-property-literals": "^7.25.7", + "@babel/plugin-transform-regenerator": "^7.25.7", + "@babel/plugin-transform-reserved-words": "^7.25.7", + "@babel/plugin-transform-shorthand-properties": "^7.25.7", + "@babel/plugin-transform-spread": "^7.25.7", + "@babel/plugin-transform-sticky-regex": "^7.25.7", + "@babel/plugin-transform-template-literals": "^7.25.7", + "@babel/plugin-transform-typeof-symbol": "^7.25.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.7", + "@babel/plugin-transform-unicode-property-regex": "^7.25.7", + "@babel/plugin-transform-unicode-regex": "^7.25.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.7", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.37.1", + "core-js-compat": "^3.38.1", "semver": "^6.3.1" }, "engines": { @@ -1629,6 +1730,7 @@ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", @@ -1638,17 +1740,12 @@ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, "node_modules/@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", "dev": true, + "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1657,30 +1754,32 @@ } }, "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", + "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", - "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.2", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1689,13 +1788,14 @@ } }, "node_modules/@babel/types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", + "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1717,6 +1817,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18" }, @@ -1740,6 +1841,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "engines": { "node": "^14 || ^16 || >=18" } @@ -1759,6 +1861,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18" }, @@ -1782,6 +1885,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "dependencies": { "@csstools/color-helpers": "^4.2.1", "@csstools/css-calc": "^1.2.4" @@ -1809,6 +1913,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18" }, @@ -1831,6 +1936,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18" } @@ -1850,6 +1956,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18" }, @@ -1873,6 +1980,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/selector-specificity": "^3.1.1", "postcss-selector-parser": "^6.0.13" @@ -1899,6 +2007,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/css-color-parser": "^2.0.4", "@csstools/css-parser-algorithms": "^2.7.1", @@ -1928,6 +2037,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/css-color-parser": "^2.0.4", "@csstools/css-parser-algorithms": "^2.7.1", @@ -1957,6 +2067,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/css-parser-algorithms": "^2.7.1", "@csstools/css-tokenizer": "^2.4.1", @@ -1985,6 +2096,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/css-calc": "^1.2.4", "@csstools/css-parser-algorithms": "^2.7.1", @@ -2012,6 +2124,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/utilities": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -2038,6 +2151,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/css-color-parser": "^2.0.4", "@csstools/css-parser-algorithms": "^2.7.1", @@ -2065,6 +2179,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/css-color-parser": "^2.0.4", "@csstools/css-parser-algorithms": "^2.7.1", @@ -2094,6 +2209,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/css-color-parser": "^2.0.4", "@csstools/css-parser-algorithms": "^2.7.1", @@ -2123,6 +2239,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^3.3.0", "@csstools/utilities": "^1.0.0", @@ -2150,6 +2267,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "engines": { "node": "^14 || ^16 || >=18" }, @@ -2172,6 +2290,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/selector-specificity": "^3.1.1", "postcss-selector-parser": "^6.0.13" @@ -2198,6 +2317,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/css-parser-algorithms": "^2.7.1", "@csstools/css-tokenizer": "^2.4.1", @@ -2226,6 +2346,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "engines": { "node": "^14 || ^16 || >=18" }, @@ -2248,6 +2369,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "engines": { "node": "^14 || ^16 || >=18" }, @@ -2270,6 +2392,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "engines": { "node": "^14 || ^16 || >=18" }, @@ -2292,6 +2415,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2317,6 +2441,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/css-tokenizer": "^2.4.1", "@csstools/utilities": "^1.0.0" @@ -2343,6 +2468,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "dependencies": { "@csstools/css-calc": "^1.2.4", "@csstools/css-parser-algorithms": "^2.7.1", @@ -2371,6 +2497,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/css-parser-algorithms": "^2.7.1", "@csstools/css-tokenizer": "^2.4.1", @@ -2398,6 +2525,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/utilities": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -2424,6 +2552,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2449,6 +2578,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/css-color-parser": "^2.0.4", "@csstools/css-parser-algorithms": "^2.7.1", @@ -2478,6 +2608,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2503,6 +2634,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/css-color-parser": "^2.0.4", "@csstools/css-parser-algorithms": "^2.7.1", @@ -2532,6 +2664,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "postcss-selector-parser": "^6.0.13" }, @@ -2557,6 +2690,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/css-calc": "^1.2.4", "@csstools/css-parser-algorithms": "^2.7.1", @@ -2584,6 +2718,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/color-helpers": "^4.2.1", "postcss-value-parser": "^4.2.0" @@ -2610,6 +2745,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/css-calc": "^1.2.4", "@csstools/css-parser-algorithms": "^2.7.1", @@ -2637,6 +2773,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "engines": { "node": "^14 || ^16 || >=18" }, @@ -2659,6 +2796,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "engines": { "node": "^14 || ^16 || >=18" }, @@ -2681,6 +2819,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "engines": { "node": "^14 || ^16 || >=18" }, @@ -2703,6 +2842,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "engines": { "node": "^14 || ^16 || >=18" }, @@ -2715,6 +2855,7 @@ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" } @@ -2724,6 +2865,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -2738,6 +2880,7 @@ "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" } @@ -2747,6 +2890,7 @@ "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" } @@ -2756,6 +2900,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -2765,57 +2910,42 @@ "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 + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "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" } }, - "node_modules/@types/eslint": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.0.tgz", - "integrity": "sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "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==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.1.0.tgz", - "integrity": "sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~6.13.0" + "undici-types": "~6.19.2" } }, "node_modules/@webassemblyjs/ast": { @@ -2823,6 +2953,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -2832,25 +2963,29 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -2861,13 +2996,15 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-buffer": "1.12.1", @@ -2880,6 +3017,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -2889,6 +3027,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } @@ -2897,13 +3036,15 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-buffer": "1.12.1", @@ -2920,6 +3061,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -2933,6 +3075,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-buffer": "1.12.1", @@ -2945,6 +3088,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", @@ -2959,6 +3103,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" @@ -2969,6 +3114,7 @@ "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -2982,6 +3128,7 @@ "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -2995,6 +3142,7 @@ "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -3012,19 +3160,22 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "dev": true, + "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==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/acorn": { "version": "8.12.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -3037,6 +3188,7 @@ "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^8" } @@ -3044,13 +3196,15 @@ "node_modules/activity-detector": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/activity-detector/-/activity-detector-3.0.0.tgz", - "integrity": "sha512-N1fl3FEAjh8jZcYZQHVOsziWFk3U6xXHIUPATTOChYvlTBJbnW9Y5A2PlVAxJFQKLqZRLS5G/hP5qh9oXQktdw==" + "integrity": "sha512-N1fl3FEAjh8jZcYZQHVOsziWFk3U6xXHIUPATTOChYvlTBJbnW9Y5A2PlVAxJFQKLqZRLS5G/hP5qh9oXQktdw==", + "license": "MIT" }, "node_modules/ajv": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -3067,6 +3221,7 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -3084,6 +3239,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -3096,6 +3252,7 @@ "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" }, @@ -3103,24 +3260,12 @@ "node": ">=4" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/autoprefixer": { "version": "10.4.20", @@ -3141,6 +3286,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "browserslist": "^4.23.3", "caniuse-lite": "^1.0.30001646", @@ -3160,10 +3306,11 @@ } }, "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "dev": true, + "license": "MIT", "dependencies": { "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" @@ -3181,6 +3328,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.6", "@babel/helper-define-polyfill-provider": "^0.6.2", @@ -3195,6 +3343,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.2", "core-js-compat": "^3.38.0" @@ -3208,6 +3357,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.2" }, @@ -3215,18 +3365,6 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "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==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/bootstrap": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz", @@ -3241,6 +3379,7 @@ "url": "https://opencollective.com/bootstrap" } ], + "license": "MIT", "peerDependencies": { "jquery": "1.9.1 - 3", "popper.js": "^1.16.1" @@ -3250,27 +3389,16 @@ "version": "1.13.18", "resolved": "https://registry.npmjs.org/bootstrap-select/-/bootstrap-select-1.13.18.tgz", "integrity": "sha512-V1IzK4rxBq5FrJtkzSH6RmFLFBsjx50byFbfAf8jYyXROWs7ZpprGjdHeoyq2HSsHyjJhMMwjsQhRoYAfxCGow==", + "license": "MIT", "peerDependencies": { "bootstrap": ">=3.0.0", "jquery": "1.9.1 - 3" } }, - "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==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", "dev": true, "funding": [ { @@ -3286,9 +3414,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", "node-releases": "^2.0.18", "update-browserslist-db": "^1.1.0" }, @@ -3303,21 +3432,23 @@ "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/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001649", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001649.tgz", - "integrity": "sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==", + "version": "1.0.30001667", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz", + "integrity": "sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==", "dev": true, "funding": [ { @@ -3332,13 +3463,15 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "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": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -3349,27 +3482,19 @@ } }, "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", "dev": true, + "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" } }, "node_modules/chrome-trace-event": { @@ -3377,6 +3502,7 @@ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0" } @@ -3386,6 +3512,7 @@ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, + "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -3400,6 +3527,7 @@ "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" } @@ -3408,37 +3536,43 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true + "dev": true, + "license": "MIT" }, "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 + "dev": true, + "license": "MIT" }, "node_modules/common-path-prefix": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/core-js-compat": { - "version": "3.38.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.0.tgz", - "integrity": "sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A==", + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.23.3" }, @@ -3452,6 +3586,7 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, + "license": "MIT", "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", @@ -3478,6 +3613,7 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3502,6 +3638,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "postcss-selector-parser": "^6.0.13" }, @@ -3527,6 +3664,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/selector-specificity": "^3.1.1", "postcss-selector-parser": "^6.0.13", @@ -3544,6 +3682,7 @@ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", "dev": true, + "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", @@ -3579,6 +3718,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -3601,6 +3741,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "engines": { "node": "^14 || ^16 || >=18" }, @@ -3609,9 +3750,9 @@ } }, "node_modules/cssdb": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.1.0.tgz", - "integrity": "sha512-BQN57lfS4dYt2iL0LgyrlDbefZKEtUyrO8rbzrbGrqBk6OoyNTQLF+porY9DrpDBjLo4NEvj2IJttC7vf3x+Ew==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.1.1.tgz", + "integrity": "sha512-kRbSRgZoxtZNl5snb3nOzBkFOt5AwnephcUTIEFc2DebKG9PN50/cHarlwOooTxYQ/gxsnKs3BxykhNLmfvyLg==", "dev": true, "funding": [ { @@ -3622,13 +3763,15 @@ "type": "github", "url": "https://github.com/sponsors/csstools" } - ] + ], + "license": "MIT-0" }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -3640,6 +3783,7 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.12.1.tgz", "integrity": "sha512-e6XAMUoV41JdQPS/r9YRfRcmTPcCVvyZbWI+xog1Zg+kjVliMQbEkvWK5XFItmi64Cvwg+IqsZbTUJ1KSY3umA==", + "license": "MIT", "dependencies": { "jquery": ">=1.7" } @@ -3648,18 +3792,20 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/datatables.net-bs4/-/datatables.net-bs4-1.12.1.tgz", "integrity": "sha512-LBeC8zUNVYyQT7ytC2lYqyXDn+k2kYpqvijC83oOjlcnEtb/8Tduzgquox5FrNKUJPcUrj9r+h5B0TDBbob/Gg==", + "license": "MIT", "dependencies": { "datatables.net": ">=1.11.3", "jquery": ">=1.7" } }, "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3671,16 +3817,18 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.5.tgz", - "integrity": "sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==", - "dev": true + "version": "1.5.33", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.33.tgz", + "integrity": "sha512-+cYTcFB1QqD4j4LegwLfpCNxifb6dDFUAwk6RsLusCwIaZI6or2f+q8rs5tTB2YC53HhOlIbEaqHMAAC8IOIwA==", + "dev": true, + "license": "ISC" }, "node_modules/enhanced-resolve": { "version": "5.17.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -3694,15 +3842,17 @@ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/envinfo": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", - "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", + "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", "dev": true, + "license": "MIT", "bin": { "envinfo": "dist/cli.js" }, @@ -3715,6 +3865,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" } @@ -3723,13 +3874,15 @@ "version": "1.5.4", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -3739,6 +3892,7 @@ "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" } @@ -3748,6 +3902,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -3761,6 +3916,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" }, @@ -3773,6 +3929,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" } @@ -3782,6 +3939,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -3791,6 +3949,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" } @@ -3800,6 +3959,7 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.x" } @@ -3808,46 +3968,39 @@ "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-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", - "dev": true + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.2.tgz", + "integrity": "sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==", + "dev": true, + "license": "MIT" }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.9.1" } }, - "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==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/find-cache-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "dev": true, + "license": "MIT", "dependencies": { "common-path-prefix": "^3.0.0", "pkg-dir": "^7.0.0" @@ -3864,6 +4017,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" @@ -3880,6 +4034,7 @@ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, + "license": "BSD-3-Clause", "bin": { "flat": "cli.js" } @@ -3889,6 +4044,7 @@ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, + "license": "MIT", "engines": { "node": "*" }, @@ -3897,25 +4053,12 @@ "url": "https://github.com/sponsors/rawify" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3925,33 +4068,24 @@ "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" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/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==", - "dev": true + "dev": true, + "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -3960,13 +4094,15 @@ "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/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": { "node": ">=4" } @@ -3976,6 +4112,7 @@ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -3988,6 +4125,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -4000,6 +4138,7 @@ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -4011,13 +4150,15 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -4034,6 +4175,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" @@ -4053,6 +4195,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" @@ -4066,6 +4209,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" }, @@ -4078,6 +4222,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" }, @@ -4093,6 +4238,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" }, @@ -4105,6 +4251,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" } @@ -4114,6 +4261,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" }, @@ -4126,6 +4274,7 @@ "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } @@ -4134,25 +4283,15 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/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==", "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, "node_modules/is-core-module": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -4163,41 +4302,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -4209,13 +4319,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/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4225,6 +4337,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -4239,6 +4352,7 @@ "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" } @@ -4248,6 +4362,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" }, @@ -4263,6 +4378,7 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", "dev": true, + "license": "MIT", "bin": { "jiti": "bin/jiti.js" } @@ -4270,12 +4386,14 @@ "node_modules/jquery": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", - "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==" + "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==", + "license": "MIT" }, "node_modules/jquery-ui": { "version": "1.13.3", "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.13.3.tgz", "integrity": "sha512-D2YJfswSJRh/B8M/zCowDpNFfwsDmtfnMPwjJTyvl+CBqzpYwQ+gFYIbUUlzijy/Qvoy30H1YhoSui4MNYpRwA==", + "license": "MIT", "dependencies": { "jquery": ">=1.8.0 <4.0.0" } @@ -4284,13 +4402,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" }, @@ -4299,34 +4419,38 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "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": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "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==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -4339,6 +4463,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4347,13 +4472,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/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==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.11.5" } @@ -4363,6 +4490,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^6.0.0" }, @@ -4377,13 +4505,15 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "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" } @@ -4392,13 +4522,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/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -4408,6 +4540,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -4416,10 +4549,11 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.7", @@ -4432,6 +4566,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -4443,28 +4578,22 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true - }, - "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, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4479,6 +4608,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^1.0.0" }, @@ -4494,6 +4624,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^4.0.0" }, @@ -4509,6 +4640,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" } @@ -4518,6 +4650,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" }, @@ -4530,6 +4663,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", @@ -4548,6 +4682,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -4557,6 +4692,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" } @@ -4565,31 +4701,22 @@ "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/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } + "license": "ISC" }, "node_modules/pkg-dir": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^6.3.0" }, @@ -4605,15 +4732,16 @@ "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" } }, "node_modules/postcss": { - "version": "8.4.41", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", - "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "dev": true, "funding": [ { @@ -4629,10 +4757,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -4653,6 +4782,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.13" }, @@ -4668,6 +4798,7 @@ "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -4693,6 +4824,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/css-color-parser": "^2.0.4", "@csstools/css-parser-algorithms": "^2.7.1", @@ -4722,6 +4854,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "dependencies": { "@csstools/utilities": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -4748,6 +4881,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/utilities": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -4774,6 +4908,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "dependencies": { "@csstools/cascade-layer-name-parser": "^1.0.13", "@csstools/css-parser-algorithms": "^2.7.1", @@ -4802,6 +4937,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "dependencies": { "@csstools/cascade-layer-name-parser": "^1.0.13", "@csstools/css-parser-algorithms": "^2.7.1", @@ -4831,6 +4967,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "dependencies": { "@csstools/cascade-layer-name-parser": "^1.0.13", "@csstools/css-parser-algorithms": "^2.7.1", @@ -4859,6 +4996,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "postcss-selector-parser": "^6.0.13" }, @@ -4884,6 +5022,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^3.3.0", "@csstools/utilities": "^1.0.0", @@ -4911,6 +5050,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "postcss-selector-parser": "^6.0.13" }, @@ -4936,6 +5076,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "postcss-selector-parser": "^6.0.13" }, @@ -4951,6 +5092,7 @@ "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", "dev": true, + "license": "MIT", "peerDependencies": { "postcss": "^8.1.0" } @@ -4970,6 +5112,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "engines": { "node": "^14 || ^16 || >=18" }, @@ -4992,6 +5135,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/utilities": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -5018,6 +5162,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/css-color-parser": "^2.0.4", "@csstools/css-parser-algorithms": "^2.7.1", @@ -5037,6 +5182,7 @@ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", "dev": true, + "license": "MIT", "dependencies": { "cosmiconfig": "^9.0.0", "jiti": "^1.20.0", @@ -5068,6 +5214,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -5090,6 +5237,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -5105,6 +5253,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -5117,6 +5266,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dev": true, + "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -5134,6 +5284,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dev": true, + "license": "ISC", "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -5149,6 +5300,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, + "license": "ISC", "dependencies": { "icss-utils": "^5.0.0" }, @@ -5174,6 +5326,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/selector-resolve-nested": "^1.1.0", "@csstools/selector-specificity": "^3.1.1", @@ -5201,6 +5354,7 @@ "url": "https://liberapay.com/mrcgrtz" } ], + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18" }, @@ -5223,6 +5377,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -5238,6 +5393,7 @@ "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", "dev": true, + "license": "MIT", "peerDependencies": { "postcss": "^8" } @@ -5257,6 +5413,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -5282,6 +5439,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/postcss-cascade-layers": "^4.0.6", "@csstools/postcss-color-function": "^3.0.19", @@ -5367,6 +5525,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "postcss-selector-parser": "^6.0.13" }, @@ -5382,6 +5541,7 @@ "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", "dev": true, + "license": "MIT", "peerDependencies": { "postcss": "^8.0.3" } @@ -5401,6 +5561,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.13" }, @@ -5412,10 +5573,11 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", - "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", + "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==", "dev": true, + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -5428,13 +5590,15 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -5444,20 +5608,23 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, + "license": "MIT", "engines": { - "node": ">=8.10.0" + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/rechoir": { @@ -5465,6 +5632,7 @@ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, + "license": "MIT", "dependencies": { "resolve": "^1.20.0" }, @@ -5476,13 +5644,15 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "dev": true, + "license": "MIT", "dependencies": { "regenerate": "^1.4.2" }, @@ -5494,27 +5664,30 @@ "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regenerator-transform": { "version": "0.15.2", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.4" } }, "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz", + "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.11.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, @@ -5522,32 +5695,32 @@ "node": ">=4" } }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.1.tgz", + "integrity": "sha512-1DHODs4B8p/mQHU9kr+jv8+wIC9mtG4eBHxWxIq5mhjE3D5oORhCc6deRKzTjs9DcfRFmj9BHSDguZklqCGFWQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~0.5.0" + "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5557,6 +5730,7 @@ "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.13.0", "path-parse": "^1.0.7", @@ -5574,6 +5748,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" }, @@ -5586,6 +5761,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" } @@ -5595,6 +5771,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" } @@ -5617,21 +5794,24 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/sass": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.8.tgz", - "integrity": "sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==", + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.4.tgz", + "integrity": "sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg==", "dev": true, + "license": "MIT", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", + "chokidar": "^4.0.0", "immutable": "^4.0.0", "source-map-js": ">=0.6.2 <2.0.0" }, @@ -5647,6 +5827,7 @@ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.2.1.tgz", "integrity": "sha512-G0VcnMYU18a4N7VoNDegg2OuMjYtxnqzQWARVWCIVSZwJeiL9kg8QMsuIZOplsJgTzZLF6jGxI3AClj8I9nRdQ==", "dev": true, + "license": "MIT", "dependencies": { "neo-async": "^2.6.2" }, @@ -5687,6 +5868,7 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -5706,6 +5888,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" } @@ -5715,6 +5898,7 @@ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } @@ -5724,6 +5908,7 @@ "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, + "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -5736,6 +5921,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" }, @@ -5748,6 +5934,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" } @@ -5757,15 +5944,17 @@ "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" } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -5775,6 +5964,7 @@ "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz", "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==", "dev": true, + "license": "MIT", "dependencies": { "iconv-lite": "^0.6.3", "source-map-js": "^1.0.2" @@ -5795,6 +5985,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -5805,6 +5996,7 @@ "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12.13.0" }, @@ -5821,6 +6013,7 @@ "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" }, @@ -5833,6 +6026,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" }, @@ -5845,15 +6039,17 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/terser": { - "version": "5.31.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.3.tgz", - "integrity": "sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==", + "version": "5.34.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.34.1.tgz", + "integrity": "sha512-FsJZ7iZLd/BXkz+4xrRTGJ26o/6VTjQytUk8b8OxkwcD2I+79VPJlz7qss1+zE7h8GNIScFqXcDyJ/KqBYZFVA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -5872,6 +6068,7 @@ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", @@ -5906,6 +6103,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", @@ -5922,6 +6120,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } @@ -5930,13 +6129,15 @@ "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/terser-webpack-plugin/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==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -5955,33 +6156,24 @@ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, - "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, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, "node_modules/undici-types": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", - "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==", - "dev": true + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -5991,6 +6183,7 @@ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, + "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -6000,10 +6193,11 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -6013,14 +6207,15 @@ "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -6036,9 +6231,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -6052,6 +6248,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" } @@ -6060,13 +6257,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -6076,12 +6275,12 @@ } }, "node_modules/webpack": { - "version": "5.93.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", - "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", + "version": "5.95.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz", + "integrity": "sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==", "dev": true, + "license": "MIT", "dependencies": { - "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", "@webassemblyjs/wasm-edit": "^1.12.1", @@ -6090,7 +6289,7 @@ "acorn-import-attributes": "^1.9.5", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -6127,6 +6326,7 @@ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, + "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.1.1", @@ -6172,6 +6372,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" } @@ -6181,6 +6382,7 @@ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, + "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", @@ -6195,6 +6397,7 @@ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } @@ -6204,6 +6407,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", @@ -6220,6 +6424,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } @@ -6228,13 +6433,15 @@ "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/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==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -6253,6 +6460,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" }, @@ -6267,19 +6475,22 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/yallist": { "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/yocto-queue": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.20" }, diff --git a/src/main/resources/package.json b/src/main/resources/package.json index ab179541..112c80ab 100644 --- a/src/main/resources/package.json +++ b/src/main/resources/package.json @@ -18,18 +18,18 @@ "popper.js": "~1.16.1" }, "devDependencies": { - "@babel/core": "^7.25.2", - "@babel/preset-env": "^7.25.3", - "babel-loader": "^9.1.3", + "@babel/core": "^7.25.7", + "@babel/preset-env": "^7.25.7", + "babel-loader": "^9.2.1", "css-loader": "^6.11.0", - "postcss": "^8.4.41", + "postcss": "^8.4.47", "postcss-loader": "^8.1.1", "postcss-preset-env": "^9.6.0", - "sass": "^1.77.8", + "sass": "^1.79.4", "sass-loader": "^14.2.1", "source-map-loader": "^5.0.0", "style-loader": "^3.3.4", - "webpack": "^5.93.0", + "webpack": "^5.95.0", "webpack-cli": "^5.1.4" }, "browserslist": [