From e8c1a42da769647f0ce39b2b79d51673b183561b Mon Sep 17 00:00:00 2001 From: Paul Richardson Date: Wed, 9 Oct 2024 13:46:25 +0100 Subject: [PATCH] fix: Upgrade of hawtio/react to 1.5.0 * With this upgrade, the transport method of jolokia requests has been changed from jquery to fetch. This meant a number of changes in the development server in order to continue working. * management-service.ts * Rather than just blindly connect to a target app, try testing the connection first and if it fails do not change location / open a new browser tab but notify the user with the event service * oauth/[....]service.ts * Mandate a Content-Type of application/json when using fetch. Due to CORS this is not possible when actually calling fetch(uri, { headers }) * Ensure when regsitering the fetch interceptor that the headers that have been created are not overwritten by any headers already contained in the requestConfig. * webpack.config.dev.js * Re-implements management endpoint to conduct a sub-request using fetch to the master endpoint rather than redirecting. The fetch function appears to not redirect correctly when a Content-Length header is specified * Implementing a sub-request is the same way that the gateway component solves this issue * Ensures the token is passed to the sub-request * Logs whether the request body has been incorrectly parsed empty by the Express server in the webpack-dev-server. --- packages/kubernetes-api-app/package.json | 2 +- packages/kubernetes-api/package.json | 2 +- packages/management-api-app/package.json | 2 +- packages/management-api/package.json | 2 +- .../management-api/src/management-service.ts | 29 +- packages/oauth-app/package.json | 2 +- packages/oauth/package.json | 2 +- packages/oauth/src/form/form-service.ts | 15 +- .../oauth/src/openshift/osoauth-service.ts | 13 +- packages/online-shell/package.json | 2 +- packages/online-shell/webpack.config.dev.js | 79 ++++- yarn.lock | 299 ++++++++---------- 12 files changed, 271 insertions(+), 178 deletions(-) diff --git a/packages/kubernetes-api-app/package.json b/packages/kubernetes-api-app/package.json index 16f7ecb3..d6da8174 100644 --- a/packages/kubernetes-api-app/package.json +++ b/packages/kubernetes-api-app/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@hawtio/online-kubernetes-api": "workspace:*", - "@hawtio/react": "^1.3.0", + "@hawtio/react": "^1.5.0", "@patternfly/react-core": "^5.3.3", "@patternfly/react-styles": "^5.3.1", "@patternfly/react-table": "^5.3.3", diff --git a/packages/kubernetes-api/package.json b/packages/kubernetes-api/package.json index 33496eeb..981beb7e 100644 --- a/packages/kubernetes-api/package.json +++ b/packages/kubernetes-api/package.json @@ -29,7 +29,7 @@ }, "dependencies": { "@hawtio/online-oauth": "workspace:*", - "@hawtio/react": "^1.3.0", + "@hawtio/react": "^1.5.0", "@types/jquery": "^3.5.30", "@types/jsonpath": "^0.2.4", "@types/node": "^20.14.9", diff --git a/packages/management-api-app/package.json b/packages/management-api-app/package.json index 91d56448..525acf6b 100644 --- a/packages/management-api-app/package.json +++ b/packages/management-api-app/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@hawtio/online-management-api": "workspace:*", - "@hawtio/react": "^1.3.0", + "@hawtio/react": "^1.5.0", "@patternfly/react-core": "^5.3.3", "@patternfly/react-styles": "^5.3.1", "@patternfly/react-table": "^5.3.3", diff --git a/packages/management-api/package.json b/packages/management-api/package.json index b0aac75a..9a11609b 100644 --- a/packages/management-api/package.json +++ b/packages/management-api/package.json @@ -30,7 +30,7 @@ }, "dependencies": { "@hawtio/online-kubernetes-api": "workspace:*", - "@hawtio/react": "^1.3.0", + "@hawtio/react": "^1.5.0", "eventemitter3": "^5.0.1", "jolokia.js": "^2.1.7", "jquery": "^3.7.0", diff --git a/packages/management-api/src/management-service.ts b/packages/management-api/src/management-service.ts index 7f241a15..e2bacb07 100644 --- a/packages/management-api/src/management-service.ts +++ b/packages/management-api/src/management-service.ts @@ -1,6 +1,6 @@ import { EventEmitter } from 'eventemitter3' import { ManagedPod } from './managed-pod' -import { Connection, Connections, connectService } from '@hawtio/react' +import { Connection, ConnectionTestResult, Connections, connectService, eventService } from '@hawtio/react' import { k8Service, k8Api, @@ -389,7 +389,32 @@ export class ManagementService extends EventEmitter implements Paging { return } - connectService.connect(connection) + connectService + .testConnection(connection) + .then((result: ConnectionTestResult) => { + if (result.status !== 'reachable') { + const msg = `There was a problem connecting to the jolokia service ${connectName}` + log.error(msg) + eventService.notify({ type: 'danger', message: msg }) + return + } + + if (result.message.includes('auth failed')) { + const msg = `A problem occurred with authentication while trying to connect to the jolokia service ${connectName}` + log.error(msg) + eventService.notify({ type: 'danger', message: msg }) + return + } + + connectService.connect(connection) + }) + .catch(error => { + const msg = `A problem occurred while trying to connect to the jolokia service ${connectName}` + log.error(msg) + log.error(error) + eventService.notify({ type: 'danger', message: msg }) + return + }) } /******************** diff --git a/packages/oauth-app/package.json b/packages/oauth-app/package.json index b76ff385..17209865 100644 --- a/packages/oauth-app/package.json +++ b/packages/oauth-app/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@hawtio/online-oauth": "workspace:*", - "@hawtio/react": "^1.3.0", + "@hawtio/react": "^1.5.0", "@patternfly/react-core": "^5.3.1", "@patternfly/react-styles": "^5.3.0", "@patternfly/react-table": "^5.3.1", diff --git a/packages/oauth/package.json b/packages/oauth/package.json index 7e41862d..a119f503 100644 --- a/packages/oauth/package.json +++ b/packages/oauth/package.json @@ -29,7 +29,7 @@ "prepack": "yarn build && yarn replace-version" }, "dependencies": { - "@hawtio/react": "^1.3.0", + "@hawtio/react": "^1.5.0", "@thumbmarkjs/thumbmarkjs": "^0.14.8", "babel-jest": "^29.6.1", "fetch-intercept": "^2.4.0", diff --git a/packages/oauth/src/form/form-service.ts b/packages/oauth/src/form/form-service.ts index 58792717..f2298a30 100644 --- a/packages/oauth/src/form/form-service.ts +++ b/packages/oauth/src/form/form-service.ts @@ -23,6 +23,7 @@ type LoginOptions = { interface Headers { Authorization: string + 'Content-Type': string 'X-XSRF-TOKEN'?: string } @@ -122,11 +123,13 @@ export class FormService implements OAuthProtoService { log.debug('Intercept Fetch API to attach auth token to authorization header') this.fetchUnregister = fetchIntercept.register({ - request: (url, config) => { + request: (url, requestConfig) => { log.debug('Fetch intercepted for oAuth authentication') + // Include any requestConfig headers to ensure they are retained let headers: Headers = { Authorization: `Bearer ${this.userProfile.getToken()}`, + 'Content-Type': 'application/json', } // For CSRF protection with Spring Security @@ -139,7 +142,15 @@ export class FormService implements OAuthProtoService { } } - return [url, { headers, ...config }] + /* + * if requestConfig exists and already has a set of headers + */ + if (requestConfig && requestConfig.headers) { + headers = { ...requestConfig.headers, ...headers } + } + + // headers must be 2nd so that it overwrites headers property in requestConfig + return [url, { ...requestConfig, headers }] }, }) } diff --git a/packages/oauth/src/openshift/osoauth-service.ts b/packages/oauth/src/openshift/osoauth-service.ts index 6d454ac4..c7d5eb9c 100644 --- a/packages/oauth/src/openshift/osoauth-service.ts +++ b/packages/oauth/src/openshift/osoauth-service.ts @@ -36,6 +36,7 @@ interface UserObject { interface Headers { Authorization: string + 'Content-Type': string 'X-XSRF-TOKEN'?: string } @@ -120,8 +121,10 @@ export class OSOAuthService implements OAuthProtoService { this.doLogout(config) } + // Include any requestConfig headers to ensure they are retained let headers: Headers = { Authorization: `Bearer ${this.userProfile.getToken()}`, + 'Content-Type': 'application/json', } // For CSRF protection with Spring Security @@ -134,7 +137,15 @@ export class OSOAuthService implements OAuthProtoService { } } - return [url, { headers, ...requestConfig }] + /* + * if requestConfig exists and already has a set of headers + */ + if (requestConfig && requestConfig.headers) { + headers = { ...requestConfig.headers, ...headers } + } + + // headers must be 2nd so that it overwrites headers property in requestConfig + return [url, { ...requestConfig, headers }] }, }) } diff --git a/packages/online-shell/package.json b/packages/online-shell/package.json index a1d268c6..f7ebe703 100644 --- a/packages/online-shell/package.json +++ b/packages/online-shell/package.json @@ -36,7 +36,7 @@ "@hawtio/online-kubernetes-api": "workspace:*", "@hawtio/online-management-api": "workspace:*", "@hawtio/online-oauth": "workspace:*", - "@hawtio/react": "^1.3.0", + "@hawtio/react": "^1.5.0", "@patternfly/react-core": "^5.3.3", "@patternfly/react-styles": "^5.3.1", "@types/node": "^20.14.9", diff --git a/packages/online-shell/webpack.config.dev.js b/packages/online-shell/webpack.config.dev.js index 4341742c..90b725a0 100644 --- a/packages/online-shell/webpack.config.dev.js +++ b/packages/online-shell/webpack.config.dev.js @@ -6,6 +6,7 @@ const historyApiFallback = require('connect-history-api-fallback') const path = require('path') const url = require('url') const dotenv = require('dotenv') +const express = require('express') const { common } = require('./webpack.config.common.js') // this will update the process.env with environment variables in .env file @@ -121,6 +122,15 @@ module.exports = (env, argv) => { throw new Error('webpack-dev-server is not defined') } + /* + * Ensure that dev server properly handles json in request body + * Important to keep a high limit as the default of 100kb can be + * exceeded by request bodies resulting in the parser transmitting + * an empty body. + */ + devServer.app.use(express.json({ type: '*/json', limit: '50mb', strict: false })) + devServer.app.use(express.urlencoded({ extended: false })) + // Redirect / or /${publicPath} to /${publicPath}/ devServer.app.get('/', (_, res) => res.redirect(`${publicPath}/`)) devServer.app.get(`/${publicPath}$`, (_, res) => res.redirect(`${publicPath}/`)) @@ -193,16 +203,75 @@ module.exports = (env, argv) => { } /* Redirects from management alias path to full master path */ - const management = (req, res, next) => { + const management = async (req, res, next) => { const url = /\/management\/namespaces\/(.+)\/pods\/(http|https):([^/]+)\/(.+)/ const match = req.originalUrl.match(url) const redirectPath = `/master/api/v1/namespaces/${match[1]}/pods/${match[2]}:${match[3]}/proxy/${match[4]}` - if (match) { - // 307 - post redirect - res.redirect(307, redirectPath) - } else { + if (!match) { next() } + + /* + * Redirect will no longer work since fetch is being used by + * jolokia instead and request contains Content-Length header. + * So perform a sub-request instead on master to return the + * correct response + */ + const origin = `http://localhost:${devPort}` + const uri = `${origin}${redirectPath}` + + /* + * Ensure the authorization token is passed to the sub request + */ + const headers = new Headers({ + Authorization: req.get('Authorization'), + }) + + let response + if (req.method === 'GET') { + response = await fetch(uri, { + method: req.method, + headers: headers, + }) + } else { + const body = req.body + const isEmptyObject = typeof body === 'object' && Object.keys(body).length === 0 + const isEmptyArray = Array.isArray(body) && body.length === 0 + + let msg + if (!body) { + msg = `Error (dev-server): undefined body found in POST request ${redirectPath}` + console.warn(msg, body) + } else if (isEmptyArray) { + msg = `Error (dev-server): empty body array found in POST request ${redirectPath}` + console.warn(msg, body) + } else if (isEmptyObject) { + msg = `Error (dev-server): empty body object found in POST request ${redirectPath}` + console.warn(msg, body) + } else { + console.log(`Body in request ${redirectPath} to be passed to master`, body) + } + + response = await fetch(uri, { + method: req.method, + body: JSON.stringify(body), + headers: headers, + }) + } + + if (!response.ok) { + res.status(response.status).send(response.statusText) + } else { + var data + try { + data = await response.json() + } catch (error) { + console.error('Error (dev-server): error response from master: ', error) + data = await response.text() + } + + res.status(response.status).send(data) + } } const username = 'developer' diff --git a/yarn.lock b/yarn.lock index 9076e113..f9bc211c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1553,7 +1553,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.16.3, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.9.2": +"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.16.3, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.8.4": version: 7.23.2 resolution: "@babel/runtime@npm:7.23.2" dependencies: @@ -2003,20 +2003,20 @@ __metadata: languageName: node linkType: hard -"@hawtio/camel-model-v4_0@npm:@hawtio/camel-model@~4.0.5": - version: 4.0.5 - resolution: "@hawtio/camel-model@npm:4.0.5" - checksum: 10/840067de757419c71350755e7996636698315e5b8c455cca4ec3279c50e7e85fca81a6281160e6f17aee0eaf818ae7d96dd4db48e6b89ea6a3f29a8976d14e76 - languageName: node - linkType: hard - -"@hawtio/camel-model-v4_4@npm:@hawtio/camel-model@~4.4.2": +"@hawtio/camel-model-v4_4@npm:@hawtio/camel-model@~4.4.3": version: 4.4.3 resolution: "@hawtio/camel-model@npm:4.4.3" checksum: 10/60bb20f1f94cf7d29e16f34e70e5e8dbe89e547b28f3fd2293780b4667f8b49af5e0cbba285123e0f58a65565d880ba43f7921ac226e1a3918a4dfc975115cdf languageName: node linkType: hard +"@hawtio/camel-model-v4_8@npm:@hawtio/camel-model@~4.8.0": + version: 4.8.0 + resolution: "@hawtio/camel-model@npm:4.8.0" + checksum: 10/be8957b13ce4ac66ce60a59590edfb23b40f7ad9b38754655d1f6f8c23dd803b7c9e5bad0cce89bc771a2f7fff33477c97140d78b86e9b29213e475d2be26ae8 + languageName: node + linkType: hard + "@hawtio/gateway@workspace:docker/gateway": version: 0.0.0-use.local resolution: "@hawtio/gateway@workspace:docker/gateway" @@ -2074,7 +2074,7 @@ __metadata: resolution: "@hawtio/online-kubernetes-api-app@workspace:packages/kubernetes-api-app" dependencies: "@hawtio/online-kubernetes-api": "workspace:*" - "@hawtio/react": "npm:^1.3.0" + "@hawtio/react": "npm:^1.5.0" "@patternfly/react-core": "npm:^5.3.3" "@patternfly/react-styles": "npm:^5.3.1" "@patternfly/react-table": "npm:^5.3.3" @@ -2112,7 +2112,7 @@ __metadata: resolution: "@hawtio/online-kubernetes-api@workspace:packages/kubernetes-api" dependencies: "@hawtio/online-oauth": "workspace:*" - "@hawtio/react": "npm:^1.3.0" + "@hawtio/react": "npm:^1.5.0" "@testing-library/jest-dom": "npm:^6.5.0" "@types/jest": "npm:^29.5.12" "@types/jquery": "npm:^3.5.30" @@ -2144,7 +2144,7 @@ __metadata: resolution: "@hawtio/online-management-api-app@workspace:packages/management-api-app" dependencies: "@hawtio/online-management-api": "workspace:*" - "@hawtio/react": "npm:^1.3.0" + "@hawtio/react": "npm:^1.5.0" "@patternfly/react-core": "npm:^5.3.3" "@patternfly/react-styles": "npm:^5.3.1" "@patternfly/react-table": "npm:^5.3.3" @@ -2182,7 +2182,7 @@ __metadata: resolution: "@hawtio/online-management-api@workspace:packages/management-api" dependencies: "@hawtio/online-kubernetes-api": "workspace:*" - "@hawtio/react": "npm:^1.3.0" + "@hawtio/react": "npm:^1.5.0" "@types/jest": "npm:^29.5.12" "@types/jquery": "npm:^3.5.30" "@types/jsonpath": "npm:^0.2.4" @@ -2213,7 +2213,7 @@ __metadata: resolution: "@hawtio/online-oauth-app@workspace:packages/oauth-app" dependencies: "@hawtio/online-oauth": "workspace:*" - "@hawtio/react": "npm:^1.3.0" + "@hawtio/react": "npm:^1.5.0" "@patternfly/react-core": "npm:^5.3.1" "@patternfly/react-styles": "npm:^5.3.0" "@patternfly/react-table": "npm:^5.3.1" @@ -2252,7 +2252,7 @@ __metadata: version: 0.0.0-use.local resolution: "@hawtio/online-oauth@workspace:packages/oauth" dependencies: - "@hawtio/react": "npm:^1.3.0" + "@hawtio/react": "npm:^1.5.0" "@thumbmarkjs/thumbmarkjs": "npm:^0.14.8" "@types/jest": "npm:^29.5.12" "@types/jquery": "npm:^3.5.30" @@ -2308,7 +2308,7 @@ __metadata: "@hawtio/online-kubernetes-api": "workspace:*" "@hawtio/online-management-api": "workspace:*" "@hawtio/online-oauth": "workspace:*" - "@hawtio/react": "npm:^1.3.0" + "@hawtio/react": "npm:^1.5.0" "@patternfly/react-core": "npm:^5.3.3" "@patternfly/react-styles": "npm:^5.3.1" "@types/node": "npm:^20.14.9" @@ -2349,47 +2349,48 @@ __metadata: languageName: unknown linkType: soft -"@hawtio/react@npm:^1.3.0": - version: 1.3.0 - resolution: "@hawtio/react@npm:1.3.0" +"@hawtio/react@npm:^1.5.0": + version: 1.5.0 + resolution: "@hawtio/react@npm:1.5.0" dependencies: - "@hawtio/camel-model-v4_0": "npm:@hawtio/camel-model@~4.0.5" - "@hawtio/camel-model-v4_4": "npm:@hawtio/camel-model@~4.4.2" - "@module-federation/utilities": "npm:^3.0.32" + "@hawtio/camel-model-v4_4": "npm:@hawtio/camel-model@~4.4.3" + "@hawtio/camel-model-v4_8": "npm:@hawtio/camel-model@~4.8.0" + "@jolokia.js/simple": "npm:^2.1.7" + "@module-federation/utilities": "npm:^3.1.13" "@patternfly/react-charts": "npm:~7.3.0" "@patternfly/react-code-editor": "npm:~5.3.3" "@patternfly/react-core": "npm:~5.3.3" "@patternfly/react-table": "npm:~5.3.3" - "@testing-library/dom": "npm:^10.3.1" - "@testing-library/jest-dom": "npm:^6.4.6" - "@testing-library/react": "npm:^16.0.0" + "@testing-library/dom": "npm:^10.4.0" + "@testing-library/jest-dom": "npm:^6.5.0" + "@testing-library/react": "npm:^16.0.1" "@testing-library/user-event": "npm:^14.5.2" - "@thumbmarkjs/thumbmarkjs": "npm:^0.14.8" + "@thumbmarkjs/thumbmarkjs": "npm:^0.16.0" "@types/dagre": "npm:^0.7.52" "@types/dagre-layout": "npm:^0.8.5" - "@types/jest": "npm:^29.5.12" + "@types/jest": "npm:^29.5.13" "@types/jquery": "npm:^3.5.30" - "@types/node": "npm:^18.19.39" - "@types/react": "npm:^18.3.3" + "@types/node": "npm:^22.7.4" + "@types/react": "npm:^18.3.8" "@types/react-dom": "npm:^18.3.0" "@types/react-router-dom": "npm:^5.3.3" dagre: "npm:^0.8.5" eventemitter3: "npm:^5.0.1" - jolokia.js: "npm:^2.0.3" + jolokia.js: "npm:^2.1.7" jquery: "npm:^3.7.1" js-logger: "npm:^1.6.1" jwt-decode: "npm:^4.0.0" keycloak-js: "npm:^23.0.7" - monaco-editor: "npm:^0.50.0" - oauth4webapi: "npm:^2.11.1" + monaco-editor: "npm:^0.52.0" + oauth4webapi: "npm:^2.17.0" react: "npm:^18.3.1" react-dom: "npm:^18.3.1" react-markdown: "npm:^8.0.7" - react-monaco-editor: "npm:^0.55.0" - react-router-dom: "npm:^6.24.1" + react-monaco-editor: "npm:^0.56.1" + react-router-dom: "npm:^6.26.2" react-split: "npm:^2.0.14" reactflow: "npm:^11.11.4" - superstruct: "npm:^1.0.4" + superstruct: "npm:^2.0.2" typescript: "npm:^5.4.5" xml-formatter: "npm:^3.6.3" peerDependencies: @@ -2400,7 +2401,7 @@ __metadata: peerDependenciesMeta: keycloak-js: optional: true - checksum: 10/f6f0513010c05a601fd2952682932d7046458519e7249a06588455e4f4a691b5ef4a1573ab22214e2fa8aa4d28745c40abef80b67e0fb1c3f0eefe113d19bdc5 + checksum: 10/9c3cbce6e2292ff7ffe922aae9490c4960dad634230f7d334603836f044f960716ffc487953a4b820c3073fecf665da368bbbeeee059976b90670fe036c9286e languageName: node linkType: hard @@ -2699,6 +2700,15 @@ __metadata: languageName: node linkType: hard +"@jolokia.js/simple@npm:^2.1.7": + version: 2.1.7 + resolution: "@jolokia.js/simple@npm:2.1.7" + dependencies: + jolokia.js: "npm:^2.1.7" + checksum: 10/26bc017c64df1600325f5185c39d48f600d0f3e43c5bed9e79c738c9f248eba03c9bf8a68303d7aee9bfcb9f34d44cafba705f4c5ebdd74adfdda238b29826f3 + languageName: node + linkType: hard + "@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.2": version: 0.3.3 resolution: "@jridgewell/gen-mapping@npm:0.3.3" @@ -2778,18 +2788,18 @@ __metadata: languageName: node linkType: hard -"@module-federation/sdk@npm:0.2.5": - version: 0.2.5 - resolution: "@module-federation/sdk@npm:0.2.5" - checksum: 10/830645b9c53dacad39f30df0960e32c397c892de3c5b23f54b16c91810599ee48c692c986231b3f8d253d5ed81dc3d686fff9f781ce7a5f73cfa6eda40165746 +"@module-federation/sdk@npm:0.6.10": + version: 0.6.10 + resolution: "@module-federation/sdk@npm:0.6.10" + checksum: 10/23c052b654e766fdcc28f66de5243c2cddf3fc2db159e3ede10035e725a4a108ae1e7fc09f640bbf0318e41589e0518b7607c133b51ca5233ca7d86581ac6a21 languageName: node linkType: hard -"@module-federation/utilities@npm:^3.0.32": - version: 3.0.32 - resolution: "@module-federation/utilities@npm:3.0.32" +"@module-federation/utilities@npm:^3.1.13": + version: 3.1.16 + resolution: "@module-federation/utilities@npm:3.1.16" dependencies: - "@module-federation/sdk": "npm:0.2.5" + "@module-federation/sdk": "npm:0.6.10" peerDependencies: react: ^16 || ^17 || ^18 react-dom: ^16 || ^17 || ^18 @@ -2801,7 +2811,7 @@ __metadata: optional: true react-dom: optional: true - checksum: 10/0fcb9d49458bc3edd3394c52a84d377f296cf9df8cd86caf78bcd6e31b043db6fab8233a4cac01c750c5c17b99318ba0e24dddae3da3a04edf0b7341cb08a8d0 + checksum: 10/0c796366447b91544a4903c991f50f06e6d69f76f438e4e8164072d28e9eef925aa79ee7ea326ec186acb3ee1a6e2d1f8714a6edab2c2bc5b824f2559efcbd50 languageName: node linkType: hard @@ -3092,13 +3102,6 @@ __metadata: languageName: node linkType: hard -"@remix-run/router@npm:1.17.1": - version: 1.17.1 - resolution: "@remix-run/router@npm:1.17.1" - checksum: 10/5efc598626cd81688ac26e0abd08204b980831ead8cd2c4b8a27e0c169ee4777fc609fa289c093b93efc3a1e335304698c6961276c2309348444ec7209836c83 - languageName: node - linkType: hard - "@remix-run/router@npm:1.19.1": version: 1.19.1 resolution: "@remix-run/router@npm:1.19.1" @@ -3106,6 +3109,13 @@ __metadata: languageName: node linkType: hard +"@remix-run/router@npm:1.19.2": + version: 1.19.2 + resolution: "@remix-run/router@npm:1.19.2" + checksum: 10/31b62b66ea68bd62018189047de7b262700113438f62407df019f81a9856a08a705b2b77454be9293518e2f5f3bbf3f8b858ac19f48cb7d89f8ab56b7b630c19 + languageName: node + linkType: hard + "@rollup/rollup-android-arm-eabi@npm:4.24.0": version: 4.24.0 resolution: "@rollup/rollup-android-arm-eabi@npm:4.24.0" @@ -3264,9 +3274,9 @@ __metadata: languageName: node linkType: hard -"@testing-library/dom@npm:^10.3.1": - version: 10.3.1 - resolution: "@testing-library/dom@npm:10.3.1" +"@testing-library/dom@npm:^10.4.0": + version: 10.4.0 + resolution: "@testing-library/dom@npm:10.4.0" dependencies: "@babel/code-frame": "npm:^7.10.4" "@babel/runtime": "npm:^7.12.5" @@ -3276,40 +3286,7 @@ __metadata: dom-accessibility-api: "npm:^0.5.9" lz-string: "npm:^1.5.0" pretty-format: "npm:^27.0.2" - checksum: 10/a78646e775d31b33669274e8baa9c27e6e9ea944131dcdf8d2ac2df7199516d5a9fe483e5ec49c85580399fc2f9efad395876e984b9a4ae520903dec47c773c0 - languageName: node - linkType: hard - -"@testing-library/jest-dom@npm:^6.4.6": - version: 6.4.6 - resolution: "@testing-library/jest-dom@npm:6.4.6" - dependencies: - "@adobe/css-tools": "npm:^4.4.0" - "@babel/runtime": "npm:^7.9.2" - aria-query: "npm:^5.0.0" - chalk: "npm:^3.0.0" - css.escape: "npm:^1.5.1" - dom-accessibility-api: "npm:^0.6.3" - lodash: "npm:^4.17.21" - redent: "npm:^3.0.0" - peerDependencies: - "@jest/globals": ">= 28" - "@types/bun": "*" - "@types/jest": ">= 28" - jest: ">= 28" - vitest: ">= 0.32" - peerDependenciesMeta: - "@jest/globals": - optional: true - "@types/bun": - optional: true - "@types/jest": - optional: true - jest: - optional: true - vitest: - optional: true - checksum: 10/94fad29d740ff2c34967c644e2481a472aa8eeb1f11cdec5d4f81f14b2576660387551264c0fa718c15bfc61dd342f7621d888fe3e4ba1b7f830fe65bdd37bc8 + checksum: 10/05825ee9a15b88cbdae12c137db7111c34069ed3c7a1bd03b6696cb1b37b29f6f2d2de581ebf03033e7df1ab7ebf08399310293f440a4845d95c02c0a9ecc899 languageName: node linkType: hard @@ -3328,9 +3305,9 @@ __metadata: languageName: node linkType: hard -"@testing-library/react@npm:^16.0.0": - version: 16.0.0 - resolution: "@testing-library/react@npm:16.0.0" +"@testing-library/react@npm:^16.0.1": + version: 16.0.1 + resolution: "@testing-library/react@npm:16.0.1" dependencies: "@babel/runtime": "npm:^7.12.5" peerDependencies: @@ -3344,7 +3321,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/b32894be94e31276138decfa6bcea69dfebc0c37cf91499ff6c878f41eb1154a43a7df6eb1e72e7bede78468af6cb67ca59e4acd3206b41f3ecdae2c6efdf67e + checksum: 10/904b48881cf5bd208e25899e168f5c99c78ed6d77389544838d9d861a038d2c5c5385863ee9a367436770cbf7d21c5e05a991b9e24a33806e9ac985df2448185 languageName: node linkType: hard @@ -3364,6 +3341,13 @@ __metadata: languageName: node linkType: hard +"@thumbmarkjs/thumbmarkjs@npm:^0.16.0": + version: 0.16.0 + resolution: "@thumbmarkjs/thumbmarkjs@npm:0.16.0" + checksum: 10/6c0b23ffee4a6aa8e09b6a711a5e9cff10994405f634be0ce5dbdde7fcad551e550e93cc13fd60addbd1ad48a76ece6896d7c427bf463af1ab19014736a4f9ab + languageName: node + linkType: hard + "@tootallnate/once@npm:2": version: 2.0.0 resolution: "@tootallnate/once@npm:2.0.0" @@ -3945,6 +3929,16 @@ __metadata: languageName: node linkType: hard +"@types/jest@npm:^29.5.13": + version: 29.5.13 + resolution: "@types/jest@npm:29.5.13" + dependencies: + expect: "npm:^29.0.0" + pretty-format: "npm:^29.0.0" + checksum: 10/7d6e3e4ef4b1cab0f61270d55764709512fdfbcb1bd47c0ef44117d48490529c1f264dacf3440b9188363e99e290b80b79c529eadc3af2184116a90f6856b192 + languageName: node + linkType: hard + "@types/jquery@npm:^3.5.30": version: 3.5.30 resolution: "@types/jquery@npm:3.5.30" @@ -4071,15 +4065,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^18.19.39": - version: 18.19.39 - resolution: "@types/node@npm:18.19.39" - dependencies: - undici-types: "npm:~5.26.4" - checksum: 10/d2fe84adf087a4184217b666f675e99678060d15f84882a4a1c3e49c3dca521a7e99a201a3c073c2b60b00419f1f4c3b357d8f7397f65e400dc3b77b0145a1da - languageName: node - linkType: hard - "@types/node@npm:^20.14.9": version: 20.14.9 resolution: "@types/node@npm:20.14.9" @@ -4089,6 +4074,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^22.7.4": + version: 22.7.5 + resolution: "@types/node@npm:22.7.5" + dependencies: + undici-types: "npm:~6.19.2" + checksum: 10/e8ba102f8c1aa7623787d625389be68d64e54fcbb76d41f6c2c64e8cf4c9f4a2370e7ef5e5f1732f3c57529d3d26afdcb2edc0101c5e413a79081449825c57ac + languageName: node + linkType: hard + "@types/parse-json@npm:^4.0.0": version: 4.0.1 resolution: "@types/parse-json@npm:4.0.1" @@ -4208,13 +4202,13 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:^18.3.3": - version: 18.3.3 - resolution: "@types/react@npm:18.3.3" +"@types/react@npm:^18.3.8": + version: 18.3.11 + resolution: "@types/react@npm:18.3.11" dependencies: "@types/prop-types": "npm:*" csstype: "npm:^3.0.2" - checksum: 10/68e203b7f1f91d6cf21f33fc7af9d6d228035a26c83f514981e54aa3da695d0ec6af10c277c6336de1dd76c4adbe9563f3a21f80c4462000f41e5f370b46e96c + checksum: 10/a36f0707fdfe9fe19cbe5892bcdab0f042ecadb501ea4e1c39519943f3e74cffbd31e892d3860f5c87cf33f5f223552b246a552bed0087b95954f2cb39d5cf65 languageName: node linkType: hard @@ -10824,23 +10818,6 @@ __metadata: languageName: node linkType: hard -"jolokia.js@npm:^2.0.3": - version: 2.0.3 - resolution: "jolokia.js@npm:2.0.3" - dependencies: - jquery: "npm:^3.7.1" - peerDependencies: - cubism: ^1.6.0 - jsdom: ^22.1.0 - peerDependenciesMeta: - cubism: - optional: true - jsdom: - optional: true - checksum: 10/0410a7563b5a2fb2b947309ff0fe863bd5df4ec4acf52e8184df8f92765b707a89398ad94aac138965911abf7639821ced8c4116b8a9fbf9e3f8c60fca1a9982 - languageName: node - linkType: hard - "jolokia.js@npm:^2.1.7": version: 2.1.7 resolution: "jolokia.js@npm:2.1.7" @@ -12043,10 +12020,10 @@ __metadata: languageName: node linkType: hard -"monaco-editor@npm:^0.50.0": - version: 0.50.0 - resolution: "monaco-editor@npm:0.50.0" - checksum: 10/594f2a3812147c1ef41c4dba444c649c32af95c3eb09529049bb7a2cb38e1747facbae0a459a07140e77cf9d73df41f034399804f9123f9cfff45394321a3983 +"monaco-editor@npm:^0.52.0": + version: 0.52.0 + resolution: "monaco-editor@npm:0.52.0" + checksum: 10/ec9a543b07e70bb3339c7e20f4f84aad045776057820daced36537efd8e50b8d9cd448988e68a4870bdc3db9c15ae3ae05201c8ed8e4ca8e87f74ee2fefb8cad languageName: node linkType: hard @@ -12280,10 +12257,10 @@ __metadata: languageName: node linkType: hard -"oauth4webapi@npm:^2.11.1": - version: 2.11.1 - resolution: "oauth4webapi@npm:2.11.1" - checksum: 10/94a3f9dfff0399aff4d9e5e006f813063bcb71211bd07cac119afa5a69d7b5426fe2a19ccb7643e2a2dd1f9512c50e3f2b875275f943877da2dea2112c23e83e +"oauth4webapi@npm:^2.17.0": + version: 2.17.0 + resolution: "oauth4webapi@npm:2.17.0" + checksum: 10/bfe4d3c0e5ec1a67ee00889b758cabccdb45b3cfbcfb62fee5ad935f1f0d7c78432c69718b79303956f006c0a950eccc0b1f19ef85aeb0067b85d06439704dc9 languageName: node linkType: hard @@ -13379,29 +13356,16 @@ __metadata: languageName: node linkType: hard -"react-monaco-editor@npm:^0.55.0": - version: 0.55.0 - resolution: "react-monaco-editor@npm:0.55.0" +"react-monaco-editor@npm:^0.56.1": + version: 0.56.2 + resolution: "react-monaco-editor@npm:0.56.2" dependencies: prop-types: "npm:^15.8.1" peerDependencies: "@types/react": ">=16 <= 18" - monaco-editor: ^0.44.0 + monaco-editor: ^0.52.0 react: ">=16 <= 18" - checksum: 10/3c4ee8cf43c5df02e24a0f8d761923b60bdd35a60946274c22024b66beb66dc3dc4ae2052ee16e83048436be7f8ca91d0aee86010095fb195e5acbb1a2aad828 - languageName: node - linkType: hard - -"react-router-dom@npm:^6.24.1": - version: 6.24.1 - resolution: "react-router-dom@npm:6.24.1" - dependencies: - "@remix-run/router": "npm:1.17.1" - react-router: "npm:6.24.1" - peerDependencies: - react: ">=16.8" - react-dom: ">=16.8" - checksum: 10/98eeeec3d36695b3d6d8000d8373ba3cefa9afc49ee44f646f3b721e8b47a80f5ce3737ad1f752cccf19caf01e370918750a4bc86a06a99e491731b454d5ec55 + checksum: 10/9e891803f766ab81349e1579ffc8cd7cba27eb34ac5113aaf34798f0998629da68415f67e2a0e76057ae632fe019c355eeab89baa607e612239315381777fff4 languageName: node linkType: hard @@ -13418,14 +13382,16 @@ __metadata: languageName: node linkType: hard -"react-router@npm:6.24.1": - version: 6.24.1 - resolution: "react-router@npm:6.24.1" +"react-router-dom@npm:^6.26.2": + version: 6.26.2 + resolution: "react-router-dom@npm:6.26.2" dependencies: - "@remix-run/router": "npm:1.17.1" + "@remix-run/router": "npm:1.19.2" + react-router: "npm:6.26.2" peerDependencies: react: ">=16.8" - checksum: 10/18ac968171dee286a2f067dc8568faf73c759f833e88e09f1b34ff6e9376d1fd5eade8697a86be83093225956b256b398d935ce2f681c1bf711fb3c058c19839 + react-dom: ">=16.8" + checksum: 10/4eee37839bd1a660807c090b4d272e4aa9b95d8a9a932cdcdf7c5b10735f39b6db73bad79b08a3012386a7e225ff6bf60435e2741fb7c68e137ac5a6295d4308 languageName: node linkType: hard @@ -13440,6 +13406,17 @@ __metadata: languageName: node linkType: hard +"react-router@npm:6.26.2": + version: 6.26.2 + resolution: "react-router@npm:6.26.2" + dependencies: + "@remix-run/router": "npm:1.19.2" + peerDependencies: + react: ">=16.8" + checksum: 10/496e855b53e61066c1791e354f5d79eab56a128d9722fdc6486c3ecd3b3a0bf9968e927028f429893b157f3cc10fc09e890a055847723ee242663e7995fedc9d + languageName: node + linkType: hard + "react-split@npm:^2.0.14": version: 2.0.14 resolution: "react-split@npm:2.0.14" @@ -14903,13 +14880,6 @@ __metadata: languageName: node linkType: hard -"superstruct@npm:^1.0.4": - version: 1.0.4 - resolution: "superstruct@npm:1.0.4" - checksum: 10/9b3fd70a08c5ad3ea78b5c6b7ab90d31dde71af10448208d296c3d29ba2e55dfd817dfef75957163ee032163d04c4b2e0cb2fddff30313516aa60f748c1a48da - languageName: node - linkType: hard - "superstruct@npm:^2.0.2": version: 2.0.2 resolution: "superstruct@npm:2.0.2" @@ -15710,6 +15680,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~6.19.2": + version: 6.19.8 + resolution: "undici-types@npm:6.19.8" + checksum: 10/cf0b48ed4fc99baf56584afa91aaffa5010c268b8842f62e02f752df209e3dea138b372a60a963b3b2576ed932f32329ce7ddb9cb5f27a6c83040d8cd74b7a70 + languageName: node + linkType: hard + "unicode-canonical-property-names-ecmascript@npm:^2.0.0": version: 2.0.0 resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0"