diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index af5123e434..86fd1eaff0 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -43,6 +43,9 @@ jobs: image: ghcr.io/balhar-jakub/api-catalog-services-standalone:${{ github.run_id }}-${{ github.run_number }} volumes: - /api-defs:/api-defs + env: + APIML_SERVICE_HOSTNAME: api-catalog-services-2 + APIML_HEALTH_PROTECTED: false api-catalog-services: image: ghcr.io/balhar-jakub/api-catalog-services:${{ github.run_id }}-${{ github.run_number }} volumes: diff --git a/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/config/BeanConfig.java b/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/config/BeanConfig.java index 9d6d7d2c04..5fb9dda53c 100644 --- a/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/config/BeanConfig.java +++ b/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/config/BeanConfig.java @@ -10,12 +10,13 @@ package org.zowe.apiml.apicatalog.config; -import org.zowe.apiml.message.core.MessageService; -import org.zowe.apiml.product.gateway.GatewayClient; -import org.zowe.apiml.product.routing.transform.TransformService; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; +import org.zowe.apiml.message.core.MessageService; +import org.zowe.apiml.message.yaml.YamlMessageServiceInstance; +import org.zowe.apiml.product.gateway.GatewayClient; +import org.zowe.apiml.product.routing.transform.TransformService; /** * General configuration of the API Catalog. @@ -25,7 +26,9 @@ public class BeanConfig { @Bean @Primary - public MessageService messageServiceCatalog(MessageService messageService) { + public MessageService messageServiceCatalog() { + MessageService messageService = YamlMessageServiceInstance.getInstance(); + messageService.loadMessages("/security-client-log-messages.yml"); messageService.loadMessages("/utility-log-messages.yml"); messageService.loadMessages("/common-log-messages.yml"); messageService.loadMessages("/security-common-log-messages.yml"); diff --git a/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/controllers/api/ApiCatalogController.java b/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/controllers/api/ApiCatalogController.java index bc05db7d4c..f32e1afce1 100644 --- a/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/controllers/api/ApiCatalogController.java +++ b/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/controllers/api/ApiCatalogController.java @@ -92,6 +92,7 @@ public ResponseEntity> getOidcProvider() { ) @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "204", description = "No service available"), @ApiResponse(responseCode = "401", description = "Unauthorized"), @ApiResponse(responseCode = "403", description = "Forbidden"), @ApiResponse(responseCode = "404", description = "URI not found"), diff --git a/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/security/SecurityConfiguration.java b/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/security/SecurityConfiguration.java index 08b20773f3..949d17e084 100644 --- a/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/security/SecurityConfiguration.java +++ b/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/security/SecurityConfiguration.java @@ -14,6 +14,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -68,6 +69,7 @@ @EnableApimlAuth @EnableMethodSecurity @EnableConfigurationProperties(SafSecurityConfigurationProperties.class) +@ConditionalOnProperty(value = "apiml.catalog.standalone.enabled", havingValue = "false", matchIfMissing = true) public class SecurityConfiguration { private static final String APIDOC_ROUTES = "/apidoc/**"; private static final String STATIC_REFRESH_ROUTE = "/static-api/refresh"; @@ -299,4 +301,5 @@ private OidcContentFilter oidcFilter(AuthenticationManager authenticationManager public LogoutSuccessHandler logoutSuccessHandler() { return new ApiCatalogLogoutSuccessHandler(authConfigurationProperties); } + } diff --git a/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/services/status/listeners/GatewayLookupEventListener.java b/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/services/status/listeners/GatewayLookupEventListener.java index d19532adb1..0985f0de97 100644 --- a/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/services/status/listeners/GatewayLookupEventListener.java +++ b/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/services/status/listeners/GatewayLookupEventListener.java @@ -11,6 +11,7 @@ package org.zowe.apiml.apicatalog.services.status.listeners; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.event.EventListener; import org.springframework.core.Ordered; @@ -18,7 +19,6 @@ import org.springframework.stereotype.Component; import org.zowe.apiml.apicatalog.instance.InstanceInitializeService; import org.zowe.apiml.product.gateway.GatewayLookupCompleteEvent; -import org.zowe.apiml.product.registry.CannotRegisterServiceException; import java.util.concurrent.atomic.AtomicBoolean; @@ -26,6 +26,7 @@ * This class fires on GatewayLookupCompleteEvent event * Initializes Catalog instances from Eureka */ +@Slf4j @Component @ConditionalOnProperty( value = "apiml.catalog.standalone.enabled", @@ -39,10 +40,15 @@ public class GatewayLookupEventListener { private final AtomicBoolean hasRun = new AtomicBoolean(false); @EventListener(GatewayLookupCompleteEvent.class) - public void onApplicationEvent() throws CannotRegisterServiceException { + public void onApplicationEvent() { if (!hasRun.get()) { hasRun.set(true); - instanceInitializeService.retrieveAndRegisterAllInstancesWithCatalog(); + try { + instanceInitializeService.retrieveAndRegisterAllInstancesWithCatalog(); + } catch (Exception e) { + hasRun.set(false); + log.debug("Unexpected error occurred while initial retrieving of services: {}", e.getMessage()); + } } } } diff --git a/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/controllers/api/ApiCatalogControllerContainerRetrievalTestContextConfiguration.java b/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/controllers/api/ApiCatalogControllerContainerRetrievalTestContextConfiguration.java index abf4ba310b..bd9eb8cb12 100644 --- a/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/controllers/api/ApiCatalogControllerContainerRetrievalTestContextConfiguration.java +++ b/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/controllers/api/ApiCatalogControllerContainerRetrievalTestContextConfiguration.java @@ -10,7 +10,6 @@ package org.zowe.apiml.apicatalog.controllers.api; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Bean; import org.zowe.apiml.apicatalog.controllers.handlers.ApiCatalogControllerExceptionHandler; import org.zowe.apiml.apicatalog.services.cached.CachedProductFamilyService; @@ -21,11 +20,13 @@ class ApiCatalogControllerContainerRetrievalTestContextConfiguration { - @MockBean - private CachedProductFamilyService cachedProductFamilyService; + @Bean + public CachedProductFamilyService cachedProductFamilyService() { + return mock(CachedProductFamilyService.class); + } @Bean - public ApiCatalogController apiCatalogController() { + public ApiCatalogController apiCatalogController(CachedProductFamilyService cachedProductFamilyService) { when(cachedProductFamilyService.getAllContainers()) .thenThrow(new NullPointerException()); @@ -43,4 +44,5 @@ public MessageService messageService() { public ApiCatalogControllerExceptionHandler apiCatalogControllerExceptionHandler() { return new ApiCatalogControllerExceptionHandler(messageService()); } + } diff --git a/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/controllers/api/CatalogApiDocControllerApiDocNotFoundTestContextConfiguration.java b/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/controllers/api/CatalogApiDocControllerApiDocNotFoundTestContextConfiguration.java index 7f22f25d65..ac4ec2b36e 100644 --- a/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/controllers/api/CatalogApiDocControllerApiDocNotFoundTestContextConfiguration.java +++ b/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/controllers/api/CatalogApiDocControllerApiDocNotFoundTestContextConfiguration.java @@ -10,7 +10,6 @@ package org.zowe.apiml.apicatalog.controllers.api; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Bean; import org.zowe.apiml.apicatalog.controllers.handlers.CatalogApiDocControllerExceptionHandler; import org.zowe.apiml.apicatalog.services.status.APIServiceStatusService; @@ -22,11 +21,13 @@ class CatalogApiDocControllerApiDocNotFoundTestContextConfiguration { - @MockBean - private APIServiceStatusService apiServiceStatusService; + @Bean + public APIServiceStatusService apiServiceStatusService() { + return mock(APIServiceStatusService.class); + } @Bean - public CatalogApiDocController catalogApiDocController() { + public CatalogApiDocController catalogApiDocController(APIServiceStatusService apiServiceStatusService) { when(apiServiceStatusService.getServiceCachedApiDocInfo("service2", "v1")) .thenThrow(new ApiDocNotFoundException("Really bad stuff happened")); diff --git a/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/controllers/api/CatalogApiDocControllerServiceNotFoundTestContextConfiguration.java b/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/controllers/api/CatalogApiDocControllerServiceNotFoundTestContextConfiguration.java index 565fc1fdc8..65053eb455 100644 --- a/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/controllers/api/CatalogApiDocControllerServiceNotFoundTestContextConfiguration.java +++ b/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/controllers/api/CatalogApiDocControllerServiceNotFoundTestContextConfiguration.java @@ -10,7 +10,6 @@ package org.zowe.apiml.apicatalog.controllers.api; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Bean; import org.zowe.apiml.apicatalog.controllers.handlers.CatalogApiDocControllerExceptionHandler; import org.zowe.apiml.apicatalog.services.status.APIServiceStatusService; @@ -22,11 +21,13 @@ class CatalogApiDocControllerServiceNotFoundTestContextConfiguration { - @MockBean - private APIServiceStatusService apiServiceStatusService; + @Bean + public APIServiceStatusService apiServiceStatusService() { + return mock(APIServiceStatusService.class); + } @Bean - public CatalogApiDocController catalogApiDocController() { + public CatalogApiDocController catalogApiDocController(APIServiceStatusService apiServiceStatusService) { when(apiServiceStatusService.getServiceCachedApiDocInfo("service1", "v1")) .thenThrow(new ServiceNotFoundException("API Documentation not retrieved, The service is running.")); diff --git a/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/controllers/api/MockControllerTest.java b/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/controllers/api/MockControllerTest.java index a4377f0880..310774e38d 100644 --- a/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/controllers/api/MockControllerTest.java +++ b/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/controllers/api/MockControllerTest.java @@ -15,7 +15,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; @@ -27,6 +26,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; @@ -72,9 +72,13 @@ void whenPostRequest() throws Exception { @Configuration @Profile("test") - @SpyBean(ExampleService.class) static class Context { + @Bean + public ExampleService exampleService() { + return spy(new ExampleService()); + } + @Bean public MockController mockController(ExampleService exampleService) { return new MockController(exampleService); diff --git a/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/standalone/StandaloneInitializerTest.java b/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/standalone/StandaloneInitializerTest.java index 9d9153817e..9fd0f06b09 100644 --- a/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/standalone/StandaloneInitializerTest.java +++ b/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/standalone/StandaloneInitializerTest.java @@ -16,7 +16,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.context.event.ApplicationReadyEvent; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; @@ -26,11 +25,7 @@ import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit.jupiter.SpringExtension; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoInteractions; -import static org.mockito.Mockito.when; +import static org.mockito.Mockito.*; @ExtendWith(SpringExtension.class) @ActiveProfiles("test") @@ -82,11 +77,13 @@ private ConfigurableApplicationContext mockContext(ApplicationReadyEvent event, @Profile("test") public static class TestConfiguration { - @MockBean - private StandaloneLoaderService standaloneLoaderService; + @Bean + public StandaloneLoaderService standaloneLoaderService() { + return mock(StandaloneLoaderService.class); + } @Bean - public StandaloneInitializer getStandaloneInitializer() { + public StandaloneInitializer getStandaloneInitializer(StandaloneLoaderService standaloneLoaderService) { return new StandaloneInitializer(standaloneLoaderService); } diff --git a/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/staticapi/StaticAPIRefreshControllerTest.java b/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/staticapi/StaticAPIRefreshControllerTest.java index 96571544ab..352f17bd69 100644 --- a/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/staticapi/StaticAPIRefreshControllerTest.java +++ b/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/staticapi/StaticAPIRefreshControllerTest.java @@ -10,6 +10,7 @@ package org.zowe.apiml.apicatalog.staticapi; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -25,6 +26,7 @@ import org.zowe.apiml.apicatalog.services.status.model.ServiceNotFoundException; import static org.hamcrest.Matchers.hasSize; +import static org.mockito.Mockito.reset; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; @@ -46,6 +48,11 @@ class StaticAPIRefreshControllerTest { @Autowired private StaticAPIService staticAPIService; + @BeforeEach + void setUp() { + reset(staticAPIService); + } + @Test void givenServiceNotFoundException_whenCallRefreshAPI_thenResponseShouldBe503WithSpecificMessage() throws Exception { when(staticAPIService.refresh()).thenThrow( diff --git a/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/staticapi/StaticApiContextConfiguration.java b/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/staticapi/StaticApiContextConfiguration.java index 0559baa523..128e43bfc9 100644 --- a/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/staticapi/StaticApiContextConfiguration.java +++ b/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/staticapi/StaticApiContextConfiguration.java @@ -10,15 +10,18 @@ package org.zowe.apiml.apicatalog.staticapi; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Bean; import org.zowe.apiml.message.core.MessageService; import org.zowe.apiml.message.yaml.YamlMessageService; +import static org.mockito.Mockito.mock; + public class StaticApiContextConfiguration { - @MockBean - private StaticAPIService staticAPIService; + @Bean + public StaticAPIService staticAPIService() { + return mock(StaticAPIService.class); + } @Bean public MessageService messageService() { @@ -31,12 +34,14 @@ public StaticAPIRefreshControllerExceptionHandler staticAPIRefreshControllerExce } @Bean - public StaticAPIRefreshController apiCatalogController() { + public StaticAPIRefreshController apiCatalogController(StaticAPIService staticAPIService) { return new StaticAPIRefreshController(staticAPIService); } - @MockBean - private StaticDefinitionGenerator staticDefinitionGenerator; + @Bean + public StaticDefinitionGenerator staticDefinitionGenerator() { + return mock(StaticDefinitionGenerator.class); + } @Bean public StaticDefinitionControllerExceptionHandler staticDefinitionControllerExceptionHandler(MessageService messageService) { @@ -44,7 +49,7 @@ public StaticDefinitionControllerExceptionHandler staticDefinitionControllerExce } @Bean - public StaticDefinitionController staticAPIRefreshController() { + public StaticDefinitionController staticAPIRefreshController(StaticDefinitionGenerator staticDefinitionGenerator) { return new StaticDefinitionController(staticDefinitionGenerator); } } diff --git a/api-catalog-ui/frontend/cypress/e2e/detail-page/swagger-rendering.cy.js b/api-catalog-ui/frontend/cypress/e2e/detail-page/swagger-rendering.cy.js index 7214f781d0..4d20a9cba4 100644 --- a/api-catalog-ui/frontend/cypress/e2e/detail-page/swagger-rendering.cy.js +++ b/api-catalog-ui/frontend/cypress/e2e/detail-page/swagger-rendering.cy.js @@ -93,7 +93,7 @@ describe("Swagger rendering", () => { .should('exist'); cy.get('@swaggerContainer') - .get('div.information-container > section > div > div.info > .main') + .get('div.information-container > section div.info .main') .as('mainInfo'); cy.get('@mainInfo').should('exist'); diff --git a/api-catalog-ui/frontend/package-lock.json b/api-catalog-ui/frontend/package-lock.json index 1a1dafffb3..3d7b55fe6b 100644 --- a/api-catalog-ui/frontend/package-lock.json +++ b/api-catalog-ui/frontend/package-lock.json @@ -52,7 +52,7 @@ "redux-persist-transform-filter": "0.0.22", "redux-thunk": "3.1.0", "rxjs": "7.8.1", - "sass": "1.83.1", + "sass": "1.83.4", "stream": "0.0.3", "swagger-ui-react": "5.18.2", "url": "0.11.4", @@ -61,28 +61,28 @@ }, "devDependencies": { "@babel/core": "7.26.0", - "@babel/eslint-parser": "7.25.9", + "@babel/eslint-parser": "7.26.5", "@babel/plugin-proposal-private-property-in-object": "7.21.11", "@babel/preset-env": "7.26.0", "@babel/preset-react": "7.26.3", "@cfaester/enzyme-adapter-react-18": "0.8.0", - "@eslint/compat": "1.2.4", - "@eslint/js": "9.17.0", + "@eslint/compat": "1.2.5", + "@eslint/js": "9.18.0", "@testing-library/dom": "10.4.0", "@testing-library/jest-dom": "6.6.3", - "@testing-library/react": "16.1.0", - "@testing-library/user-event": "14.5.2", + "@testing-library/react": "16.2.0", + "@testing-library/user-event": "14.6.0", "ajv": "8.17.1", "ansi-regex": "6.1.0", "body-parser": "1.20.3", - "caniuse-lite": "1.0.30001690", + "caniuse-lite": "1.0.30001692", "concurrently": "9.1.2", "cors": "2.8.5", "cross-env": "7.0.3", "cypress": "13.17.0", "cypress-file-upload": "5.0.8", "enzyme": "3.11.0", - "eslint": "9.17.0", + "eslint": "9.18.0", "eslint-config-airbnb": "19.0.4", "eslint-config-prettier": "9.1.0", "eslint-plugin-cypress": "4.1.0", @@ -90,8 +90,8 @@ "eslint-plugin-header": "3.1.1", "eslint-plugin-import": "2.31.0", "eslint-plugin-jsx-a11y": "6.10.2", - "eslint-plugin-prettier": "5.2.1", - "eslint-plugin-react": "7.37.3", + "eslint-plugin-prettier": "5.2.2", + "eslint-plugin-react": "7.37.4", "express": "4.21.2", "globals": "15.14.0", "html-loader": "5.1.0", @@ -115,7 +115,7 @@ "redux-mock-store": "1.5.5", "rimraf": "6.0.1", "source-map-explorer": "2.5.3", - "start-server-and-test": "2.0.9", + "start-server-and-test": "2.0.10", "tmpl": "1.0.5", "undici": "6.19.8", "yaml": "2.7.0" @@ -223,9 +223,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.25.9", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@babel/eslint-parser/-/eslint-parser-7.25.9.tgz", - "integrity": "sha512-5UXfgpK0j0Xr/xIdgdLEhOFxaDZ0bRPWJJchRpqOSur/3rZoPbqqki5mm0p4NE2cs28krBEiSM2MB7//afRSQQ==", + "version": "7.26.5", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@babel/eslint-parser/-/eslint-parser-7.26.5.tgz", + "integrity": "sha512-Kkm8C8uxI842AwQADxl0GbcG1rupELYLShazYEZO/2DYjhyWXJIOUVOE3tBYm6JXzUCNJOZEzqc4rCW/jsEQYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -242,13 +242,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.26.5", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -542,12 +542,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.26.5", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@babel/parser/-/parser-7.26.5.tgz", + "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.26.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -2207,16 +2207,16 @@ } }, "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.26.5", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@babel/traverse/-/traverse-7.26.5.tgz", + "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.5", "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/types": "^7.26.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2234,9 +2234,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.26.5", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@babel/types/-/types-7.26.5.tgz", + "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", @@ -2839,9 +2839,9 @@ } }, "node_modules/@eslint/compat": { - "version": "1.2.4", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@eslint/compat/-/compat-1.2.4.tgz", - "integrity": "sha512-S8ZdQj/N69YAtuqFt7653jwcvuUj131+6qGLUyDqfDg1OIoBQ66OCuXC473YQfO2AaxITTutiRQiDwoo7ZLYyg==", + "version": "1.2.5", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@eslint/compat/-/compat-1.2.5.tgz", + "integrity": "sha512-5iuG/StT+7OfvhoBHPlmxkPA9om6aDUFgmD4+mWKAGsYt4vCe8rypneG03AuseyRHBmcCLXQtIH5S26tIoggLg==", "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2871,9 +2871,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.9.1", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@eslint/core/-/core-0.9.1.tgz", - "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==", + "version": "0.10.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@eslint/core/-/core-0.10.0.tgz", + "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2954,9 +2954,9 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/@eslint/js": { - "version": "9.17.0", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@eslint/js/-/js-9.17.0.tgz", - "integrity": "sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==", + "version": "9.18.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@eslint/js/-/js-9.18.0.tgz", + "integrity": "sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==", "dev": true, "license": "MIT", "engines": { @@ -2964,12 +2964,12 @@ } }, "node_modules/@eslint/migrate-config": { - "version": "1.3.5", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@eslint/migrate-config/-/migrate-config-1.3.5.tgz", - "integrity": "sha512-0NpN+l8p5YE+xP7d0cVAPYFWyTa3msJ6Rkzfl95xmuGhlbiLwPblpaUtZOVmyo2In8KDtW1eoyDRRQ6X7ModsQ==", + "version": "1.3.6", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@eslint/migrate-config/-/migrate-config-1.3.6.tgz", + "integrity": "sha512-SahJ5U/EpBAHhnAPtdzokEral73bVe+/Bn8F5vqs5uBgXHsjhPjbYgsjstSR6qnS6Sl+Wbgi91Zp6UvG26mNpA==", "license": "Apache-2.0", "dependencies": { - "@eslint/compat": "^1.2.4", + "@eslint/compat": "^1.2.5", "@eslint/eslintrc": "^3.1.0", "camelcase": "^8.0.0", "recast": "^0.23.7" @@ -3004,12 +3004,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.4", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz", - "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==", + "version": "0.2.5", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz", + "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==", "dev": true, "license": "Apache-2.0", "dependencies": { + "@eslint/core": "^0.10.0", "levn": "^0.4.1" }, "engines": { @@ -6446,9 +6447,9 @@ } }, "node_modules/@testing-library/react": { - "version": "16.1.0", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@testing-library/react/-/react-16.1.0.tgz", - "integrity": "sha512-Q2ToPvg0KsVL0ohND9A3zLJWcOXXcO8IDu3fj11KhNt0UlCWyFyvnCIBkd12tidB2lkiVRG8VFqdhcqhqnAQtg==", + "version": "16.2.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@testing-library/react/-/react-16.2.0.tgz", + "integrity": "sha512-2cSskAvA1QNtKc8Y9VJQRv0tm3hLVgxRGDB+KYhIaPQJ1I+RHbhIXcM+zClKXzMes/wshsMVzf4B9vS4IZpqDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6474,9 +6475,9 @@ } }, "node_modules/@testing-library/user-event": { - "version": "14.5.2", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@testing-library/user-event/-/user-event-14.5.2.tgz", - "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", + "version": "14.6.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@testing-library/user-event/-/user-event-14.6.0.tgz", + "integrity": "sha512-+jsfK7kVJbqnCYtLTln8Ja/NmVrZRwBJHmHR9IxIVccMWSOZ6Oy0FkDJNeyVu4QSpMNmRfy10Xb76ObRDlWWBQ==", "dev": true, "license": "MIT", "engines": { @@ -8933,9 +8934,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001690", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", - "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "version": "1.0.30001692", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", + "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==", "funding": [ { "type": "opencollective", @@ -11570,19 +11571,19 @@ } }, "node_modules/eslint": { - "version": "9.17.0", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/eslint/-/eslint-9.17.0.tgz", - "integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==", + "version": "9.18.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/eslint/-/eslint-9.18.0.tgz", + "integrity": "sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.9.0", + "@eslint/core": "^0.10.0", "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.17.0", - "@eslint/plugin-kit": "^0.2.3", + "@eslint/js": "9.18.0", + "@eslint/plugin-kit": "^0.2.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.1", @@ -11904,10 +11905,11 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.2.1", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", - "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "version": "5.2.2", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.2.tgz", + "integrity": "sha512-1yI3/hf35wmlq66C8yOyrujQnel+v5l1Vop5Cl2I6ylyNTT1JbuUUnV3/41PzwTzcyDp/oF0jWE3HXvcH5AQOQ==", "dev": true, + "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.9.1" @@ -11934,9 +11936,9 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.37.3", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/eslint-plugin-react/-/eslint-plugin-react-7.37.3.tgz", - "integrity": "sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA==", + "version": "7.37.4", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz", + "integrity": "sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13979,9 +13981,10 @@ } }, "node_modules/graphql-ws": { - "version": "5.16.0", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/graphql-ws/-/graphql-ws-5.16.0.tgz", - "integrity": "sha512-Ju2RCU2dQMgSKtArPbEtsK5gNLnsQyTNIo/T7cZNp96niC1x0KdJNZV0TIoilceBPQwfb5itrGl8pkFeOUMl4A==", + "version": "5.16.2", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/graphql-ws/-/graphql-ws-5.16.2.tgz", + "integrity": "sha512-E1uccsZxt/96jH/OwmLPuXMACILs76pKF2i3W861LpKBCYtGIyPQGtWLuBLkND4ox1KHns70e83PS4te50nvPQ==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -26729,7 +26732,7 @@ }, "node_modules/rollup": { "version": "2.79.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/rollup/-/rollup-2.79.2.tgz", "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "dev": true, "bin": { @@ -27205,9 +27208,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.83.1", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/sass/-/sass-1.83.1.tgz", - "integrity": "sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA==", + "version": "1.83.4", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/sass/-/sass-1.83.4.tgz", + "integrity": "sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA==", "license": "MIT", "dependencies": { "chokidar": "^4.0.0", @@ -27284,12 +27287,12 @@ "license": "MIT" }, "node_modules/sass/node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "version": "4.1.1", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/readdirp/-/readdirp-4.1.1.tgz", + "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", "license": "MIT", "engines": { - "node": ">= 14.16.0" + "node": ">= 14.18.0" }, "funding": { "type": "individual", @@ -28364,9 +28367,9 @@ "dev": true }, "node_modules/start-server-and-test": { - "version": "2.0.9", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/start-server-and-test/-/start-server-and-test-2.0.9.tgz", - "integrity": "sha512-DDceIvc4wdpr+z3Aqkot2QMho8TcUBh5qH0wEHDpEexBTzlheOcmh53d3dExABY4J5C7qS2UbSXqRWLtxpbWIQ==", + "version": "2.0.10", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/start-server-and-test/-/start-server-and-test-2.0.10.tgz", + "integrity": "sha512-nZphcfcqGqwk74lbZkqSwClkYz+M5ZPGOMgWxNVJrdztPKN96qe6HooRu6L3TpwITn0lKJJdKACqHbJtqythOQ==", "dev": true, "license": "MIT", "dependencies": { @@ -28377,7 +28380,7 @@ "execa": "5.1.1", "lazy-ass": "1.6.0", "ps-tree": "1.2.0", - "wait-on": "8.0.1" + "wait-on": "8.0.2" }, "bin": { "server-test": "src/bin/start.js", @@ -29825,10 +29828,11 @@ } }, "node_modules/tough-cookie": { - "version": "5.0.0", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/tough-cookie/-/tough-cookie-5.0.0.tgz", - "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", + "version": "5.1.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/tough-cookie/-/tough-cookie-5.1.0.tgz", + "integrity": "sha512-rvZUv+7MoBYTiDmFPBrhL7Ujx9Sk+q9wwm22x8c8T5IJaR+Wsyc7TNxbVxo84kZoRJZZMazowFLqpankBEQrGg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "tldts": "^6.1.32" }, @@ -30644,12 +30648,13 @@ } }, "node_modules/wait-on": { - "version": "8.0.1", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/wait-on/-/wait-on-8.0.1.tgz", - "integrity": "sha512-1wWQOyR2LVVtaqrcIL2+OM+x7bkpmzVROa0Nf6FryXkS+er5Sa1kzFGjzZRqLnHa3n1rACFLeTwUqE1ETL9Mig==", + "version": "8.0.2", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/wait-on/-/wait-on-8.0.2.tgz", + "integrity": "sha512-qHlU6AawrgAIHlueGQHQ+ETcPLAauXbnoTKl3RKq20W0T8x0DKVAo5xWIYjHSyvHxQlcYbFdR0jp4T9bDVITFA==", "dev": true, + "license": "MIT", "dependencies": { - "axios": "^1.7.7", + "axios": "^1.7.9", "joi": "^17.13.3", "lodash": "^4.17.21", "minimist": "^1.2.8", diff --git a/api-catalog-ui/frontend/package.json b/api-catalog-ui/frontend/package.json index 014eda5a45..581d7a16d3 100644 --- a/api-catalog-ui/frontend/package.json +++ b/api-catalog-ui/frontend/package.json @@ -48,7 +48,7 @@ "redux-persist-transform-filter": "0.0.22", "redux-thunk": "3.1.0", "rxjs": "7.8.1", - "sass": "1.83.1", + "sass": "1.83.4", "stream": "0.0.3", "swagger-ui-react": "5.18.2", "url": "0.11.4", @@ -81,28 +81,28 @@ }, "devDependencies": { "@babel/core": "7.26.0", - "@babel/eslint-parser": "7.25.9", + "@babel/eslint-parser": "7.26.5", "@babel/plugin-proposal-private-property-in-object": "7.21.11", "@babel/preset-env": "7.26.0", "@babel/preset-react": "7.26.3", "@cfaester/enzyme-adapter-react-18": "0.8.0", - "@eslint/compat": "1.2.4", - "@eslint/js": "9.17.0", + "@eslint/compat": "1.2.5", + "@eslint/js": "9.18.0", "@testing-library/dom": "10.4.0", "@testing-library/jest-dom": "6.6.3", - "@testing-library/react": "16.1.0", - "@testing-library/user-event": "14.5.2", + "@testing-library/react": "16.2.0", + "@testing-library/user-event": "14.6.0", "ajv": "8.17.1", "ansi-regex": "6.1.0", "body-parser": "1.20.3", - "caniuse-lite": "1.0.30001690", + "caniuse-lite": "1.0.30001692", "concurrently": "9.1.2", "cors": "2.8.5", "cross-env": "7.0.3", "cypress": "13.17.0", "cypress-file-upload": "5.0.8", "enzyme": "3.11.0", - "eslint": "9.17.0", + "eslint": "9.18.0", "eslint-config-airbnb": "19.0.4", "eslint-config-prettier": "9.1.0", "eslint-plugin-cypress": "4.1.0", @@ -110,8 +110,8 @@ "eslint-plugin-header": "3.1.1", "eslint-plugin-import": "2.31.0", "eslint-plugin-jsx-a11y": "6.10.2", - "eslint-plugin-prettier": "5.2.1", - "eslint-plugin-react": "7.37.3", + "eslint-plugin-prettier": "5.2.2", + "eslint-plugin-react": "7.37.4", "express": "4.21.2", "globals": "15.14.0", "html-loader": "5.1.0", @@ -135,7 +135,7 @@ "redux-mock-store": "1.5.5", "rimraf": "6.0.1", "source-map-explorer": "2.5.3", - "start-server-and-test": "2.0.9", + "start-server-and-test": "2.0.10", "tmpl": "1.0.5", "undici": "6.19.8", "yaml": "2.7.0" @@ -145,12 +145,12 @@ "jsdom": "16.7.0", "got": "14.4.5", "react-error-overlay": "6.0.11", - "tough-cookie": "5.0.0", + "tough-cookie": "5.1.0", "@braintree/sanitize-url": "7.1.1", "resolve-url-loader": "5.0.0", "lodash": "4.17.21", "semver": "7.6.3", - "@babel/traverse": "7.26.4", + "@babel/traverse": "7.26.5", "axios": "1.7.9" }, "engines": { diff --git a/apiml-common/src/main/java/org/zowe/apiml/product/web/DiscoveryRestTemplateConfig.java b/apiml-common/src/main/java/org/zowe/apiml/product/web/DiscoveryRestTemplateConfig.java index 8991ced61f..888c7fb61e 100644 --- a/apiml-common/src/main/java/org/zowe/apiml/product/web/DiscoveryRestTemplateConfig.java +++ b/apiml-common/src/main/java/org/zowe/apiml/product/web/DiscoveryRestTemplateConfig.java @@ -12,12 +12,13 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; -import org.springframework.cloud.netflix.eureka.RestTemplateTimeoutProperties; +import org.springframework.cloud.netflix.eureka.RestClientTimeoutProperties; import org.springframework.cloud.netflix.eureka.http.DefaultEurekaClientHttpRequestFactorySupplier; -import org.springframework.cloud.netflix.eureka.http.RestTemplateDiscoveryClientOptionalArgs; -import org.springframework.cloud.netflix.eureka.http.RestTemplateTransportClientFactories; +import org.springframework.cloud.netflix.eureka.http.RestClientDiscoveryClientOptionalArgs; +import org.springframework.cloud.netflix.eureka.http.RestClientTransportClientFactories; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestClient; import org.zowe.apiml.message.log.ApimlLogger; import org.zowe.apiml.message.yaml.YamlMessageServiceInstance; @@ -30,15 +31,16 @@ public class DiscoveryRestTemplateConfig { private static final ApimlLogger apimlLog = ApimlLogger.of(DiscoveryRestTemplateConfig.class, YamlMessageServiceInstance.getInstance()); @Bean - public RestTemplateTransportClientFactories restTemplateTransportClientFactories(RestTemplateDiscoveryClientOptionalArgs restTemplateDiscoveryClientOptionalArgs) { - return new RestTemplateTransportClientFactories(restTemplateDiscoveryClientOptionalArgs); + public RestClientTransportClientFactories restTemplateTransportClientFactories(RestClientDiscoveryClientOptionalArgs restClientDiscoveryClientOptionalArgs) { + return new RestClientTransportClientFactories(restClientDiscoveryClientOptionalArgs); } @Bean - public RestTemplateDiscoveryClientOptionalArgs defaultArgs(@Value("${eureka.client.serviceUrl.defaultZone}") String eurekaServerUrl, - @Qualifier("secureSslContext") SSLContext secureSslContext, - HostnameVerifier secureHostnameVerifier) { - RestTemplateDiscoveryClientOptionalArgs clientArgs = new RestTemplateDiscoveryClientOptionalArgs(getDefaultEurekaClientHttpRequestFactorySupplier()); + public RestClientDiscoveryClientOptionalArgs defaultArgs(@Value("${eureka.client.serviceUrl.defaultZone}") String eurekaServerUrl, + @Qualifier("secureSslContext") SSLContext secureSslContext, + HostnameVerifier secureHostnameVerifier + ) { + RestClientDiscoveryClientOptionalArgs clientArgs = new RestClientDiscoveryClientOptionalArgs(getDefaultEurekaClientHttpRequestFactorySupplier(), RestClient::builder); if (eurekaServerUrl.startsWith("http://")) { apimlLog.log("org.zowe.apiml.common.insecureHttpWarning"); @@ -51,7 +53,7 @@ public RestTemplateDiscoveryClientOptionalArgs defaultArgs(@Value("${eureka.clie } private static DefaultEurekaClientHttpRequestFactorySupplier getDefaultEurekaClientHttpRequestFactorySupplier() { - RestTemplateTimeoutProperties properties = new RestTemplateTimeoutProperties(); + RestClientTimeoutProperties properties = new RestClientTimeoutProperties(); properties.setConnectTimeout(180000); properties.setConnectRequestTimeout(180000); properties.setSocketTimeout(180000); diff --git a/apiml-common/src/test/java/org/zowe/apiml/product/gateway/GatewayInstanceInitializerTest.java b/apiml-common/src/test/java/org/zowe/apiml/product/gateway/GatewayInstanceInitializerTest.java index d772f87ebd..e1a62fe473 100644 --- a/apiml-common/src/test/java/org/zowe/apiml/product/gateway/GatewayInstanceInitializerTest.java +++ b/apiml-common/src/test/java/org/zowe/apiml/product/gateway/GatewayInstanceInitializerTest.java @@ -18,7 +18,6 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Bean; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -29,9 +28,8 @@ import java.util.Collections; import static java.time.Duration.ofMillis; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTimeout; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @ExtendWith(SpringExtension.class) @@ -79,8 +77,10 @@ void testInit() { @TestConfiguration static class TestConfig { - @MockBean - private EurekaClient eurekaClient; + @Bean + public EurekaClient eurekaClient() { + return mock(EurekaClient.class); + } @Bean public GatewayClient gatewayClient() { @@ -88,16 +88,16 @@ public GatewayClient gatewayClient() { } @Bean - public InstanceLookupExecutor instanceLookupExecutor() { + public InstanceLookupExecutor instanceLookupExecutor(EurekaClient eurekaClient) { return new InstanceLookupExecutor( eurekaClient ); } @Bean - public GatewayInstanceInitializer gatewayInstanceInitializer(ApplicationEventPublisher applicationEventPublisher) { + public GatewayInstanceInitializer gatewayInstanceInitializer(ApplicationEventPublisher applicationEventPublisher, EurekaClient eurekaClient) { return new GatewayInstanceInitializer( - instanceLookupExecutor(), + instanceLookupExecutor(eurekaClient), applicationEventPublisher, gatewayClient() ); diff --git a/apiml-extension-loader/src/test/java/org/zowe/apiml/extension/ExtensionsLoaderTest.java b/apiml-extension-loader/src/test/java/org/zowe/apiml/extension/ExtensionsLoaderTest.java index d69a6c88bf..5e363c55ad 100644 --- a/apiml-extension-loader/src/test/java/org/zowe/apiml/extension/ExtensionsLoaderTest.java +++ b/apiml-extension-loader/src/test/java/org/zowe/apiml/extension/ExtensionsLoaderTest.java @@ -18,7 +18,6 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.context.event.ApplicationContextInitializedEvent; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; @@ -27,6 +26,7 @@ import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestContextManager; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.util.ReflectionTestUtils; import org.zowe.CustomBean; @@ -43,10 +43,10 @@ class ExtensionsLoaderTest { @Autowired private ApplicationEventPublisher publisher; - @MockBean + @MockitoBean private ExtensionsLoader extensionsLoader; - @MockBean + @MockitoBean private ExtensionConfigReader reader; @AfterEach diff --git a/apiml-security-common/src/test/java/org/zowe/apiml/security/common/verify/CertificateValidatorTest.java b/apiml-security-common/src/test/java/org/zowe/apiml/security/common/verify/CertificateValidatorTest.java index cad41bc1e0..fde6fa6ecd 100644 --- a/apiml-security-common/src/test/java/org/zowe/apiml/security/common/verify/CertificateValidatorTest.java +++ b/apiml-security-common/src/test/java/org/zowe/apiml/security/common/verify/CertificateValidatorTest.java @@ -15,9 +15,9 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.util.ReflectionTestUtils; import org.zowe.apiml.security.common.utils.X509Utils; @@ -129,9 +129,11 @@ void whenAllCertificatesFoundThenTheyAreTrusted() { @Nested @Import(CertificateValidator.class) - @MockBean(TrustedCertificatesProvider.class) class Configuration { + @MockitoBean + private TrustedCertificatesProvider trustedCertificatesProvider; + @Nested @TestPropertySource(properties = { "apiml.security.x509.certificatesUrl=url1" diff --git a/build.gradle b/build.gradle index a22cfd66c9..40bea34ef7 100644 --- a/build.gradle +++ b/build.gradle @@ -98,9 +98,6 @@ allprojects { configurations.all { resolutionStrategy.dependencySubstitution { substitute(module('javax.servlet:servlet-api')).using(module('javax.servlet:javax.servlet-api:4.0.1')) - // netty reactor contains a bug: https://github.com/reactor/reactor-netty/issues/3559 > https://github.com/reactor/reactor-netty/pull/3581 - substitute(module('io.projectreactor.netty:reactor-netty-core')).using(module('io.projectreactor.netty:reactor-netty-core:1.1.23')) - substitute(module('io.projectreactor.netty:reactor-netty-http')).using(module('io.projectreactor.netty:reactor-netty-http:1.1.23')) } } @@ -112,7 +109,8 @@ configure(subprojects.findAll { it.name in [ 'caching-service', 'discovery-service', 'gateway-service', - 'zaas-service' + 'zaas-service', + 'integration-tests' ]}) { configurations.all { diff --git a/common-service-core/src/main/java/org/zowe/apiml/util/CorsUtils.java b/common-service-core/src/main/java/org/zowe/apiml/util/CorsUtils.java index c38b594312..97e0f83184 100644 --- a/common-service-core/src/main/java/org/zowe/apiml/util/CorsUtils.java +++ b/common-service-core/src/main/java/org/zowe/apiml/util/CorsUtils.java @@ -27,7 +27,7 @@ public class CorsUtils { private static final List allowedCorsHttpMethods; private final boolean corsEnabled; private final List allowedOrigins; - private static final Pattern gatewayRoutesPattern = Pattern.compile("apiml\\.routes.*.gateway\\S*"); + private static final Pattern gatewayRoutesPattern = Pattern.compile("apiml\\.routes\\.[^.]*\\.gateway\\S*"); private static final List CORS_ENABLED_ENDPOINTS = Arrays.asList("/*/*/gateway/**", "/gateway/*/*/**", "/gateway/version"); diff --git a/discoverable-client/src/test/java/org/zowe/apiml/client/api/ApiMediationClientTestControllerTest.java b/discoverable-client/src/test/java/org/zowe/apiml/client/api/ApiMediationClientTestControllerTest.java index f3955d0a1a..5ef213e374 100644 --- a/discoverable-client/src/test/java/org/zowe/apiml/client/api/ApiMediationClientTestControllerTest.java +++ b/discoverable-client/src/test/java/org/zowe/apiml/client/api/ApiMediationClientTestControllerTest.java @@ -10,13 +10,12 @@ package org.zowe.apiml.client.api; -import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.Test; - +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; import org.zowe.apiml.client.configuration.SecurityConfiguration; @@ -37,7 +36,7 @@ class ApiMediationClientTestControllerTest { @Autowired private MockMvc mockMvc; - @MockBean + @MockitoBean private ApiMediationClientService apiMediationClientService; @Test diff --git a/discoverable-client/src/test/java/org/zowe/apiml/client/api/PetControllerDeleteTest.java b/discoverable-client/src/test/java/org/zowe/apiml/client/api/PetControllerDeleteTest.java index 730f440ac1..fcb9895766 100644 --- a/discoverable-client/src/test/java/org/zowe/apiml/client/api/PetControllerDeleteTest.java +++ b/discoverable-client/src/test/java/org/zowe/apiml/client/api/PetControllerDeleteTest.java @@ -14,8 +14,8 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; import org.zowe.apiml.client.configuration.ApplicationConfiguration; @@ -34,7 +34,7 @@ class PetControllerDeleteTest { @Autowired private MockMvc mockMvc; - @MockBean + @MockitoBean private PetService petService; @Test diff --git a/discoverable-client/src/test/java/org/zowe/apiml/client/api/PetControllerGetAllTest.java b/discoverable-client/src/test/java/org/zowe/apiml/client/api/PetControllerGetAllTest.java index 2a6d661a8a..410df69a42 100644 --- a/discoverable-client/src/test/java/org/zowe/apiml/client/api/PetControllerGetAllTest.java +++ b/discoverable-client/src/test/java/org/zowe/apiml/client/api/PetControllerGetAllTest.java @@ -14,8 +14,8 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; import org.zowe.apiml.client.configuration.ApplicationConfiguration; @@ -41,7 +41,7 @@ class PetControllerGetAllTest { @Autowired private MockMvc mockMvc; - @MockBean + @MockitoBean private PetService petService; @Test diff --git a/discoverable-client/src/test/java/org/zowe/apiml/client/api/PetControllerGetOneTest.java b/discoverable-client/src/test/java/org/zowe/apiml/client/api/PetControllerGetOneTest.java index 847482ee5d..b92863fc1c 100644 --- a/discoverable-client/src/test/java/org/zowe/apiml/client/api/PetControllerGetOneTest.java +++ b/discoverable-client/src/test/java/org/zowe/apiml/client/api/PetControllerGetOneTest.java @@ -14,8 +14,8 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; import org.zowe.apiml.client.configuration.ApplicationConfiguration; @@ -38,7 +38,7 @@ class PetControllerGetOneTest { @Autowired private MockMvc mockMvc; - @MockBean + @MockitoBean private PetService petService; @Test diff --git a/discoverable-client/src/test/java/org/zowe/apiml/client/api/PetControllerPostPetTest.java b/discoverable-client/src/test/java/org/zowe/apiml/client/api/PetControllerPostPetTest.java index 515a8524cc..3496165585 100644 --- a/discoverable-client/src/test/java/org/zowe/apiml/client/api/PetControllerPostPetTest.java +++ b/discoverable-client/src/test/java/org/zowe/apiml/client/api/PetControllerPostPetTest.java @@ -10,27 +10,24 @@ package org.zowe.apiml.client.api; -import org.zowe.apiml.client.configuration.ApplicationConfiguration; -import org.zowe.apiml.client.configuration.SecurityConfiguration; -import org.zowe.apiml.client.configuration.SpringComponentsConfiguration; -import org.zowe.apiml.client.model.Pet; -import org.zowe.apiml.client.service.PetService; import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; import org.springframework.http.MediaType; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; +import org.zowe.apiml.client.configuration.ApplicationConfiguration; +import org.zowe.apiml.client.configuration.SecurityConfiguration; +import org.zowe.apiml.client.configuration.SpringComponentsConfiguration; +import org.zowe.apiml.client.model.Pet; +import org.zowe.apiml.client.service.PetService; import static org.hamcrest.core.Is.is; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; +import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -42,7 +39,7 @@ class PetControllerPostPetTest { @Autowired private MockMvc mockMvc; - @MockBean + @MockitoBean private PetService petService; private final ObjectMapper mapper = new ObjectMapper(); diff --git a/discoverable-client/src/test/java/org/zowe/apiml/client/api/PetControllerPutTest.java b/discoverable-client/src/test/java/org/zowe/apiml/client/api/PetControllerPutTest.java index 06b3da3098..bfad386364 100644 --- a/discoverable-client/src/test/java/org/zowe/apiml/client/api/PetControllerPutTest.java +++ b/discoverable-client/src/test/java/org/zowe/apiml/client/api/PetControllerPutTest.java @@ -10,30 +10,26 @@ package org.zowe.apiml.client.api; -import org.zowe.apiml.client.configuration.ApplicationConfiguration; -import org.zowe.apiml.client.configuration.SecurityConfiguration; -import org.zowe.apiml.client.configuration.SpringComponentsConfiguration; -import org.zowe.apiml.client.model.Pet; -import org.zowe.apiml.client.service.PetService; import com.fasterxml.jackson.databind.ObjectMapper; import org.json.JSONObject; -import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; import org.springframework.http.MediaType; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; +import org.zowe.apiml.client.configuration.ApplicationConfiguration; +import org.zowe.apiml.client.configuration.SecurityConfiguration; +import org.zowe.apiml.client.configuration.SpringComponentsConfiguration; +import org.zowe.apiml.client.model.Pet; +import org.zowe.apiml.client.service.PetService; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.core.Is.is; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; +import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -45,7 +41,7 @@ class PetControllerPutTest { @Autowired private MockMvc mockMvc; - @MockBean + @MockitoBean private PetService petService; private final ObjectMapper mapper = new ObjectMapper(); diff --git a/discoverable-client/src/test/java/org/zowe/apiml/client/api/ZaasClientTestControllerTest.java b/discoverable-client/src/test/java/org/zowe/apiml/client/api/ZaasClientTestControllerTest.java index 0459e955de..94aa917d0f 100644 --- a/discoverable-client/src/test/java/org/zowe/apiml/client/api/ZaasClientTestControllerTest.java +++ b/discoverable-client/src/test/java/org/zowe/apiml/client/api/ZaasClientTestControllerTest.java @@ -11,12 +11,13 @@ package org.zowe.apiml.client.api; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.Cookie; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; import org.springframework.http.MediaType; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.support.AnnotationConfigContextLoader; import org.springframework.test.web.servlet.MockMvc; import org.zowe.apiml.client.configuration.ApplicationConfiguration; @@ -26,8 +27,6 @@ import org.zowe.apiml.zaasclient.exception.ZaasClientException; import org.zowe.apiml.zaasclient.service.ZaasClient; -import jakarta.servlet.http.Cookie; - import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; @@ -41,7 +40,7 @@ class ZaasClientTestControllerTest { private final ObjectMapper mapper = new ObjectMapper(); - @MockBean + @MockitoBean private ZaasClient zaasClient; private static final String TOKEN_PREFIX = "apimlAuthenticationToken"; diff --git a/gateway-service/src/main/java/org/zowe/apiml/gateway/config/ConnectionsConfig.java b/gateway-service/src/main/java/org/zowe/apiml/gateway/config/ConnectionsConfig.java index 9bd6978b7f..2f4795057f 100644 --- a/gateway-service/src/main/java/org/zowe/apiml/gateway/config/ConnectionsConfig.java +++ b/gateway-service/src/main/java/org/zowe/apiml/gateway/config/ConnectionsConfig.java @@ -36,27 +36,27 @@ import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JConfigBuilder; import org.springframework.cloud.client.circuitbreaker.Customizer; import org.springframework.cloud.context.config.annotation.RefreshScope; -import org.springframework.cloud.gateway.config.*; +import org.springframework.cloud.gateway.config.HttpClientCustomizer; +import org.springframework.cloud.gateway.config.HttpClientFactory; +import org.springframework.cloud.gateway.config.HttpClientProperties; +import org.springframework.cloud.gateway.config.HttpClientSslConfigurer; import org.springframework.cloud.gateway.filter.headers.HttpHeadersFilter; -import org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping; import org.springframework.cloud.netflix.eureka.CloudEurekaClient; import org.springframework.cloud.netflix.eureka.EurekaClientConfigBean; -import org.springframework.cloud.netflix.eureka.RestTemplateTimeoutProperties; +import org.springframework.cloud.netflix.eureka.RestClientTimeoutProperties; import org.springframework.cloud.netflix.eureka.http.DefaultEurekaClientHttpRequestFactorySupplier; -import org.springframework.cloud.netflix.eureka.http.RestTemplateDiscoveryClientOptionalArgs; -import org.springframework.cloud.netflix.eureka.http.RestTemplateTransportClientFactories; +import org.springframework.cloud.netflix.eureka.http.RestClientDiscoveryClientOptionalArgs; +import org.springframework.cloud.netflix.eureka.http.RestClientTransportClientFactories; import org.springframework.cloud.util.ProxyUtils; import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Conditional; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.*; import org.springframework.http.client.reactive.ReactorClientHttpConnector; import org.springframework.util.CollectionUtils; -import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource; +import org.springframework.web.client.RestClient; +import org.springframework.web.cors.reactive.CorsWebFilter; import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.server.WebFilter; import org.springframework.web.util.UriComponentsBuilder; -import org.springframework.web.util.pattern.PathPatternParser; import org.zowe.apiml.config.AdditionalRegistration; import org.zowe.apiml.config.AdditionalRegistrationCondition; import org.zowe.apiml.config.AdditionalRegistrationParser; @@ -270,23 +270,23 @@ public CloudEurekaClient primaryEurekaClient(ApplicationInfoManager manager, Eur } else { appManager = manager; } - RestTemplateDiscoveryClientOptionalArgs args1 = defaultArgs(getDefaultEurekaClientHttpRequestFactorySupplier()); - RestTemplateTransportClientFactories factories = new RestTemplateTransportClientFactories(args1); + RestClientDiscoveryClientOptionalArgs args1 = defaultArgs(getDefaultEurekaClientHttpRequestFactorySupplier()); + RestClientTransportClientFactories factories = new RestClientTransportClientFactories(args1); final CloudEurekaClient cloudEurekaClient = new CloudEurekaClient(appManager, config, factories, args1, this.context); cloudEurekaClient.registerHealthCheck(healthCheckHandler); return cloudEurekaClient; } private static DefaultEurekaClientHttpRequestFactorySupplier getDefaultEurekaClientHttpRequestFactorySupplier() { - RestTemplateTimeoutProperties properties = new RestTemplateTimeoutProperties(); + RestClientTimeoutProperties properties = new RestClientTimeoutProperties(); properties.setConnectTimeout(180000); properties.setConnectRequestTimeout(180000); properties.setSocketTimeout(180000); return new DefaultEurekaClientHttpRequestFactorySupplier(properties); } - public RestTemplateDiscoveryClientOptionalArgs defaultArgs(DefaultEurekaClientHttpRequestFactorySupplier factorySupplier) { - RestTemplateDiscoveryClientOptionalArgs clientArgs = new RestTemplateDiscoveryClientOptionalArgs(factorySupplier); + public RestClientDiscoveryClientOptionalArgs defaultArgs(DefaultEurekaClientHttpRequestFactorySupplier factorySupplier) { + RestClientDiscoveryClientOptionalArgs clientArgs = new RestClientDiscoveryClientOptionalArgs(factorySupplier, RestClient::builder); if (eurekaServerUrl.startsWith("http://")) { apimlLog.log("org.zowe.apiml.common.insecureHttpWarning"); @@ -299,6 +299,7 @@ public RestTemplateDiscoveryClientOptionalArgs defaultArgs(DefaultEurekaClientHt } @Bean + @DependsOn("discoveryClient") public List additionalRegistration() { List additionalRegistrations = new AdditionalRegistrationParser().extractAdditionalRegistrations(System.getenv()); log.debug("Parsed {} additional registration: {}", additionalRegistrations.size(), additionalRegistrations); @@ -337,8 +338,8 @@ private CloudEurekaClient registerInTheApimlInstance(EurekaClientConfig config, updateMetadata(newInfo, apimlRegistration); - RestTemplateDiscoveryClientOptionalArgs args1 = defaultArgs(getDefaultEurekaClientHttpRequestFactorySupplier()); - RestTemplateTransportClientFactories factories = new RestTemplateTransportClientFactories(args1); + RestClientDiscoveryClientOptionalArgs args1 = defaultArgs(getDefaultEurekaClientHttpRequestFactorySupplier()); + RestClientTransportClientFactories factories = new RestClientTransportClientFactories(args1); return eurekaFactory.createCloudEurekaClient(new AdditionalEurekaConfiguration(eurekaInstanceConfig, newInfo), newInfo, configBean, context, factories, args1); } @@ -408,17 +409,13 @@ public WebClient webClientClientCert(HttpClient httpClient) { } @Bean - public UrlBasedCorsConfigurationSource corsConfigurationSource(RoutePredicateHandlerMapping handlerMapping, GlobalCorsProperties globalCorsProperties, CorsUtils corsUtils) { - UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser()); - source.setCorsConfigurations(globalCorsProperties.getCorsConfigurations()); - corsUtils.registerDefaultCorsConfiguration(source::registerCorsConfiguration); - handlerMapping.setCorsConfigurationSource(source); - return source; + public CorsUtils corsUtils() { + return new CorsUtils(corsEnabled, null); } @Bean - public CorsUtils corsUtils() { - return new CorsUtils(corsEnabled, null); + public WebFilter corsWebFilter(ServiceCorsUpdater serviceCorsUpdater) { + return new CorsWebFilter(serviceCorsUpdater.getUrlBasedCorsConfigurationSource()); } public InstanceInfo create(EurekaInstanceConfig config) { diff --git a/gateway-service/src/main/java/org/zowe/apiml/gateway/config/DiscoveryClientOrderProcessorBean.java b/gateway-service/src/main/java/org/zowe/apiml/gateway/config/DiscoveryClientOrderProcessorBean.java new file mode 100644 index 0000000000..df09e145d8 --- /dev/null +++ b/gateway-service/src/main/java/org/zowe/apiml/gateway/config/DiscoveryClientOrderProcessorBean.java @@ -0,0 +1,37 @@ +/* + * This program and the accompanying materials are made available under the terms of the + * Eclipse Public License v2.0 which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v20.html + * + * SPDX-License-Identifier: EPL-2.0 + * + * Copyright Contributors to the Zowe Project. + */ + +package org.zowe.apiml.gateway.config; + +import com.netflix.discovery.EurekaClient; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.netflix.eureka.CloudEurekaClient; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.stream.Stream; + +@Component +public class DiscoveryClientOrderProcessorBean implements BeanFactoryPostProcessor { + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + Stream.of(DiscoveryClient.class, EurekaClient.class, CloudEurekaClient.class) + .map(beanFactory::getBeanNamesForType) + .flatMap(Arrays::stream) + .distinct() + .map(beanFactory::getBeanDefinition) + .forEach(bd -> bd.setDependsOn("gatewayLoadBalancerClientFilter", "eurekaAutoServiceRegistration")); + } + +} diff --git a/gateway-service/src/main/java/org/zowe/apiml/gateway/config/EurekaFactory.java b/gateway-service/src/main/java/org/zowe/apiml/gateway/config/EurekaFactory.java index bc90787fcf..6edb4fd00a 100644 --- a/gateway-service/src/main/java/org/zowe/apiml/gateway/config/EurekaFactory.java +++ b/gateway-service/src/main/java/org/zowe/apiml/gateway/config/EurekaFactory.java @@ -16,8 +16,8 @@ import org.springframework.cloud.netflix.eureka.CloudEurekaClient; import org.springframework.cloud.netflix.eureka.EurekaClientConfigBean; import org.springframework.cloud.netflix.eureka.InstanceInfoFactory; -import org.springframework.cloud.netflix.eureka.http.RestTemplateDiscoveryClientOptionalArgs; -import org.springframework.cloud.netflix.eureka.http.RestTemplateTransportClientFactories; +import org.springframework.cloud.netflix.eureka.http.RestClientDiscoveryClientOptionalArgs; +import org.springframework.cloud.netflix.eureka.http.RestClientTransportClientFactories; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; @@ -36,7 +36,7 @@ InstanceInfo createInstanceInfo(EurekaInstanceConfig instanceConfig) { return new InstanceInfoFactory().create(instanceConfig); } - public CloudEurekaClient createCloudEurekaClient(EurekaInstanceConfig eurekaInstanceConfig, InstanceInfo newInfo, EurekaClientConfigBean configBean, ApplicationContext context, RestTemplateTransportClientFactories factories, RestTemplateDiscoveryClientOptionalArgs args1) { + public CloudEurekaClient createCloudEurekaClient(EurekaInstanceConfig eurekaInstanceConfig, InstanceInfo newInfo, EurekaClientConfigBean configBean, ApplicationContext context, RestClientTransportClientFactories factories, RestClientDiscoveryClientOptionalArgs args1) { ApplicationInfoManager perClientAppManager = new ApplicationInfoManager(eurekaInstanceConfig, newInfo, null); return new CloudEurekaClient(perClientAppManager, configBean, factories, args1, context); } diff --git a/gateway-service/src/main/java/org/zowe/apiml/gateway/config/ServiceCorsUpdater.java b/gateway-service/src/main/java/org/zowe/apiml/gateway/config/ServiceCorsUpdater.java new file mode 100644 index 0000000000..b452aa7943 --- /dev/null +++ b/gateway-service/src/main/java/org/zowe/apiml/gateway/config/ServiceCorsUpdater.java @@ -0,0 +1,67 @@ +/* + * This program and the accompanying materials are made available under the terms of the + * Eclipse Public License v2.0 which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v20.html + * + * SPDX-License-Identifier: EPL-2.0 + * + * Copyright Contributors to the Zowe Project. + */ + +package org.zowe.apiml.gateway.config; + +import jakarta.annotation.PostConstruct; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient; +import org.springframework.cloud.gateway.config.GlobalCorsProperties; +import org.springframework.cloud.gateway.event.RefreshRoutesEvent; +import org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; +import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource; +import org.springframework.web.util.pattern.PathPatternParser; +import org.zowe.apiml.util.CorsUtils; +import reactor.core.publisher.Flux; + +import static org.zowe.apiml.constants.EurekaMetadataDefinition.APIML_ID; + +@Component +@RequiredArgsConstructor +public class ServiceCorsUpdater { + + private final CorsUtils corsUtils; + private final ReactiveDiscoveryClient discoveryClient; + private final RoutePredicateHandlerMapping handlerMapping; + private final GlobalCorsProperties globalCorsProperties; + + @Getter + private UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource; + + @PostConstruct + void initCorsConfigurationSource() { + urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource(new PathPatternParser()); + urlBasedCorsConfigurationSource.setCorsConfigurations(globalCorsProperties.getCorsConfigurations()); + corsUtils.registerDefaultCorsConfiguration(urlBasedCorsConfigurationSource::registerCorsConfiguration); + handlerMapping.setCorsConfigurationSource(urlBasedCorsConfigurationSource); + } + + @EventListener(RefreshRoutesEvent.class) + public void onRefreshRoutesEvent(RefreshRoutesEvent event) { + discoveryClient.getServices() + .flatMap(service -> discoveryClient.getInstances(service).collectList()) + .flatMap(Flux::fromIterable) + .toIterable() + .forEach(serviceInstance -> + corsUtils.setCorsConfiguration( + serviceInstance.getServiceId().toLowerCase(), + serviceInstance.getMetadata(), + (prefix, serviceId, config) -> { + serviceId = serviceInstance.getMetadata().getOrDefault(APIML_ID, serviceInstance.getServiceId().toLowerCase()); + urlBasedCorsConfigurationSource.registerCorsConfiguration("/" + serviceId + "/**", config); + } + ) + ); + } + +} diff --git a/gateway-service/src/main/java/org/zowe/apiml/gateway/service/RouteLocator.java b/gateway-service/src/main/java/org/zowe/apiml/gateway/service/RouteLocator.java index 102083dc49..bdaab76932 100644 --- a/gateway-service/src/main/java/org/zowe/apiml/gateway/service/RouteLocator.java +++ b/gateway-service/src/main/java/org/zowe/apiml/gateway/service/RouteLocator.java @@ -10,25 +10,23 @@ package org.zowe.apiml.gateway.service; -import lombok.AccessLevel; -import lombok.Getter; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient; import org.springframework.cloud.gateway.filter.FilterDefinition; import org.springframework.cloud.gateway.route.RouteDefinition; import org.springframework.cloud.gateway.route.RouteDefinitionLocator; -import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; import org.springframework.util.PatternMatchUtils; -import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource; import org.zowe.apiml.auth.Authentication; import org.zowe.apiml.auth.AuthenticationScheme; import org.zowe.apiml.eurekaservice.client.util.EurekaMetadataParser; import org.zowe.apiml.gateway.service.routing.RouteDefinitionProducer; import org.zowe.apiml.gateway.service.scheme.SchemeHandler; import org.zowe.apiml.product.routing.RoutedService; -import org.zowe.apiml.util.CorsUtils; import org.zowe.apiml.util.StringUtils; import reactor.core.publisher.Flux; @@ -39,6 +37,8 @@ import static org.zowe.apiml.constants.EurekaMetadataDefinition.*; @Service +@Slf4j +@RequiredArgsConstructor public class RouteLocator implements RouteDefinitionLocator { private static final EurekaMetadataParser metadataParser = new EurekaMetadataParser(); @@ -52,32 +52,15 @@ public class RouteLocator implements RouteDefinitionLocator { @Value("${apiml.gateway.servicesToLimitRequestRate:-}") List servicesToLimitRequestRate; - private final ApplicationContext context; - - private final CorsUtils corsUtils; private final ReactiveDiscoveryClient discoveryClient; private final List commonFilters; private final List routeDefinitionProducers; + private final List schemeHandlersList; private final Map schemeHandlers = new EnumMap<>(AuthenticationScheme.class); - @Getter(lazy = true, value = AccessLevel.PRIVATE) - private final UrlBasedCorsConfigurationSource corsConfigurationSource = context.getBean(UrlBasedCorsConfigurationSource.class); - - public RouteLocator( - ApplicationContext context, - CorsUtils corsUtils, - ReactiveDiscoveryClient discoveryClient, - List commonFilters, - List schemeHandlersList, - List routeDefinitionProducers - ) { - this.context = context; - this.corsUtils = corsUtils; - this.discoveryClient = discoveryClient; - this.commonFilters = commonFilters; - this.routeDefinitionProducers = routeDefinitionProducers; - + @PostConstruct + void afterPropertiesSet() { for (SchemeHandler schemeHandler : schemeHandlersList) { schemeHandlers.put(schemeHandler.getAuthenticationScheme(), schemeHandler); } @@ -99,15 +82,7 @@ void setAuth(ServiceInstance serviceInstance, RouteDefinition routeDefinition, A } } - void setCors(ServiceInstance serviceInstance) { - corsUtils.setCorsConfiguration( - serviceInstance.getServiceId().toLowerCase(), - serviceInstance.getMetadata(), - (prefix, serviceId, config) -> { - serviceId = serviceInstance.getMetadata().getOrDefault(APIML_ID, serviceInstance.getServiceId().toLowerCase()); - getCorsConfigurationSource().registerCorsConfiguration("/" + serviceId + "/**", config); - }); - } + Stream getRoutedService(ServiceInstance serviceInstance) { return metadataParser.parseToListRoute(serviceInstance.getMetadata()).stream() @@ -205,17 +180,15 @@ public Flux getRouteDefinitions() { // counter of generated route definition to prevent clashing by the order AtomicInteger order = new AtomicInteger(); // iterate over services - return getServiceInstances().flatMap(Flux::fromIterable).map(serviceInstance -> { - // configure CORS for the service (if necessary) - setCors(serviceInstance); - + return getServiceInstances().flatMap(Flux::fromIterable).map(serviceInstance -> // generate route definition per services and its routing rules - return getAuthFilterPerRoute(order, serviceInstance, getPostRoutingFilters(serviceInstance)); - }) + getAuthFilterPerRoute(order, serviceInstance, getPostRoutingFilters(serviceInstance)) + ) .flatMapIterable(list -> list); } private boolean filterIgnored(String serviceId) { return !PatternMatchUtils.simpleMatch(ignoredServices, serviceId); } + } diff --git a/gateway-service/src/main/resources/application.yml b/gateway-service/src/main/resources/application.yml index 0a291eda25..d11a930888 100644 --- a/gateway-service/src/main/resources/application.yml +++ b/gateway-service/src/main/resources/application.yml @@ -70,6 +70,7 @@ spring: okta: redirectUri: "{baseUrl}/gateway/{action}/oauth2/code/{registrationId}" main: + allow-circular-references: true banner-mode: ${apiml.banner:"off"} web-application-type: reactive @@ -127,10 +128,6 @@ server: trustStore: keystore/localhost/localhost.truststore.p12 trustStorePassword: password trustStoreType: PKCS12 - application: - name: gateway - main: - allow-circular-references: true logbackServiceName: ZWEAGW1 diff --git a/gateway-service/src/test/java/org/zowe/apiml/gateway/acceptance/config/DiscoveryClientTestConfig.java b/gateway-service/src/test/java/org/zowe/apiml/gateway/acceptance/config/DiscoveryClientTestConfig.java index dc21ab9715..4b5ae012b0 100644 --- a/gateway-service/src/test/java/org/zowe/apiml/gateway/acceptance/config/DiscoveryClientTestConfig.java +++ b/gateway-service/src/test/java/org/zowe/apiml/gateway/acceptance/config/DiscoveryClientTestConfig.java @@ -21,14 +21,15 @@ import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient; import org.springframework.cloud.context.config.annotation.RefreshScope; -import org.springframework.cloud.netflix.eureka.RestTemplateTimeoutProperties; +import org.springframework.cloud.netflix.eureka.RestClientTimeoutProperties; import org.springframework.cloud.netflix.eureka.http.DefaultEurekaClientHttpRequestFactorySupplier; -import org.springframework.cloud.netflix.eureka.http.RestTemplateDiscoveryClientOptionalArgs; -import org.springframework.cloud.netflix.eureka.http.RestTemplateTransportClientFactories; +import org.springframework.cloud.netflix.eureka.http.RestClientDiscoveryClientOptionalArgs; +import org.springframework.cloud.netflix.eureka.http.RestClientTransportClientFactories; import org.springframework.cloud.util.ProxyUtils; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Primary; +import org.springframework.web.client.RestClient; import org.zowe.apiml.gateway.acceptance.netflix.ApimlDiscoveryClientStub; import org.zowe.apiml.gateway.acceptance.netflix.ApplicationRegistry; import reactor.core.publisher.Flux; @@ -91,9 +92,9 @@ public ApimlDiscoveryClientStub eurekaClient(ApplicationInfoManager manager, } - var factorySupplier = new DefaultEurekaClientHttpRequestFactorySupplier(new RestTemplateTimeoutProperties()); - var args1 = new RestTemplateDiscoveryClientOptionalArgs(factorySupplier); - var factories = new RestTemplateTransportClientFactories(args1); + var factorySupplier = new DefaultEurekaClientHttpRequestFactorySupplier(new RestClientTimeoutProperties()); + var args1 = new RestClientDiscoveryClientOptionalArgs(factorySupplier, RestClient::builder); + var factories = new RestClientTransportClientFactories(args1); final var discoveryClient = new ApimlDiscoveryClientStub(appManager, config, this.context, applicationRegistry, factories, args1); discoveryClient.registerHealthCheck(healthCheckHandler); diff --git a/gateway-service/src/test/java/org/zowe/apiml/gateway/acceptance/netflix/ApimlDiscoveryClientStub.java b/gateway-service/src/test/java/org/zowe/apiml/gateway/acceptance/netflix/ApimlDiscoveryClientStub.java index e36b39bf83..2512c96cb4 100644 --- a/gateway-service/src/test/java/org/zowe/apiml/gateway/acceptance/netflix/ApimlDiscoveryClientStub.java +++ b/gateway-service/src/test/java/org/zowe/apiml/gateway/acceptance/netflix/ApimlDiscoveryClientStub.java @@ -16,8 +16,8 @@ import com.netflix.discovery.shared.Applications; import org.apache.commons.lang3.StringUtils; import org.springframework.cloud.netflix.eureka.CloudEurekaClient; -import org.springframework.cloud.netflix.eureka.http.RestTemplateDiscoveryClientOptionalArgs; -import org.springframework.cloud.netflix.eureka.http.RestTemplateTransportClientFactories; +import org.springframework.cloud.netflix.eureka.http.RestClientDiscoveryClientOptionalArgs; +import org.springframework.cloud.netflix.eureka.http.RestClientTransportClientFactories; import org.springframework.context.ApplicationEventPublisher; import java.util.List; @@ -25,7 +25,7 @@ public class ApimlDiscoveryClientStub extends CloudEurekaClient { private ApplicationRegistry applicationRegistry; - public ApimlDiscoveryClientStub(ApplicationInfoManager applicationInfoManager, EurekaClientConfig config, ApplicationEventPublisher publisher, ApplicationRegistry applicationRegistry, RestTemplateTransportClientFactories factories, RestTemplateDiscoveryClientOptionalArgs args1) { + public ApimlDiscoveryClientStub(ApplicationInfoManager applicationInfoManager, EurekaClientConfig config, ApplicationEventPublisher publisher, ApplicationRegistry applicationRegistry, RestClientTransportClientFactories factories, RestClientDiscoveryClientOptionalArgs args1) { super(applicationInfoManager, config, factories, args1, publisher); diff --git a/gateway-service/src/test/java/org/zowe/apiml/gateway/config/ServiceCorsUpdaterTest.java b/gateway-service/src/test/java/org/zowe/apiml/gateway/config/ServiceCorsUpdaterTest.java new file mode 100644 index 0000000000..6732cd3bd9 --- /dev/null +++ b/gateway-service/src/test/java/org/zowe/apiml/gateway/config/ServiceCorsUpdaterTest.java @@ -0,0 +1,104 @@ +/* + * This program and the accompanying materials are made available under the terms of the + * Eclipse Public License v2.0 which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v20.html + * + * SPDX-License-Identifier: EPL-2.0 + * + * Copyright Contributors to the Zowe Project. + */ + +package org.zowe.apiml.gateway.config; + +import org.apache.logging.log4j.util.TriConsumer; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient; +import org.springframework.cloud.gateway.config.GlobalCorsProperties; +import org.springframework.cloud.gateway.event.RefreshRoutesEvent; +import org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource; +import org.zowe.apiml.constants.EurekaMetadataDefinition; +import org.zowe.apiml.util.CorsUtils; +import reactor.core.publisher.Flux; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Consumer; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.*; + +class ServiceCorsUpdaterTest { + + private static final String SERVICE_ID = "myserviceid"; + private static final String APIML_ID = "apimlid"; + + private CorsUtils corsUtils = spy(new CorsUtils(true, Collections.emptyList())); + private ReactiveDiscoveryClient discoveryClient = mock(ReactiveDiscoveryClient.class); + + private ServiceCorsUpdater serviceCorsUpdater; + + private UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource; + + @BeforeEach + void setUp() { + serviceCorsUpdater = new ServiceCorsUpdater(corsUtils, discoveryClient, mock(RoutePredicateHandlerMapping.class), mock(GlobalCorsProperties.class)); + serviceCorsUpdater.initCorsConfigurationSource(); + urlBasedCorsConfigurationSource = spy((UrlBasedCorsConfigurationSource) ReflectionTestUtils.getField(serviceCorsUpdater, "urlBasedCorsConfigurationSource")); + ReflectionTestUtils.setField(serviceCorsUpdater, "urlBasedCorsConfigurationSource", urlBasedCorsConfigurationSource); + } + + private ServiceInstance createServiceInstance(String serviceId) { + ServiceInstance serviceInstance = mock(ServiceInstance.class); + doReturn(serviceId).when(serviceInstance).getServiceId(); + doReturn(Flux.just(serviceInstance)).when(discoveryClient).getInstances(serviceId); + + Map metadata = new HashMap<>(); + + metadata.put("apiml.routes.api-v1.gatewayUrl", "api/v1"); + metadata.put("apiml.routes.api-v1.serviceUrl", "api/v1"); + + doReturn(metadata).when(serviceInstance).getMetadata(); + + return serviceInstance; + } + + private TriConsumer getCorsLambda(Consumer> metadataProcessor) { + ServiceInstance serviceInstance = createServiceInstance(SERVICE_ID); + metadataProcessor.accept(serviceInstance.getMetadata()); + + doReturn(Flux.just(SERVICE_ID)).when(discoveryClient).getServices(); + + serviceCorsUpdater.onRefreshRoutesEvent(new RefreshRoutesEvent(this)); + ArgumentCaptor> lambdaCaptor = ArgumentCaptor.forClass(TriConsumer.class); + verify(corsUtils).setCorsConfiguration(anyString(), any(), lambdaCaptor.capture()); + + return lambdaCaptor.getValue(); + } + + @Test + void givenApimlId_whenSetCors_thenServiceIdIsReplacedWithApimlId() { + TriConsumer corsLambda = getCorsLambda(md -> md.put(EurekaMetadataDefinition.APIML_ID, APIML_ID)); + + corsLambda.accept(null, SERVICE_ID, null); + + verify(serviceCorsUpdater.getUrlBasedCorsConfigurationSource()).registerCorsConfiguration("/" + APIML_ID + "/**", null); + } + + @Test + void givenNoApimlId_whenSetCors_thenServiceIdIsUsed() { + TriConsumer corsLambda = getCorsLambda(md -> {}); + + corsLambda.accept(null, SERVICE_ID, null); + + verify(serviceCorsUpdater.getUrlBasedCorsConfigurationSource()).registerCorsConfiguration("/" + SERVICE_ID + "/**", null); + } + +} diff --git a/gateway-service/src/test/java/org/zowe/apiml/gateway/controllers/CertificatesRestControllerTest.java b/gateway-service/src/test/java/org/zowe/apiml/gateway/controllers/CertificatesRestControllerTest.java index ba1172a7e9..e8379144a4 100644 --- a/gateway-service/src/test/java/org/zowe/apiml/gateway/controllers/CertificatesRestControllerTest.java +++ b/gateway-service/src/test/java/org/zowe/apiml/gateway/controllers/CertificatesRestControllerTest.java @@ -16,7 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration; import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.reactive.server.WebTestClient; import org.zowe.apiml.gateway.service.CertificateChainService; import org.zowe.apiml.message.core.MessageService; @@ -83,10 +83,10 @@ class CertificatesRestControllerTest { @Autowired WebTestClient webTestClient; - @MockBean + @MockitoBean private CertificateChainService mockCertificateChainService; - @MockBean + @MockitoBean private MessageService messageService; @Nested diff --git a/gateway-service/src/test/java/org/zowe/apiml/gateway/controllers/VersionControllerTest.java b/gateway-service/src/test/java/org/zowe/apiml/gateway/controllers/VersionControllerTest.java index f841d3868f..648e2fccff 100644 --- a/gateway-service/src/test/java/org/zowe/apiml/gateway/controllers/VersionControllerTest.java +++ b/gateway-service/src/test/java/org/zowe/apiml/gateway/controllers/VersionControllerTest.java @@ -14,7 +14,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration; import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.reactive.server.WebTestClient; import org.zowe.apiml.message.core.MessageService; import org.zowe.apiml.product.version.VersionInfo; @@ -24,12 +24,14 @@ import static org.mockito.Mockito.when; @WebFluxTest(controllers = VersionController.class, excludeAutoConfiguration = { ReactiveSecurityAutoConfiguration.class }) -@MockBean(MessageService.class) class VersionControllerTest { - @MockBean + @MockitoBean private VersionService versionService; + @MockitoBean + private MessageService messageService; + @Autowired private WebTestClient webTestClient; diff --git a/gateway-service/src/test/java/org/zowe/apiml/gateway/service/RouteLocatorTest.java b/gateway-service/src/test/java/org/zowe/apiml/gateway/service/RouteLocatorTest.java index e4b45ef9aa..5a313cb703 100644 --- a/gateway-service/src/test/java/org/zowe/apiml/gateway/service/RouteLocatorTest.java +++ b/gateway-service/src/test/java/org/zowe/apiml/gateway/service/RouteLocatorTest.java @@ -10,29 +10,22 @@ package org.zowe.apiml.gateway.service; -import org.apache.logging.log4j.util.TriConsumer; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient; import org.springframework.cloud.gateway.filter.FilterDefinition; import org.springframework.cloud.gateway.route.RouteDefinition; -import org.springframework.context.ApplicationContext; import org.springframework.test.util.ReflectionTestUtils; -import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource; import org.zowe.apiml.auth.Authentication; import org.zowe.apiml.auth.AuthenticationScheme; import org.zowe.apiml.gateway.service.routing.RouteDefinitionProducer; import org.zowe.apiml.gateway.service.scheme.SchemeHandler; import org.zowe.apiml.product.routing.RoutedService; -import org.zowe.apiml.util.CorsUtils; import reactor.core.publisher.Flux; import java.util.*; -import java.util.function.Consumer; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; @@ -54,25 +47,19 @@ class RouteLocatorTest { createRouteDefinitionProducer(10, "id10") }; - private UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = mock(UrlBasedCorsConfigurationSource.class); - private CorsUtils corsUtils = mock(CorsUtils.class); private ReactiveDiscoveryClient discoveryClient = mock(ReactiveDiscoveryClient.class); private RouteLocator routeLocator; @BeforeEach void init() { - ApplicationContext context = mock(ApplicationContext.class); - doReturn(urlBasedCorsConfigurationSource).when(context).getBean(UrlBasedCorsConfigurationSource.class); - routeLocator = spy(new RouteLocator( - context, - corsUtils, discoveryClient, Arrays.asList(COMMON_FILTERS), - Arrays.asList(SCHEME_HANDLER_FILTERS), - Arrays.asList(PRODUCERS) + Arrays.asList(PRODUCERS), + Arrays.asList(SCHEME_HANDLER_FILTERS) )); + routeLocator.afterPropertiesSet(); } private ServiceInstance createServiceInstance(String serviceId, String...routes) { @@ -172,35 +159,6 @@ void givenExistingAuthenticationScheme_whenSetAuth_thenCallApply() { verify(SCHEME_HANDLER_FILTERS[0]).apply(MOCK_SERVICE, routeDefinition, authentication); } - private TriConsumer getCorsLambda(Consumer> metadataProcessor) { - ServiceInstance serviceInstance = createServiceInstance("myservice", "api/v1"); - metadataProcessor.accept(serviceInstance.getMetadata()); - - routeLocator.setCors(serviceInstance); - ArgumentCaptor> lambdaCaptor = ArgumentCaptor.forClass(TriConsumer.class); - verify(corsUtils).setCorsConfiguration(anyString(), any(), lambdaCaptor.capture()); - - return lambdaCaptor.getValue(); - } - - @Test - void givenApimlId_whenSetCors_thenServiceIdIsReplacedWithApimlId() { - TriConsumer corsLambda = getCorsLambda(md -> md.put(APIML_ID, "apimlid")); - - corsLambda.accept(null, "myservice", null); - - verify(urlBasedCorsConfigurationSource).registerCorsConfiguration("/apimlid/**", null); - } - - @Test - void givenNoApimlId_whenSetCors_thenServiceIdIsUsed() { - TriConsumer corsLambda = getCorsLambda(md -> {}); - - corsLambda.accept(null, "myservice", null); - - verify(urlBasedCorsConfigurationSource).registerCorsConfiguration("/myservice/**", null); - } - @Test void givenNonGatewayService_whenGetRoutedService_thenReturnRoutingFromMetadata() { ServiceInstance s = createServiceInstance("myservice", "api/v1", "ui/v1"); @@ -245,8 +203,6 @@ void givenRouteLocator_whenGetRouteDefinitions_thenGenerateAll() { int index = 0; for (String serviceId : new String[] {"service1", "service2"}) { - verify(corsUtils).setCorsConfiguration(eq(serviceId), any(), any()); - for (String gatewayUrl : new String[] {"a/b", ""}) { for (String producerId : new String[] {"id0", "id5", "id10"}) { assertEquals(index, rds[index].getOrder()); @@ -263,7 +219,7 @@ void givenRouteLocator_whenGetRouteDefinitions_thenGenerateAll() { class PostRoutingFilterDefinition { private final List COMMON_FILTERS = Collections.singletonList(mock(FilterDefinition.class)); - private final RouteLocator routeLocator = new RouteLocator(null, null, null, COMMON_FILTERS, Collections.emptyList(), null); + private final RouteLocator routeLocator = new RouteLocator(null, COMMON_FILTERS, Collections.emptyList(), null); private ServiceInstance createServiceInstance(Boolean forwardingEnabled, Boolean encodedCharactersEnabled, Boolean rateLimiterEnabled) { Map metadata = new HashMap<>(); diff --git a/gradle/versions.gradle b/gradle/versions.gradle index deb6f6a823..43edbc239d 100644 --- a/gradle/versions.gradle +++ b/gradle/versions.gradle @@ -5,20 +5,20 @@ dependencyResolutionManagement { version('projectNode', '20.14.0') version('projectNpm', '10.7.0') - version('springBoot', '3.3.7') - version('springBootGraphQl', '3.3.7') - version('springCloudNetflix', '4.1.4') - version('springCloudCommons', '4.1.5') - version('springCloudCB', '3.1.3') - version('springCloudGateway', '4.1.6') - version('springFramework', '6.1.16') + version('springBoot', '3.4.1') + version('springBootGraphQl', '3.4.1') + version('springCloudNetflix', '4.2.0') + version('springCloudCommons', '4.2.0') + version('springCloudCB', '3.2.0') + version('springCloudGateway', '4.2.0') + version('springFramework', '6.2.2') version('springRetry', '2.0.11') version('glassfishHk2', '3.1.1') version('zosUtils', '2.0.5') version('aws', '1.12.780') version('awaitility', '4.2.2') - version('bouncyCastle', '1.79') + version('bouncyCastle', '1.80') version('caffeine', '3.1.8') version('checkerQual', '3.48.4') version('commonsLang3', '3.17.0') @@ -67,21 +67,18 @@ dependencyResolutionManagement { // force version in build.gradle file - compatibility with Slf4j version('log4j', '2.24.3') version('lombok', '1.18.36') - version('netty', '4.1.116.Final') + version('netty', '4.1.117.Final') // netty reactor contains a bug: https://github.com/reactor/reactor-netty/issues/3559 > https://github.com/reactor/reactor-netty/pull/3581 - version('nettyReactor') { - strictly '[1.1.0,1.1.24[' - prefer '1.1.23' - } + version('nettyReactor', '1.2.2') version('nimbusJoseJwt', '9.48') version('openApiDiff', '2.0.1') version('picocli', '4.7.6') - version('reactor', '3.7.1') + version('reactor', '3.7.2') version('restAssured', '5.5.0') version('rhino', '1.8.0') - version('springDoc', '2.6.0') - version('swaggerCore', '2.2.27') + version('springDoc', '2.8.3') + version('swaggerCore', '2.2.28') version('swaggerInflector', '2.0.12') version('swagger2Parser', '1.0.72') version('swagger3Parser', '2.1.24') @@ -98,8 +95,8 @@ dependencyResolutionManagement { version('gradleTestLogger', '4.0.0') version('testLogger', '4.0.0') version('micronautPlatform', '4.6.1') - version('micronaut', '4.7.10') - version('micronautPlugin', '4.4.4') + version('micronaut', '4.7.12') + version('micronautPlugin', '4.4.5') version('shadow', '8.1.1') version('checkstyle', '10.17.0') version('jacoco', '0.8.11') diff --git a/onboarding-enabler-nodejs-sample-app/package.json b/onboarding-enabler-nodejs-sample-app/package.json index 586b763a9d..141b99feb0 100755 --- a/onboarding-enabler-nodejs-sample-app/package.json +++ b/onboarding-enabler-nodejs-sample-app/package.json @@ -19,7 +19,7 @@ "express": "4.21.2" }, "overrides": { - "tough-cookie": "5.0.0" + "tough-cookie": "5.1.0" }, "engines": { "npm": "=10.9.2", diff --git a/onboarding-enabler-nodejs/package-lock.json b/onboarding-enabler-nodejs/package-lock.json index d399d275d5..efcee0d822 100644 --- a/onboarding-enabler-nodejs/package-lock.json +++ b/onboarding-enabler-nodejs/package-lock.json @@ -3742,7 +3742,7 @@ }, "node_modules/gulp-babel": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/gulp-babel/-/gulp-babel-7.0.1.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/gulp-babel/-/gulp-babel-7.0.1.tgz", "integrity": "sha512-UqHS3AdxZyJCRxqnAX603Dj3k/Wx6hzcgmav3QcxvsIFq3Y8ZkU7iXd0O+JwD5ivqCc6o0r1S7tCB/xxLnuSNw==", "dev": true, "license": "MIT", diff --git a/onboarding-enabler-spring/src/test/java/org/zowe/apiml/enable/config/EnableApiDiscoveryConfigTest.java b/onboarding-enabler-spring/src/test/java/org/zowe/apiml/enable/config/EnableApiDiscoveryConfigTest.java index 4b0882fcf4..9f3ac01448 100644 --- a/onboarding-enabler-spring/src/test/java/org/zowe/apiml/enable/config/EnableApiDiscoveryConfigTest.java +++ b/onboarding-enabler-spring/src/test/java/org/zowe/apiml/enable/config/EnableApiDiscoveryConfigTest.java @@ -16,8 +16,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.ConfigDataApplicationContextInitializer; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.zowe.apiml.enable.EnableApiDiscovery; import org.zowe.apiml.enable.register.RegisterToApiLayer; @@ -40,7 +40,7 @@ class EnableApiDiscoveryConfigTest { @Autowired private ApiMediationServiceConfig apiMediationServiceConfig; - @MockBean + @MockitoBean private ApiMediationClient apiMediationClient; @Test diff --git a/onboarding-enabler-spring/src/test/java/org/zowe/apiml/enable/register/ApimlDisabledRegisterToApiLayerTest.java b/onboarding-enabler-spring/src/test/java/org/zowe/apiml/enable/register/ApimlDisabledRegisterToApiLayerTest.java index 88fa29d394..840c8b3fec 100644 --- a/onboarding-enabler-spring/src/test/java/org/zowe/apiml/enable/register/ApimlDisabledRegisterToApiLayerTest.java +++ b/onboarding-enabler-spring/src/test/java/org/zowe/apiml/enable/register/ApimlDisabledRegisterToApiLayerTest.java @@ -15,9 +15,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.ConfigDataApplicationContextInitializer; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.zowe.apiml.enable.EnableApiDiscovery; import org.zowe.apiml.enable.config.EnableApiDiscoveryConfig; @@ -40,7 +40,7 @@ class ApimlDisabledRegisterToApiLayerTest { @Autowired private ApiMediationServiceConfig apiMediationServiceConfig; - @MockBean + @MockitoBean private ApiMediationClient apiMediationClient; @Test diff --git a/onboarding-enabler-spring/src/test/java/org/zowe/apiml/enable/register/ApimlEnabledRegisterToApiLayerTest.java b/onboarding-enabler-spring/src/test/java/org/zowe/apiml/enable/register/ApimlEnabledRegisterToApiLayerTest.java index 472d693f66..230091c4a7 100644 --- a/onboarding-enabler-spring/src/test/java/org/zowe/apiml/enable/register/ApimlEnabledRegisterToApiLayerTest.java +++ b/onboarding-enabler-spring/src/test/java/org/zowe/apiml/enable/register/ApimlEnabledRegisterToApiLayerTest.java @@ -15,9 +15,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.ConfigDataApplicationContextInitializer; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.zowe.apiml.enable.EnableApiDiscovery; import org.zowe.apiml.enable.config.EnableApiDiscoveryConfig; @@ -41,7 +41,7 @@ class ApimlEnabledRegisterToApiLayerTest { @Autowired private ApiMediationServiceConfig apiMediationServiceConfig; - @MockBean + @MockitoBean private ApiMediationClient apiMediationClient; @Test diff --git a/scripts/docs/package.json b/scripts/docs/package.json index b58b4bd4a8..3a4c36aa22 100644 --- a/scripts/docs/package.json +++ b/scripts/docs/package.json @@ -10,6 +10,6 @@ "author": "", "license": "EPL-2.0", "dependencies": { - "octokit": "4.0.3" + "octokit": "4.1.0" } } diff --git a/scripts/release_components/package.json b/scripts/release_components/package.json index bb9d1a05d8..c9ee5fe06a 100644 --- a/scripts/release_components/package.json +++ b/scripts/release_components/package.json @@ -10,6 +10,6 @@ "author": "", "license": "EPL-2.0", "dependencies": { - "octokit": "4.0.3" + "octokit": "4.1.0" } } diff --git a/scripts/release_docs/package.json b/scripts/release_docs/package.json index cc107eb1ca..40c16fffcb 100644 --- a/scripts/release_docs/package.json +++ b/scripts/release_docs/package.json @@ -10,6 +10,6 @@ "author": "", "license": "EPL-2.0", "dependencies": { - "octokit": "4.0.3" + "octokit": "4.1.0" } } diff --git a/zaas-service/src/main/java/org/zowe/apiml/zaas/config/DiscoveryClientOrderProcessorBean.java b/zaas-service/src/main/java/org/zowe/apiml/zaas/config/DiscoveryClientOrderProcessorBean.java index 1f3efa59c1..6f858879fb 100644 --- a/zaas-service/src/main/java/org/zowe/apiml/zaas/config/DiscoveryClientOrderProcessorBean.java +++ b/zaas-service/src/main/java/org/zowe/apiml/zaas/config/DiscoveryClientOrderProcessorBean.java @@ -30,7 +30,7 @@ public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) .flatMap(Arrays::stream) .distinct() .map(beanFactory::getBeanDefinition) - .forEach(bd -> bd.setDependsOn("scopedTarget.zosmfService")); + .forEach(bd -> bd.setDependsOn("scopedTarget.zosmfService", "eurekaAutoServiceRegistration")); } } diff --git a/zaas-service/src/test/java/org/zowe/apiml/acceptance/RefreshEndpointTest.java b/zaas-service/src/test/java/org/zowe/apiml/acceptance/RefreshEndpointTest.java index 1f0328a4b7..01dea77569 100644 --- a/zaas-service/src/test/java/org/zowe/apiml/acceptance/RefreshEndpointTest.java +++ b/zaas-service/src/test/java/org/zowe/apiml/acceptance/RefreshEndpointTest.java @@ -18,8 +18,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.zowe.apiml.product.web.HttpConfig; import org.zowe.apiml.security.common.login.LoginRequest; import org.zowe.apiml.zaas.ZaasApplication; @@ -34,7 +34,6 @@ import static org.hamcrest.core.Is.is; @SpringBootTest(classes = ZaasApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@MockBean(name = "x509Mapper", classes = AuthenticationMapper.class) public class RefreshEndpointTest { private final static String USERNAME = "USER"; @@ -46,6 +45,9 @@ public class RefreshEndpointTest { @Value("${apiml.service.hostname:localhost}") private String hostname; + @MockitoBean(name = "x509Mapper") + private AuthenticationMapper x509Mapper; + @Autowired HttpConfig httpConfig; diff --git a/zaas-service/src/test/java/org/zowe/apiml/acceptance/ZaasTest.java b/zaas-service/src/test/java/org/zowe/apiml/acceptance/ZaasTest.java index 68f15cf4a4..5df166a7ea 100644 --- a/zaas-service/src/test/java/org/zowe/apiml/acceptance/ZaasTest.java +++ b/zaas-service/src/test/java/org/zowe/apiml/acceptance/ZaasTest.java @@ -16,9 +16,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.zowe.apiml.product.web.HttpConfig; import org.zowe.apiml.zaas.ZaasApplication; import org.zowe.apiml.zaas.security.mapping.AuthenticationMapper; @@ -33,11 +33,13 @@ @TestPropertySource(properties = { "apiml.security.auth.provider=dummy" // To simulate SAF auth provider that does not run outside of mainframe }) -@MockBean(name = "x509Mapper", classes = AuthenticationMapper.class) class ZaasTest { private static final String COOKIE = "apimlAuthenticationToken"; + @MockitoBean(name = "x509Mapper") + private AuthenticationMapper x509Mapper; + @Autowired private HttpConfig httpConfig; diff --git a/zaas-service/src/test/java/org/zowe/apiml/zaas/config/CacheConfigTest.java b/zaas-service/src/test/java/org/zowe/apiml/zaas/config/CacheConfigTest.java index 83ec8b4edd..3a5c14cebe 100644 --- a/zaas-service/src/test/java/org/zowe/apiml/zaas/config/CacheConfigTest.java +++ b/zaas-service/src/test/java/org/zowe/apiml/zaas/config/CacheConfigTest.java @@ -14,11 +14,11 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.cache.CacheManager; import org.springframework.cache.jcache.JCacheCacheManager; import org.springframework.cache.support.NoOpCacheManager; import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.web.client.RestTemplate; import org.zowe.apiml.product.gateway.GatewayClient; @@ -31,10 +31,14 @@ class CacheConfigTest { @Nested @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = CacheConfig.class) @ActiveProfiles("test") - @MockBean(GatewayClient.class) - @MockBean(name = "restTemplateWithKeystore", value = RestTemplate.class) class EnabledCache { + @MockitoBean + private GatewayClient gatewayClient; + + @MockitoBean(name = "restTemplateWithKeystore") + private RestTemplate restTemplateWithKeystore; + @Autowired private CacheManager cacheManager; @@ -51,10 +55,14 @@ void testCacheManagerIsRealImplementation() { "apiml.caching.enabled=false" }) @ActiveProfiles("test") - @MockBean(GatewayClient.class) - @MockBean(name = "restTemplateWithKeystore", value = RestTemplate.class) class DisabledCache { + @MockitoBean + private GatewayClient gatewayClient; + + @MockitoBean(name = "restTemplateWithKeystore") + private RestTemplate restTemplateWithKeystore; + @Autowired private CacheManager cacheManager; diff --git a/zaas-service/src/test/java/org/zowe/apiml/zaas/security/config/AttlsConfigTest.java b/zaas-service/src/test/java/org/zowe/apiml/zaas/security/config/AttlsConfigTest.java index d085f5fc26..d1f1e19a06 100644 --- a/zaas-service/src/test/java/org/zowe/apiml/zaas/security/config/AttlsConfigTest.java +++ b/zaas-service/src/test/java/org/zowe/apiml/zaas/security/config/AttlsConfigTest.java @@ -18,10 +18,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.zowe.apiml.zaas.security.mapping.AuthenticationMapper; import javax.net.ssl.SSLException; @@ -46,9 +46,11 @@ } ) @TestInstance(Lifecycle.PER_CLASS) -@MockBean(name = "x509Mapper", classes = AuthenticationMapper.class) public class AttlsConfigTest { + @MockitoBean(name = "x509Mapper") + private AuthenticationMapper x509Mapper; + @Autowired HttpSecurity http; diff --git a/zaas-service/src/test/java/org/zowe/apiml/zaas/security/service/AuthenticationServiceTest.java b/zaas-service/src/test/java/org/zowe/apiml/zaas/security/service/AuthenticationServiceTest.java index b8ce1b8a11..4793c5400e 100644 --- a/zaas-service/src/test/java/org/zowe/apiml/zaas/security/service/AuthenticationServiceTest.java +++ b/zaas-service/src/test/java/org/zowe/apiml/zaas/security/service/AuthenticationServiceTest.java @@ -29,13 +29,13 @@ import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.cache.CacheManager; import org.springframework.context.ApplicationContext; import org.springframework.http.HttpHeaders; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.web.client.RestTemplate; @@ -538,10 +538,23 @@ void stubJWTSecurityForSign() { @Nested @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { CacheConfig.class, AuthenticationService.class, AuthConfigurationProperties.class }) - @MockBean({ JwtSecurity.class, ZosmfService.class, EurekaClient.class, GatewayClient.class }) - @MockBean(name = "restTemplateWithKeystore", value = RestTemplate.class) class GivenCacheJWTTest { + @MockitoBean + private JwtSecurity jwtSecurity; + + @MockitoBean + private ZosmfService zosmfService; + + @MockitoBean + private EurekaClient eurekaClient; + + @MockitoBean + private GatewayClient gatewayClient; + + @MockitoBean(name = "restTemplateWithKeystore") + private RestTemplate restTemplateWithKeystore; + @Autowired private AuthenticationService authService; diff --git a/zaas-service/src/test/java/org/zowe/apiml/zaas/zaas/ZaasExceptionHandlerTest.java b/zaas-service/src/test/java/org/zowe/apiml/zaas/zaas/ZaasExceptionHandlerTest.java index fbb3ab57c1..c44cd0cfa8 100644 --- a/zaas-service/src/test/java/org/zowe/apiml/zaas/zaas/ZaasExceptionHandlerTest.java +++ b/zaas-service/src/test/java/org/zowe/apiml/zaas/zaas/ZaasExceptionHandlerTest.java @@ -54,7 +54,7 @@ void givenUnknownEndpoint_whenCallZaas_thenReturns404WithMessage() { .get("/unknown/endpoint") .then() .statusCode(404) - .body("messages[0].messageKey", is("org.zowe.apiml.common.endPointNotFound")); + .body("messages[0].messageKey", is("org.zowe.apiml.common.notFound")); } @ParameterizedTest diff --git a/zowe-cli-id-federation-plugin/package-lock.json b/zowe-cli-id-federation-plugin/package-lock.json index 1df9235ef6..724fdd30e8 100644 --- a/zowe-cli-id-federation-plugin/package-lock.json +++ b/zowe-cli-id-federation-plugin/package-lock.json @@ -12,18 +12,18 @@ "csv-parse": "5.6.0" }, "devDependencies": { - "@eslint/js": "9.17.0", + "@eslint/js": "9.18.0", "@types/jest": "29.5.14", - "@types/node": "20.17.12", - "@typescript-eslint/eslint-plugin": "8.19.1", - "@typescript-eslint/parser": "8.19.1", - "@zowe/cli": "8.10.3", - "@zowe/cli-test-utils": "8.10.3", - "@zowe/imperative": "8.10.3", + "@types/node": "20.17.14", + "@typescript-eslint/eslint-plugin": "8.20.0", + "@typescript-eslint/parser": "8.20.0", + "@zowe/cli": "8.11.0", + "@zowe/cli-test-utils": "8.11.0", + "@zowe/imperative": "8.11.0", "copyfiles": "2.4.1", "env-cmd": "10.1.0", - "eslint": "9.17.0", - "eslint-plugin-jest": "28.10.0", + "eslint": "9.18.0", + "eslint-plugin-jest": "28.11.0", "eslint-plugin-license-header": "0.6.1", "eslint-plugin-unused-imports": "4.1.4", "globals": "15.14.0", @@ -39,14 +39,14 @@ "ts-jest": "29.2.5", "ts-node": "10.9.2", "typedoc": "0.27.6", - "typescript": "5.7.2" + "typescript": "5.7.3" }, "engines": { "node": "=20.18.1", "npm": "=10.9.2" }, "peerDependencies": { - "@zowe/imperative": "8.10.3" + "@zowe/imperative": "8.11.0" } }, "node_modules/@ampproject/remapping": { @@ -130,14 +130,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.26.5", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -274,13 +274,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.26.5", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@babel/parser/-/parser-7.26.5.tgz", + "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.26.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -531,17 +531,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.26.5", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@babel/traverse/-/traverse-7.26.5.tgz", + "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.5", "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/types": "^7.26.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -560,9 +560,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.26.5", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@babel/types/-/types-7.26.5.tgz", + "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", "dev": true, "license": "MIT", "dependencies": { @@ -665,9 +665,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.9.1", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@eslint/core/-/core-0.9.1.tgz", - "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==", + "version": "0.10.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@eslint/core/-/core-0.10.0.tgz", + "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -714,9 +714,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.17.0", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@eslint/js/-/js-9.17.0.tgz", - "integrity": "sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==", + "version": "9.18.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@eslint/js/-/js-9.18.0.tgz", + "integrity": "sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==", "dev": true, "license": "MIT", "engines": { @@ -734,12 +734,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.4", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz", - "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==", + "version": "0.2.5", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz", + "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==", "dev": true, "license": "Apache-2.0", "dependencies": { + "@eslint/core": "^0.10.0", "levn": "^0.4.1" }, "engines": { @@ -2020,9 +2021,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.17.12", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@types/node/-/node-20.17.12.tgz", - "integrity": "sha512-vo/wmBgMIiEA23A/knMfn/cf37VnuF52nZh5ZoW0GWt4e4sxNquibrMRJ7UQsA06+MBx9r/H1jsI9grYjQCQlw==", + "version": "20.17.14", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@types/node/-/node-20.17.14.tgz", + "integrity": "sha512-w6qdYetNL5KRBiSClK/KWai+2IMEJuAj+EujKCumalFOwXtvOXaEan9AuwcRID2IcOIAWSIfR495hBtgKlx2zg==", "dev": true, "license": "MIT", "dependencies": { @@ -2057,17 +2058,17 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.19.1", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.19.1.tgz", - "integrity": "sha512-tJzcVyvvb9h/PB96g30MpxACd9IrunT7GF9wfA9/0TJ1LxGOJx1TdPzSbBBnNED7K9Ka8ybJsnEpiXPktolTLg==", + "version": "8.20.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.20.0.tgz", + "integrity": "sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.19.1", - "@typescript-eslint/type-utils": "8.19.1", - "@typescript-eslint/utils": "8.19.1", - "@typescript-eslint/visitor-keys": "8.19.1", + "@typescript-eslint/scope-manager": "8.20.0", + "@typescript-eslint/type-utils": "8.20.0", + "@typescript-eslint/utils": "8.20.0", + "@typescript-eslint/visitor-keys": "8.20.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -2100,16 +2101,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.19.1", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@typescript-eslint/parser/-/parser-8.19.1.tgz", - "integrity": "sha512-67gbfv8rAwawjYx3fYArwldTQKoYfezNUT4D5ioWetr/xCrxXxvleo3uuiFuKfejipvq+og7mjz3b0G2bVyUCw==", + "version": "8.20.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@typescript-eslint/parser/-/parser-8.20.0.tgz", + "integrity": "sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.19.1", - "@typescript-eslint/types": "8.19.1", - "@typescript-eslint/typescript-estree": "8.19.1", - "@typescript-eslint/visitor-keys": "8.19.1", + "@typescript-eslint/scope-manager": "8.20.0", + "@typescript-eslint/types": "8.20.0", + "@typescript-eslint/typescript-estree": "8.20.0", + "@typescript-eslint/visitor-keys": "8.20.0", "debug": "^4.3.4" }, "engines": { @@ -2125,14 +2126,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.19.1", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@typescript-eslint/scope-manager/-/scope-manager-8.19.1.tgz", - "integrity": "sha512-60L9KIuN/xgmsINzonOcMDSB8p82h95hoBfSBtXuO4jlR1R9L1xSkmVZKgCPVfavDlXihh4ARNjXhh1gGnLC7Q==", + "version": "8.20.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@typescript-eslint/scope-manager/-/scope-manager-8.20.0.tgz", + "integrity": "sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.19.1", - "@typescript-eslint/visitor-keys": "8.19.1" + "@typescript-eslint/types": "8.20.0", + "@typescript-eslint/visitor-keys": "8.20.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2143,14 +2144,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.19.1", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@typescript-eslint/type-utils/-/type-utils-8.19.1.tgz", - "integrity": "sha512-Rp7k9lhDKBMRJB/nM9Ksp1zs4796wVNyihG9/TU9R6KCJDNkQbc2EOKjrBtLYh3396ZdpXLtr/MkaSEmNMtykw==", + "version": "8.20.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@typescript-eslint/type-utils/-/type-utils-8.20.0.tgz", + "integrity": "sha512-bPC+j71GGvA7rVNAHAtOjbVXbLN5PkwqMvy1cwGeaxUoRQXVuKCebRoLzm+IPW/NtFFpstn1ummSIasD5t60GA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.19.1", - "@typescript-eslint/utils": "8.19.1", + "@typescript-eslint/typescript-estree": "8.20.0", + "@typescript-eslint/utils": "8.20.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.0" }, @@ -2180,9 +2181,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.19.1", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@typescript-eslint/types/-/types-8.19.1.tgz", - "integrity": "sha512-JBVHMLj7B1K1v1051ZaMMgLW4Q/jre5qGK0Ew6UgXz1Rqh+/xPzV1aW581OM00X6iOfyr1be+QyW8LOUf19BbA==", + "version": "8.20.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@typescript-eslint/types/-/types-8.20.0.tgz", + "integrity": "sha512-cqaMiY72CkP+2xZRrFt3ExRBu0WmVitN/rYPZErA80mHjHx/Svgp8yfbzkJmDoQ/whcytOPO9/IZXnOc+wigRA==", "dev": true, "license": "MIT", "engines": { @@ -2194,14 +2195,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.19.1", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@typescript-eslint/typescript-estree/-/typescript-estree-8.19.1.tgz", - "integrity": "sha512-jk/TZwSMJlxlNnqhy0Eod1PNEvCkpY6MXOXE/WLlblZ6ibb32i2We4uByoKPv1d0OD2xebDv4hbs3fm11SMw8Q==", + "version": "8.20.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@typescript-eslint/typescript-estree/-/typescript-estree-8.20.0.tgz", + "integrity": "sha512-Y7ncuy78bJqHI35NwzWol8E0X7XkRVS4K4P4TCyzWkOJih5NDvtoRDW4Ba9YJJoB2igm9yXDdYI/+fkiiAxPzA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.19.1", - "@typescript-eslint/visitor-keys": "8.19.1", + "@typescript-eslint/types": "8.20.0", + "@typescript-eslint/visitor-keys": "8.20.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -2260,16 +2261,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.19.1", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@typescript-eslint/utils/-/utils-8.19.1.tgz", - "integrity": "sha512-IxG5gLO0Ne+KaUc8iW1A+XuKLd63o4wlbI1Zp692n1xojCl/THvgIKXJXBZixTh5dd5+yTJ/VXH7GJaaw21qXA==", + "version": "8.20.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@typescript-eslint/utils/-/utils-8.20.0.tgz", + "integrity": "sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.19.1", - "@typescript-eslint/types": "8.19.1", - "@typescript-eslint/typescript-estree": "8.19.1" + "@typescript-eslint/scope-manager": "8.20.0", + "@typescript-eslint/types": "8.20.0", + "@typescript-eslint/typescript-estree": "8.20.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2284,13 +2285,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.19.1", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@typescript-eslint/visitor-keys/-/visitor-keys-8.19.1.tgz", - "integrity": "sha512-fzmjU8CHK853V/avYZAvuVut3ZTfwN5YtMaoi+X9Y9MA9keaWNHC3zEQ9zvyX/7Hj+5JkNyK1l7TOR2hevHB6Q==", + "version": "8.20.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@typescript-eslint/visitor-keys/-/visitor-keys-8.20.0.tgz", + "integrity": "sha512-v/BpkeeYAsPkKCkR8BDwcno0llhzWVqPOamQrAEMdpZav2Y9OVjd9dwJyBLJWwf335B5DmlifECIkZRJCaGaHA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.19.1", + "@typescript-eslint/types": "8.20.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -2371,25 +2372,25 @@ "dev": true }, "node_modules/@zowe/cli": { - "version": "8.10.3", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@zowe/cli/-/cli-8.10.3.tgz", - "integrity": "sha512-2eX7cHU6Ua/YM86bXuzO5OTzFyHIKjEKyXq+NPSHiQcMnss97RN0Kj2ey00YvA2TymVJGtVS4Q1oHo/Oh0bKXg==", + "version": "8.11.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@zowe/cli/-/cli-8.11.0.tgz", + "integrity": "sha512-DgFqizIICBsV8aJXYKUftjNNNoJLLNtiEeX+HMFNzvBLx6nk2ihglUf+7+Bw/BO1zEHNS8MbT8WSyUir/9JDxg==", "dev": true, "hasInstallScript": true, "hasShrinkwrap": true, "license": "EPL-2.0", "dependencies": { - "@zowe/core-for-zowe-sdk": "8.10.3", - "@zowe/imperative": "8.10.3", - "@zowe/provisioning-for-zowe-sdk": "8.10.3", - "@zowe/zos-console-for-zowe-sdk": "8.10.3", - "@zowe/zos-files-for-zowe-sdk": "8.10.3", - "@zowe/zos-jobs-for-zowe-sdk": "8.10.3", - "@zowe/zos-logs-for-zowe-sdk": "8.10.3", - "@zowe/zos-tso-for-zowe-sdk": "8.10.3", - "@zowe/zos-uss-for-zowe-sdk": "8.10.3", - "@zowe/zos-workflows-for-zowe-sdk": "8.10.3", - "@zowe/zosmf-for-zowe-sdk": "8.10.3", + "@zowe/core-for-zowe-sdk": "8.11.0", + "@zowe/imperative": "8.11.0", + "@zowe/provisioning-for-zowe-sdk": "8.11.0", + "@zowe/zos-console-for-zowe-sdk": "8.11.0", + "@zowe/zos-files-for-zowe-sdk": "8.11.0", + "@zowe/zos-jobs-for-zowe-sdk": "8.11.0", + "@zowe/zos-logs-for-zowe-sdk": "8.11.0", + "@zowe/zos-tso-for-zowe-sdk": "8.11.0", + "@zowe/zos-uss-for-zowe-sdk": "8.11.0", + "@zowe/zos-workflows-for-zowe-sdk": "8.11.0", + "@zowe/zosmf-for-zowe-sdk": "8.11.0", "find-process": "1.4.7", "lodash": "4.17.21", "minimatch": "9.0.5", @@ -2402,13 +2403,13 @@ "node": ">=18.12.0" }, "optionalDependencies": { - "@zowe/secrets-for-zowe-sdk": "8.1.2" + "@zowe/secrets-for-zowe-sdk": "8.10.4" } }, "node_modules/@zowe/cli-test-utils": { - "version": "8.10.3", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@zowe/cli-test-utils/-/cli-test-utils-8.10.3.tgz", - "integrity": "sha512-mX8ZX/648PVUfrqzOJP6784BNu5vj1GfMGIF9PLUFSPVuqNP1ArKWc4enG1RCUBBA0idM7touVIjmIAjERPaRQ==", + "version": "8.11.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@zowe/cli-test-utils/-/cli-test-utils-8.11.0.tgz", + "integrity": "sha512-0Mav0JoE0djVbj8B4p7C9zuuSe92X3OzIMDnFDYdONQqGibU/7fOZVDgQZzMHxG8moQPxCZ3z7e7Q9RmS7s8TA==", "dev": true, "license": "EPL-2.0", "dependencies": { @@ -2446,7 +2447,7 @@ }, "node_modules/@zowe/cli/node_modules/@isaacs/cliui": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, "license": "ISC", @@ -2464,7 +2465,7 @@ }, "node_modules/@zowe/cli/node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/ansi-regex/-/ansi-regex-6.1.0.tgz", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", @@ -2477,7 +2478,7 @@ }, "node_modules/@zowe/cli/node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "license": "MIT", @@ -2490,14 +2491,14 @@ }, "node_modules/@zowe/cli/node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, "license": "MIT" }, "node_modules/@zowe/cli/node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "license": "MIT", @@ -2515,7 +2516,7 @@ }, "node_modules/@zowe/cli/node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "license": "MIT", @@ -2531,7 +2532,7 @@ }, "node_modules/@zowe/cli/node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "license": "MIT", @@ -2722,7 +2723,7 @@ }, "node_modules/@zowe/cli/node_modules/@pkgjs/parseargs": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, "license": "MIT", @@ -2969,9 +2970,9 @@ "license": "MIT" }, "node_modules/@zowe/cli/node_modules/@zowe/core-for-zowe-sdk": { - "version": "8.10.3", - "resolved": "https://registry.npmjs.org/@zowe/core-for-zowe-sdk/-/core-for-zowe-sdk-8.10.3.tgz", - "integrity": "sha512-D/6fSb8ThYTq7s7k6fbhjJnKasG8Wh2RJV5sJWIu3D6Mi8mrChGv6kWwW0/D8468ibgBlMjhYv9sZElVVqCnYw==", + "version": "8.11.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@zowe/core-for-zowe-sdk/-/core-for-zowe-sdk-8.11.0.tgz", + "integrity": "sha512-/JDaGlNL73P/HsFPnqh6052hMSsoONuHPCHk1ZFPcCoSO7Ca7yRKx2HTvHuBl8VLne/6ekK7J8FgRbdmn70pZw==", "dev": true, "dependencies": { "comment-json": "~4.2.3", @@ -2985,9 +2986,9 @@ } }, "node_modules/@zowe/cli/node_modules/@zowe/imperative": { - "version": "8.10.3", - "resolved": "https://registry.npmjs.org/@zowe/imperative/-/imperative-8.10.3.tgz", - "integrity": "sha512-nW1zIfiVFmLHfEyMnnihpokYhajotqM78bTC8FbRlZbSNNMmqRwleXDqSACLr6EZutXo9LvOX+USEtfemMt5iQ==", + "version": "8.11.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@zowe/imperative/-/imperative-8.11.0.tgz", + "integrity": "sha512-fC6xYibqzJiJQPLw99SRuoRH6gZRMZOtNEN76PlbCyUNEFmxaHaY75qOqRaVzp3svVdMpGB5DixQZtSUQ3PJMQ==", "dev": true, "dependencies": { "@types/yargs": "^17.0.32", @@ -3033,7 +3034,7 @@ }, "node_modules/@zowe/cli/node_modules/@zowe/imperative/node_modules/agent-base": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/agent-base/-/agent-base-7.1.3.tgz", "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, "engines": { @@ -3042,7 +3043,7 @@ }, "node_modules/@zowe/cli/node_modules/@zowe/imperative/node_modules/diff": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/diff/-/diff-5.2.0.tgz", "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true, "engines": { @@ -3051,7 +3052,7 @@ }, "node_modules/@zowe/cli/node_modules/@zowe/imperative/node_modules/diff2html": { "version": "3.4.20-usewontache.1.60e7a2e", - "resolved": "https://registry.npmjs.org/diff2html/-/diff2html-3.4.20-usewontache.1.60e7a2e.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/diff2html/-/diff2html-3.4.20-usewontache.1.60e7a2e.tgz", "integrity": "sha512-0ge1jQpRv9Eg6USdIgnDIzAnuhhlgFPmhglCUBNhSVU772biWWbSu/palu0uK+PbgidjkjkajztZGVAZnD56pw==", "dev": true, "dependencies": { @@ -3067,7 +3068,7 @@ }, "node_modules/@zowe/cli/node_modules/@zowe/imperative/node_modules/diff2html/node_modules/diff": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/diff/-/diff-5.1.0.tgz", "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", "dev": true, "engines": { @@ -3076,7 +3077,7 @@ }, "node_modules/@zowe/cli/node_modules/@zowe/imperative/node_modules/highlight.js": { "version": "11.6.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.6.0.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/highlight.js/-/highlight.js-11.6.0.tgz", "integrity": "sha512-ig1eqDzJaB0pqEvlPVIpSSyMaO92bH1N2rJpLMN/nX396wTpDA4Eq0uK+7I/2XG17pFaaKE0kjV/XPeGt7Evjw==", "dev": true, "optional": true, @@ -3086,7 +3087,7 @@ }, "node_modules/@zowe/cli/node_modules/@zowe/imperative/node_modules/http-proxy-agent": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "dependencies": { @@ -3099,7 +3100,7 @@ }, "node_modules/@zowe/cli/node_modules/@zowe/imperative/node_modules/https-proxy-agent": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "dependencies": { @@ -3111,9 +3112,9 @@ } }, "node_modules/@zowe/cli/node_modules/@zowe/provisioning-for-zowe-sdk": { - "version": "8.10.3", - "resolved": "https://registry.npmjs.org/@zowe/provisioning-for-zowe-sdk/-/provisioning-for-zowe-sdk-8.10.3.tgz", - "integrity": "sha512-m99bnmr6bM6+XOTPe+6cAD8Bj/EjmL4v8KfLgc6zUYku46ifZKLoAftfEylTAkNyBTnDykc5ypLLwf/bYPOc+w==", + "version": "8.11.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@zowe/provisioning-for-zowe-sdk/-/provisioning-for-zowe-sdk-8.11.0.tgz", + "integrity": "sha512-5Yt4NbSiIF4OHq5JKJwf90M8eBTnL0fOXpvZgg4LqsuIhkFV9XxEfaeYyD+mPOaBzNpdWlQREqLhgbHPMY+4mw==", "dev": true, "dependencies": { "js-yaml": "^4.1.0" @@ -3127,9 +3128,9 @@ } }, "node_modules/@zowe/cli/node_modules/@zowe/secrets-for-zowe-sdk": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@zowe/secrets-for-zowe-sdk/-/secrets-for-zowe-sdk-8.1.2.tgz", - "integrity": "sha512-cE8rlBADL48wmiQr+fdQdxczW4wLsmv5BQa03QepKiydBBE7TLrG2Anx/F4uZ+sVIZQuN95SHvwkt8VZaTzuyw==", + "version": "8.10.4", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@zowe/secrets-for-zowe-sdk/-/secrets-for-zowe-sdk-8.10.4.tgz", + "integrity": "sha512-dsaWVGkeaYcvDd72fOuxi4c3zYoP9AYdQyaqAUu/9NyCVLZJ99B+DsUmTnTCBbr7iUJArPlGU2ydsbjf0wOR1A==", "dev": true, "hasInstallScript": true, "optional": true, @@ -3138,9 +3139,9 @@ } }, "node_modules/@zowe/cli/node_modules/@zowe/zos-console-for-zowe-sdk": { - "version": "8.10.3", - "resolved": "https://registry.npmjs.org/@zowe/zos-console-for-zowe-sdk/-/zos-console-for-zowe-sdk-8.10.3.tgz", - "integrity": "sha512-xiBycBQV6It8gYJfcORWpFITurZgxSqA+x+aOF+aoKqVlZLri47RHqos1plbu9SV5jMXnMeZ7dMHynhhjUcQmA==", + "version": "8.11.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@zowe/zos-console-for-zowe-sdk/-/zos-console-for-zowe-sdk-8.11.0.tgz", + "integrity": "sha512-AHFpKzQf+dxr659Wuw2NOS8KcJn2m5WDmQJUrrMV9dOP9jj4pjF5TlBZHFoxWjPZACefuS23Ybm3dvBb6lEp2A==", "dev": true, "engines": { "node": ">=18.12.0" @@ -3151,9 +3152,9 @@ } }, "node_modules/@zowe/cli/node_modules/@zowe/zos-files-for-zowe-sdk": { - "version": "8.10.3", - "resolved": "https://registry.npmjs.org/@zowe/zos-files-for-zowe-sdk/-/zos-files-for-zowe-sdk-8.10.3.tgz", - "integrity": "sha512-mikyA7hPk1PCyTHnYdCsjV30o4vXQEEn5HtWNlYCwt+LkdPEnOvNa2rHCgXYCuUd3K6/qgUHKvnV+Zr1PNNCBg==", + "version": "8.11.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@zowe/zos-files-for-zowe-sdk/-/zos-files-for-zowe-sdk-8.11.0.tgz", + "integrity": "sha512-CGvYtPhG16vOIIcWF+PNW9IrArMpFmUVD516m3Ic0CA2smTKWGBf2paIPeZUjZNNfNudQYGCXXpMtHri5/LIeg==", "dev": true, "dependencies": { "lodash": "^4.17.21", @@ -3168,12 +3169,12 @@ } }, "node_modules/@zowe/cli/node_modules/@zowe/zos-jobs-for-zowe-sdk": { - "version": "8.10.3", - "resolved": "https://registry.npmjs.org/@zowe/zos-jobs-for-zowe-sdk/-/zos-jobs-for-zowe-sdk-8.10.3.tgz", - "integrity": "sha512-B/A5mASv6sVos+wl6CKHMkbqUpeO2BggCLhgT+g1NwTDd0TCmXLbntaPDCAdJ67PpvgniHOyaKJLtVGT4C6vyQ==", + "version": "8.11.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@zowe/zos-jobs-for-zowe-sdk/-/zos-jobs-for-zowe-sdk-8.11.0.tgz", + "integrity": "sha512-S7x8GY/QZY++rlA9k0a+usJ75OIO4r3edTHkVXVnjgi/vuQptUYXNQCXYpSwjCVh5R/PkSkLSSWA0gnnVTfKdw==", "dev": true, "dependencies": { - "@zowe/zos-files-for-zowe-sdk": "8.10.3" + "@zowe/zos-files-for-zowe-sdk": "8.11.0" }, "engines": { "node": ">=18.12.0" @@ -3184,9 +3185,9 @@ } }, "node_modules/@zowe/cli/node_modules/@zowe/zos-logs-for-zowe-sdk": { - "version": "8.10.3", - "resolved": "https://registry.npmjs.org/@zowe/zos-logs-for-zowe-sdk/-/zos-logs-for-zowe-sdk-8.10.3.tgz", - "integrity": "sha512-zXntyCVV+lBh1WRAOWdJgQsUO8eb4G86tfbo1BYbkXGje7CtaJY1ng4Qa4o0GH3i2RkUGjlR4AhqV2NMVYeGqw==", + "version": "8.11.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@zowe/zos-logs-for-zowe-sdk/-/zos-logs-for-zowe-sdk-8.11.0.tgz", + "integrity": "sha512-EQ2kvuBWkL0zZxfFB6JgmkT7cytoz3WzfVv7WfbTy2XrB4x+cMNK2lGVj8jii+4whLgwaoVitjHq8R/7nIqGzA==", "dev": true, "engines": { "node": ">=18.12.0" @@ -3197,12 +3198,12 @@ } }, "node_modules/@zowe/cli/node_modules/@zowe/zos-tso-for-zowe-sdk": { - "version": "8.10.3", - "resolved": "https://registry.npmjs.org/@zowe/zos-tso-for-zowe-sdk/-/zos-tso-for-zowe-sdk-8.10.3.tgz", - "integrity": "sha512-fD/7N0w9PWWq85CnHvcieL5ot3UI3N2s8RSdGUhkfA1VGRJ4uLvrkCECf1QxRbbKUSaWBP538ZkgmU4wRiVWMg==", + "version": "8.11.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@zowe/zos-tso-for-zowe-sdk/-/zos-tso-for-zowe-sdk-8.11.0.tgz", + "integrity": "sha512-R/AUt0sNcw75c+4/hmUG0x9dKLdpWg62Q67TzEKS2nIWCD2sAE9oS5m/wTd6xrEKFFavVBAqmet2KzX6RS9hvw==", "dev": true, "dependencies": { - "@zowe/zosmf-for-zowe-sdk": "8.10.3" + "@zowe/zosmf-for-zowe-sdk": "8.11.0" }, "engines": { "node": ">=18.12.0" @@ -3213,9 +3214,9 @@ } }, "node_modules/@zowe/cli/node_modules/@zowe/zos-uss-for-zowe-sdk": { - "version": "8.10.3", - "resolved": "https://registry.npmjs.org/@zowe/zos-uss-for-zowe-sdk/-/zos-uss-for-zowe-sdk-8.10.3.tgz", - "integrity": "sha512-ivkVPtIiiNSHP3WlnGNqBx+uLa9pFEQJ8Qa5/fTpw1oHPDaP6Wu5oj1rAk0U9F+1AM80BYOpM/ioD4EVd5ufyw==", + "version": "8.11.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@zowe/zos-uss-for-zowe-sdk/-/zos-uss-for-zowe-sdk-8.11.0.tgz", + "integrity": "sha512-wMjKCtAZaX9E6DyVE1zHhJW+Lr79v8UJTl7p5wvCgfLmQyw7yrJOD83yYvTo/maT2E0pTe6jIuFtCnOW5Ic9Gg==", "dev": true, "dependencies": { "ssh2": "^1.15.0" @@ -3228,12 +3229,12 @@ } }, "node_modules/@zowe/cli/node_modules/@zowe/zos-workflows-for-zowe-sdk": { - "version": "8.10.3", - "resolved": "https://registry.npmjs.org/@zowe/zos-workflows-for-zowe-sdk/-/zos-workflows-for-zowe-sdk-8.10.3.tgz", - "integrity": "sha512-AoSIjJbiAq9AsLJh2+99FogrnepRuVMX8sdFpbMtZdDBEN4B5O55MeeKplTZ4w4V9ANzhPigky6C79TuHLDhCQ==", + "version": "8.11.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@zowe/zos-workflows-for-zowe-sdk/-/zos-workflows-for-zowe-sdk-8.11.0.tgz", + "integrity": "sha512-LJm5S6FyJ/0rgj1kaaVRo5LbZRHqymQrTLe0U7rVj5Ay5JaLMC37PpmZRjqYll6KporMQe6c/dj7cIkVZWGIJw==", "dev": true, "dependencies": { - "@zowe/zos-files-for-zowe-sdk": "8.10.3" + "@zowe/zos-files-for-zowe-sdk": "8.11.0" }, "engines": { "node": ">=18.12.0" @@ -3244,9 +3245,9 @@ } }, "node_modules/@zowe/cli/node_modules/@zowe/zosmf-for-zowe-sdk": { - "version": "8.10.3", - "resolved": "https://registry.npmjs.org/@zowe/zosmf-for-zowe-sdk/-/zosmf-for-zowe-sdk-8.10.3.tgz", - "integrity": "sha512-MdpBFXI8ntfl9clDD6YMuT4QNJJzssbEsFfzOQ2d/H8Q5REuyuq5zD/apJlJj+8pS/H88Uyrzlov73yQ8glIew==", + "version": "8.11.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@zowe/zosmf-for-zowe-sdk/-/zosmf-for-zowe-sdk-8.11.0.tgz", + "integrity": "sha512-CDC58MdD8vockE7y9Jnj7HcLx9kfWpak+NcuFAFOOzMQJxKGtCCXtj/2YpUQuhB9Rs2xy8YSdQMQWhCd4vQRfw==", "dev": true, "engines": { "node": ">=18.12.0" @@ -3270,7 +3271,7 @@ }, "node_modules/@zowe/cli/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", @@ -3446,7 +3447,7 @@ }, "node_modules/@zowe/cli/node_modules/cross-spawn": { "version": "7.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/cross-spawn/-/cross-spawn-7.0.5.tgz", "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", "dev": true, "license": "MIT", @@ -3461,13 +3462,13 @@ }, "node_modules/@zowe/cli/node_modules/cross-spawn/node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "node_modules/@zowe/cli/node_modules/cross-spawn/node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { @@ -3530,7 +3531,7 @@ }, "node_modules/@zowe/cli/node_modules/eastasianwidth": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, "license": "MIT" @@ -3745,7 +3746,7 @@ }, "node_modules/@zowe/cli/node_modules/glob": { "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/glob/-/glob-10.4.5.tgz", "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "license": "ISC", @@ -3777,7 +3778,7 @@ }, "node_modules/@zowe/cli/node_modules/glob/node_modules/minipass": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "license": "ISC", @@ -3908,7 +3909,7 @@ }, "node_modules/@zowe/cli/node_modules/isexe": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/isexe/-/isexe-3.1.1.tgz", "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, "engines": { @@ -3917,7 +3918,7 @@ }, "node_modules/@zowe/cli/node_modules/jackspeak": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "license": "BlueOak-1.0.0", @@ -4089,7 +4090,7 @@ }, "node_modules/@zowe/cli/node_modules/micromatch": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { @@ -4102,7 +4103,7 @@ }, "node_modules/@zowe/cli/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { @@ -4117,7 +4118,7 @@ }, "node_modules/@zowe/cli/node_modules/minimatch/node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { @@ -5232,7 +5233,7 @@ "node_modules/@zowe/cli/node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", @@ -5259,7 +5260,7 @@ "node_modules/@zowe/cli/node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", @@ -5517,7 +5518,7 @@ }, "node_modules/@zowe/cli/node_modules/which": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/which/-/which-4.0.0.tgz", "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, "dependencies": { @@ -5557,7 +5558,7 @@ "node_modules/@zowe/cli/node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", @@ -5631,9 +5632,9 @@ } }, "node_modules/@zowe/imperative": { - "version": "8.10.3", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@zowe/imperative/-/imperative-8.10.3.tgz", - "integrity": "sha512-nW1zIfiVFmLHfEyMnnihpokYhajotqM78bTC8FbRlZbSNNMmqRwleXDqSACLr6EZutXo9LvOX+USEtfemMt5iQ==", + "version": "8.11.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/@zowe/imperative/-/imperative-8.11.0.tgz", + "integrity": "sha512-fC6xYibqzJiJQPLw99SRuoRH6gZRMZOtNEN76PlbCyUNEFmxaHaY75qOqRaVzp3svVdMpGB5DixQZtSUQ3PJMQ==", "dev": true, "license": "EPL-2.0", "dependencies": { @@ -7173,19 +7174,19 @@ } }, "node_modules/eslint": { - "version": "9.17.0", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/eslint/-/eslint-9.17.0.tgz", - "integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==", + "version": "9.18.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/eslint/-/eslint-9.18.0.tgz", + "integrity": "sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.9.0", + "@eslint/core": "^0.10.0", "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.17.0", - "@eslint/plugin-kit": "^0.2.3", + "@eslint/js": "9.18.0", + "@eslint/plugin-kit": "^0.2.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.1", @@ -7233,9 +7234,9 @@ } }, "node_modules/eslint-plugin-jest": { - "version": "28.10.0", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/eslint-plugin-jest/-/eslint-plugin-jest-28.10.0.tgz", - "integrity": "sha512-hyMWUxkBH99HpXT3p8hc7REbEZK3D+nk8vHXGgpB+XXsi0gO4PxMSP+pjfUzb67GnV9yawV9a53eUmcde1CCZA==", + "version": "28.11.0", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/eslint-plugin-jest/-/eslint-plugin-jest-28.11.0.tgz", + "integrity": "sha512-QAfipLcNCWLVocVbZW8GimKn5p5iiMcgGbRzz8z/P5q7xw+cNEpYqyzFMtIF/ZgF2HLOyy+dYBut+DoYolvqig==", "dev": true, "license": "MIT", "dependencies": { @@ -12038,9 +12039,9 @@ } }, "node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://zowe.jfrog.io/artifactory/api/npm/npm-org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "license": "Apache-2.0", "bin": { diff --git a/zowe-cli-id-federation-plugin/package.json b/zowe-cli-id-federation-plugin/package.json index 768338811a..1b4a7cef9b 100644 --- a/zowe-cli-id-federation-plugin/package.json +++ b/zowe-cli-id-federation-plugin/package.json @@ -49,18 +49,18 @@ "csv-parse": "5.6.0" }, "devDependencies": { - "@eslint/js": "9.17.0", + "@eslint/js": "9.18.0", "@types/jest": "29.5.14", - "@types/node": "20.17.12", - "@typescript-eslint/eslint-plugin": "8.19.1", - "@typescript-eslint/parser": "8.19.1", - "@zowe/cli": "8.10.3", - "@zowe/cli-test-utils": "8.10.3", - "@zowe/imperative": "8.10.3", + "@types/node": "20.17.14", + "@typescript-eslint/eslint-plugin": "8.20.0", + "@typescript-eslint/parser": "8.20.0", + "@zowe/cli": "8.11.0", + "@zowe/cli-test-utils": "8.11.0", + "@zowe/imperative": "8.11.0", "copyfiles": "2.4.1", "env-cmd": "10.1.0", - "eslint": "9.17.0", - "eslint-plugin-jest": "28.10.0", + "eslint": "9.18.0", + "eslint-plugin-jest": "28.11.0", "eslint-plugin-license-header": "0.6.1", "eslint-plugin-unused-imports": "4.1.4", "globals": "15.14.0", @@ -76,13 +76,13 @@ "ts-jest": "29.2.5", "ts-node": "10.9.2", "typedoc": "0.27.6", - "typescript": "5.7.2" + "typescript": "5.7.3" }, "overrides": { - "@babel/traverse": "7.26.4" + "@babel/traverse": "7.26.5" }, "peerDependencies": { - "@zowe/imperative": "8.10.3" + "@zowe/imperative": "8.11.0" }, "engines": { "npm": "=10.9.2",