From 26b8e78f6724b5f7132d97888658bc354ad3d551 Mon Sep 17 00:00:00 2001 From: akucharska Date: Fri, 4 Oct 2024 08:29:36 +0200 Subject: [PATCH 01/26] External ui hosted by iframe --- src/components/Externals/Externals.js | 15 ++ src/resources/other.js | 2 + src/resources/other/externals.routes.js | 173 ++++++++++++++++++++++++ 3 files changed, 190 insertions(+) create mode 100644 src/components/Externals/Externals.js create mode 100644 src/resources/other/externals.routes.js diff --git a/src/components/Externals/Externals.js b/src/components/Externals/Externals.js new file mode 100644 index 0000000000..2754611061 --- /dev/null +++ b/src/components/Externals/Externals.js @@ -0,0 +1,15 @@ +export default function Externals() { + return ( + <> +
lo Externals
+ + + ); +} diff --git a/src/resources/other.js b/src/resources/other.js index fe6e8a68e7..6080ddf5b1 100644 --- a/src/resources/other.js +++ b/src/resources/other.js @@ -9,6 +9,7 @@ import busolaExtensions from './other/BusolaExtensions.routes'; import containerDetails from './other/containerDetails.routes'; import helmReleases from './other/helmReleases.routes'; import kymaModules from './other/kymaModules.routes'; +import externals from './other/externals.routes'; export const otherRoutes = ( <> @@ -20,6 +21,7 @@ export const otherRoutes = ( {clusterList} {busolaExtensions} {kymaModules} + {externals} ); diff --git a/src/resources/other/externals.routes.js b/src/resources/other/externals.routes.js new file mode 100644 index 0000000000..56f6c8674f --- /dev/null +++ b/src/resources/other/externals.routes.js @@ -0,0 +1,173 @@ +import { Button, FlexibleColumnLayout } from '@ui5/webcomponents-react'; +import React, { Suspense, useEffect, useState } from 'react'; +import { Route, useParams } from 'react-router-dom'; +import { useRecoilState } from 'recoil'; +import { ErrorBoundary } from 'shared/components/ErrorBoundary/ErrorBoundary'; +import { ResourceCreate } from 'shared/components/ResourceCreate/ResourceCreate'; +import { Spinner } from 'shared/components/Spinner/Spinner'; +import { columnLayoutState } from 'state/columnLayoutAtom'; +import { useUrl } from 'hooks/useUrl'; +import ExtensibilityDetails from 'components/Extensibility/ExtensibilityDetails'; +import { t } from 'i18next'; +import { createPortal } from 'react-dom'; +import { useDeleteResource } from 'shared/hooks/useDeleteResource'; +import { useNotification } from 'shared/contexts/NotificationContext'; +import { useCreateResource } from 'shared/ResourceForm/useCreateResource'; +import { cloneDeep } from 'lodash'; +import { useGet } from 'shared/hooks/BackendAPI/useGet'; + +const Externals = React.lazy(() => + import('../../components/Externals/Externals'), +); + +const ColumnWraper = (defaultColumn = 'list') => { + const [layoutState, setLayoutColumn] = useRecoilState(columnLayoutState); + const { clusterUrl } = useUrl(); + const layout = 'OneColumn'; + + if (layoutState.layout === layout) { + window.history.pushState( + window.history.state, + '', + `${clusterUrl('externals')}`, + ); + } + const { resourceName, resourceType, namespace } = useParams(); + + const initialLayoutState = { + layout: layout, + midColumn: { + resourceName: resourceName, + resourceType: resourceType, + namespaceId: namespace, + }, + endColumn: null, + }; + + useEffect(() => { + if (layout && resourceName && resourceType) { + setLayoutColumn(initialLayoutState); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [layout, namespace, resourceName, resourceType]); + + const [DeleteMessageBox, handleResourceDelete] = useDeleteResource({ + resourceType: t('kyma-modules.title'), + forceConfirmDelete: true, + }); + + const { data: kymaResources, loading: kymaResourcesLoading } = useGet( + '/apis/operator.kyma-project.io/v1beta2/namespaces/kyma-system/kymas', + ); + const kymaResourceName = + kymaResources?.items.find(kymaResource => kymaResource?.status)?.metadata + .name || kymaResources?.items[0]?.metadata?.name; + const resourceUrl = `/apis/operator.kyma-project.io/v1beta2/namespaces/kyma-system/kymas/${kymaResourceName}`; + + const { data: kymaResource, loading: kymaResourceLoading } = useGet( + resourceUrl, + { + pollingInterval: 3000, + skip: !kymaResourceName, + }, + ); + const [selectedModules, setSelectedModules] = useState( + kymaResource?.spec?.modules ?? [], + ); + const [detailsOpen, setDetailsOpen] = useState(false); + const [openedModuleIndex, setOpenedModuleIndex] = useState(); + useEffect(() => { + if (kymaResource) { + setSelectedModules(kymaResource?.spec?.modules || []); + setKymaResourceState(kymaResource); + setInitialUnchangedResource(cloneDeep(kymaResource)); + } + }, [kymaResource]); + + useEffect(() => { + if (layoutState?.layout) { + setDetailsOpen(layoutState?.layout !== 'OneColumn'); + } + }, [layoutState]); + + const [initialUnchangedResource, setInitialUnchangedResource] = useState(); + const [kymaResourceState, setKymaResourceState] = useState(); + const notification = useNotification(); + const handleModuleUninstall = useCreateResource({ + singularName: 'Kyma', + pluralKind: 'Kymas', + resource: kymaResourceState, + initialUnchangedResource: initialUnchangedResource, + createUrl: resourceUrl, + afterCreatedFn: () => + notification.notifySuccess({ + content: t('kyma-modules.module-uninstall'), + }), + }); + + let startColumnComponent = null; + + const headerActions = ( + <> + + {createPortal( + { + selectedModules.splice(openedModuleIndex, 1); + setKymaResourceState({ + ...kymaResource, + spec: { + ...kymaResource.spec, + modules: selectedModules, + }, + }); + handleModuleUninstall(); + setInitialUnchangedResource(cloneDeep(kymaResourceState)); + setLayoutColumn({ + layout: 'OneColumn', + midColumn: null, + endColumn: null, + }); + }} + />, + document.body, + )} + + ); + + startColumnComponent = ; + + let detailsMidColumn = null; + + return ( + {startColumnComponent}} + /> + ); +}; + +export default ( + <> + }> + + + } + /> + } + /> + } + /> + +); From 3eff8b57b498b264f101069357ab9d5d0e5f5d7a Mon Sep 17 00:00:00 2001 From: akucharska Date: Fri, 4 Oct 2024 08:32:14 +0200 Subject: [PATCH 02/26] Doing requests to absolute link and but it does not work --- backend/common.js | 9 ++++++ src/components/App/ExtensibilityRoutes.js | 9 +++++- .../Extensibility/ExtensibilityList.js | 13 +++++++-- src/resources/helpers.js | 28 ++++++++++++------- .../components/ResourcesList/ResourcesList.js | 5 +++- src/shared/hooks/BackendAPI/useFetch.ts | 27 +++++++++++++++++- src/shared/hooks/BackendAPI/useGet.js | 21 +++++++++++++- 7 files changed, 95 insertions(+), 17 deletions(-) diff --git a/backend/common.js b/backend/common.js index 4a562926e1..139d8df205 100644 --- a/backend/common.js +++ b/backend/common.js @@ -30,6 +30,13 @@ const workaroundForNodeMetrics = req => { } }; +// remove headers +const workaroundForAbsoluteLinks = req => { + if (req.originalUrl.includes('maytheforce')) { + delete req.headers; + } +}; + export const makeHandleRequest = () => { const isDev = process.env.NODE_ENV !== 'production'; const isTrackingEnabled = @@ -92,7 +99,9 @@ export const makeHandleRequest = () => { cert, key, }; + console.log(console.log('lolo options', options)); workaroundForNodeMetrics(req); + workaroundForAbsoluteLinks(req); const k8sRequest = https.request(options, function(k8sResponse) { if ( diff --git a/src/components/App/ExtensibilityRoutes.js b/src/components/App/ExtensibilityRoutes.js index eadef0c516..cdcbc7a26d 100644 --- a/src/components/App/ExtensibilityRoutes.js +++ b/src/components/App/ExtensibilityRoutes.js @@ -68,13 +68,18 @@ const ColumnWrapper = ({ let startColumnComponent = null; if (!layout && defaultColumn === 'details') { startColumnComponent = ( -
+
); } else { startColumnComponent = ( ); } @@ -84,6 +89,7 @@ const ColumnWrapper = ({ resourceTypeForTitle: extension?.general?.name, apiGroup: extension?.general.resource.group, apiVersion: extension?.general.resource.version, + postUrl: extension?.general?.backendUrls?.post, }); let midColumnComponent = null; @@ -119,6 +125,7 @@ const ColumnWrapper = ({
); } diff --git a/src/components/Extensibility/ExtensibilityList.js b/src/components/Extensibility/ExtensibilityList.js index 5a2d402e1c..94ab9fdd3a 100644 --- a/src/components/Extensibility/ExtensibilityList.js +++ b/src/components/Extensibility/ExtensibilityList.js @@ -32,8 +32,13 @@ export const ExtensibilityListCore = ({ const { t: tBusola } = useTranslation(); const jsonata = useJsonata({}); - const { resource, description, features, filter: generalFilter } = - resMetaData?.general ?? {}; + const { + resource, + backendUrls, + description, + features, + filter: generalFilter, + } = resMetaData?.general ?? {}; const { disableCreate, disableEdit, disableDelete } = features?.actions ?? { disableCreate: props.disableCreate, @@ -52,14 +57,16 @@ export const ExtensibilityListCore = ({ apiGroup: resource?.group, apiVersion: resource?.version, hasDetailsView: !!resMetaData?.details, + getUrl: backendUrls?.get, }); + console.log('usePrepareListProps', listProps); const resourceTitle = resMetaData?.general?.name; listProps.resourceTitle = exists('name') ? t('name') : resourceTitle || pluralize(prettifyKind(resource?.kind || '')); - if (resource?.kind) { + if (resource?.kind && !backendUrls?.get) { listProps.resourceUrl = listProps.resourceUrl?.replace( /[a-z0-9-]+\/?$/, pluralize(resource.kind).toLowerCase(), diff --git a/src/resources/helpers.js b/src/resources/helpers.js index 0a90113043..32f4709d91 100644 --- a/src/resources/helpers.js +++ b/src/resources/helpers.js @@ -33,28 +33,31 @@ export const usePrepareListProps = ({ apiGroup, apiVersion, hasDetailsView, + getUrl, }) => { const { namespaceId } = useParams(); const queryParams = new URLSearchParams(window.location.search); const { i18n, t } = useTranslation(); const api = apiGroup ? `apis/${apiGroup}/${apiVersion}` : `api/${apiVersion}`; - const resourceUrl = - namespaceId && namespaceId !== '-all-' - ? `/${api}/namespaces/${namespaceId}/${resourceType?.toLowerCase()}` - : `/${api}/${resourceType?.toLowerCase()}`; + const resourceUrl = getUrl + ? getUrl + : namespaceId && namespaceId !== '-all-' + ? `/${api}/namespaces/${namespaceId}/${resourceType?.toLowerCase()}` + : `/${api}/${resourceType?.toLowerCase()}`; return { hasDetailsView, readOnly: queryParams.get('readOnly') === 'true', resourceUrl, + isAbsolute: !!getUrl, resourceType: resourceCustomType || pluralize(resourceType || ''), resourceTitle: i18n.exists(resourceI18Key) ? t(resourceI18Key) : '', namespace: namespaceId, i18n, }; }; - +ś; export const usePrepareDetailsProps = ({ resourceCustomType, resourceType, @@ -64,13 +67,16 @@ export const usePrepareDetailsProps = ({ resourceName, namespaceId, showYamlTab, + getUrl, }) => { const encodedResourceName = encodeURIComponent(resourceName); const queryParams = new URLSearchParams(window.location.search); const { i18n, t } = useTranslation(); const api = apiGroup ? `apis/${apiGroup}/${apiVersion}` : `api/${apiVersion}`; const resourceUrl = resourceName - ? namespaceId + ? getUrl + ? getUrl + : namespaceId ? `/${api}/namespaces/${namespaceId}/${resourceType?.toLowerCase()}/${encodedResourceName}` : `/${api}/${resourceType?.toLowerCase()}/${encodedResourceName}` : ''; @@ -100,15 +106,17 @@ export const usePrepareCreateProps = ({ resourceTypeForTitle, apiGroup, apiVersion, + postUrl, }) => { const { namespaceId } = useParams(); const { i18n, t } = useTranslation(); const api = apiGroup ? `apis/${apiGroup}/${apiVersion}` : `api/${apiVersion}`; - const resourceUrl = - namespaceId && namespaceId !== '-all-' - ? `/${api}/namespaces/${namespaceId}/${resourceType?.toLowerCase()}` - : `/${api}/${resourceType?.toLowerCase()}`; + const resourceUrl = postUrl + ? postUrl + : namespaceId && namespaceId !== '-all-' + ? `/${api}/namespaces/${namespaceId}/${resourceType?.toLowerCase()}` + : `/${api}/${resourceType?.toLowerCase()}`; return { resourceUrl, diff --git a/src/shared/components/ResourcesList/ResourcesList.js b/src/shared/components/ResourcesList/ResourcesList.js index 7a2ae3c561..64bd63315f 100644 --- a/src/shared/components/ResourcesList/ResourcesList.js +++ b/src/shared/components/ResourcesList/ResourcesList.js @@ -94,7 +94,7 @@ export function ResourcesList(props) { if (!props.resourceUrl) { return <>; // wait for the context update } - + console.log('ResourcesList', props.resourceUrl); const content = props.resources ? ( async ({ + isAbsolute, relativeUrl, abortController, init, }: { + isAbsolute?: string; relativeUrl: string; init?: any; abortController?: AbortController; @@ -40,10 +44,31 @@ export const createFetchFn = ({ }, signal: abortController?.signal, }; + console.log('lolo init', init); const { backendAddress } = getClusterConfig(); + console.log( + 'createFetchFn isAbsolute', + isAbsolute, + 'relativeUrl', + relativeUrl, + ); try { - const response = await fetch(backendAddress + relativeUrl, init); + const response = await fetch( + isAbsolute ? relativeUrl : backendAddress + relativeUrl, + isAbsolute + ? { + ...init, + headers: { + 'X-Cluster-Url': cluster?.currentContext.cluster.cluster.server, + 'X-Cluster-Certificate-Authority-Data': + cluster?.currentContext.cluster.cluster[ + 'certificate-authority-data' + ], + }, + } + : init, + ); if (response.ok) { return response; } else { diff --git a/src/shared/hooks/BackendAPI/useGet.js b/src/shared/hooks/BackendAPI/useGet.js index 8c59ab065b..87862ef9a5 100644 --- a/src/shared/hooks/BackendAPI/useGet.js +++ b/src/shared/hooks/BackendAPI/useGet.js @@ -14,8 +14,26 @@ const ERROR_TOLERANCY = 2; const useGetHook = processDataFn => function( path, - { pollingInterval, onDataReceived, skip, errorTolerancy = undefined } = {}, + { + pollingInterval, + onDataReceived, + skip, + errorTolerancy = undefined, + isAbsolute = false, + } = {}, ) { + console.log( + 'useGetHook path', + path, + 'pollingInterval', + pollingInterval, + 'onDataReceived', + onDataReceived, + 'skip', + skip, + 'isAbsolute', + isAbsolute, + ); const authData = useRecoilValue(authDataState); const lastAuthData = useRef(null); const lastResourceVersion = useRef(null); @@ -58,6 +76,7 @@ const useGetHook = processDataFn => requestData.current[currentRequestId] = { start: Date.now() }; const response = await fetch({ relativeUrl: path, + isAbsolute: isAbsolute, abortController: abortController.current, }); const payload = await response.json(); From 274181d7a71356d805979c52909ab6e7993fb2e9 Mon Sep 17 00:00:00 2001 From: akucharska Date: Sat, 5 Oct 2024 13:38:33 +0200 Subject: [PATCH 03/26] Still not working --- backend/common.js | 49 ++++++++++++++++--------- backend/request-filters.js | 1 + src/resources/helpers.js | 2 +- src/shared/hooks/BackendAPI/useFetch.ts | 17 ++------- src/state/utils/getBackendInfo.ts | 12 ++++++ 5 files changed, 50 insertions(+), 31 deletions(-) diff --git a/backend/common.js b/backend/common.js index 139d8df205..0b189ac96e 100644 --- a/backend/common.js +++ b/backend/common.js @@ -83,25 +83,40 @@ export const makeHandleRequest = () => { } const { targetApiServer, ca, cert, key, authorization } = headersData; + let headers, options; + if (req.originalUrl.includes('maytheforce')) { + headers = req.headers; + + options = { + hostname: targetApiServer.hostname, + path: req.originalUrl.replace(/^\/maytheforce/, ''), + headers, + body: req.body, + method: req.method, + port: targetApiServer.port || 443, + ca, + cert, + key, + }; + } else { + headers = authorization ? { ...req.headers, authorization } : req.headers; + + options = { + hostname: targetApiServer.hostname, + path: req.originalUrl.replace(/^\/backend/, ''), + headers, + body: req.body, + method: req.method, + port: targetApiServer.port || 443, + ca, + cert, + key, + }; + } - const headers = authorization - ? { ...req.headers, authorization } - : req.headers; - - const options = { - hostname: targetApiServer.hostname, - path: req.originalUrl.replace(/^\/backend/, ''), - headers, - body: req.body, - method: req.method, - port: targetApiServer.port || 443, - ca, - cert, - key, - }; - console.log(console.log('lolo options', options)); + console.log('lolo req.originalUrl', req.originalUrl); + console.log('lolo options', options); workaroundForNodeMetrics(req); - workaroundForAbsoluteLinks(req); const k8sRequest = https.request(options, function(k8sResponse) { if ( diff --git a/backend/request-filters.js b/backend/request-filters.js index 414ae5d953..c9c9ef39d5 100644 --- a/backend/request-filters.js +++ b/backend/request-filters.js @@ -25,6 +25,7 @@ const pathWhitelistFilter = req => { '/openid', '/readyz', '/version', + '/maytheforce', ]; if (!whitelist.some(e => path.startsWith(e))) { diff --git a/src/resources/helpers.js b/src/resources/helpers.js index 32f4709d91..7e917940a8 100644 --- a/src/resources/helpers.js +++ b/src/resources/helpers.js @@ -57,7 +57,7 @@ export const usePrepareListProps = ({ i18n, }; }; -ś; + export const usePrepareDetailsProps = ({ resourceCustomType, resourceType, diff --git a/src/shared/hooks/BackendAPI/useFetch.ts b/src/shared/hooks/BackendAPI/useFetch.ts index 8b2d9fef27..a559e0abc0 100644 --- a/src/shared/hooks/BackendAPI/useFetch.ts +++ b/src/shared/hooks/BackendAPI/useFetch.ts @@ -45,7 +45,7 @@ export const createFetchFn = ({ signal: abortController?.signal, }; console.log('lolo init', init); - const { backendAddress } = getClusterConfig(); + const { backendAddress, customUIBackendAddress } = getClusterConfig(); console.log( 'createFetchFn isAbsolute', @@ -55,19 +55,10 @@ export const createFetchFn = ({ ); try { const response = await fetch( - isAbsolute ? relativeUrl : backendAddress + relativeUrl, isAbsolute - ? { - ...init, - headers: { - 'X-Cluster-Url': cluster?.currentContext.cluster.cluster.server, - 'X-Cluster-Certificate-Authority-Data': - cluster?.currentContext.cluster.cluster[ - 'certificate-authority-data' - ], - }, - } - : init, + ? customUIBackendAddress + relativeUrl + : backendAddress + relativeUrl, + init, ); if (response.ok) { return response; diff --git a/src/state/utils/getBackendInfo.ts b/src/state/utils/getBackendInfo.ts index 708140dc1a..77eb97d91a 100644 --- a/src/state/utils/getBackendInfo.ts +++ b/src/state/utils/getBackendInfo.ts @@ -9,7 +9,19 @@ const getBackendAddress = () => { return '/backend'; } }; + +const getCustomUiBackendAddress = () => { + // dev busola + if (window.location.hostname.startsWith('localhost')) { + return 'http://localhost:3001/maytheforce/'; + // on cluster + } else { + return '/maytheforce/'; + } +}; + export const getClusterConfig = () => ({ domain, backendAddress: getBackendAddress(), + customUIBackendAddress: getCustomUiBackendAddress(), }); From 9452c01633cfa9643cde8f794d101a14d5b37ab9 Mon Sep 17 00:00:00 2001 From: akucharska Date: Mon, 7 Oct 2024 09:24:34 +0200 Subject: [PATCH 04/26] WIP --- backend/common.js | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/backend/common.js b/backend/common.js index 0b189ac96e..f2070d0148 100644 --- a/backend/common.js +++ b/backend/common.js @@ -30,13 +30,6 @@ const workaroundForNodeMetrics = req => { } }; -// remove headers -const workaroundForAbsoluteLinks = req => { - if (req.originalUrl.includes('maytheforce')) { - delete req.headers; - } -}; - export const makeHandleRequest = () => { const isDev = process.env.NODE_ENV !== 'production'; const isTrackingEnabled = @@ -88,16 +81,19 @@ export const makeHandleRequest = () => { headers = req.headers; options = { - hostname: targetApiServer.hostname, - path: req.originalUrl.replace(/^\/maytheforce/, ''), - headers, - body: req.body, + hostname: 'http://localhost:8080', //targetApiServer.hostname, + path: '/api/secrets', //req.originalUrl.replace(/^\/maytheforce/, ''), + // headers, + // body: req.body, method: req.method, - port: targetApiServer.port || 443, - ca, - cert, - key, + // port: targetApiServer.port || 443, + // ca, + // cert, + // key, }; + + console.log('lolo req.originalUrl', req.originalUrl); + console.log('lolo options', options); } else { headers = authorization ? { ...req.headers, authorization } : req.headers; @@ -114,8 +110,6 @@ export const makeHandleRequest = () => { }; } - console.log('lolo req.originalUrl', req.originalUrl); - console.log('lolo options', options); workaroundForNodeMetrics(req); const k8sRequest = https.request(options, function(k8sResponse) { From 8b5ad54b70b297ac938fbc19459a4d8f33d60fbd Mon Sep 17 00:00:00 2001 From: akucharska Date: Mon, 7 Oct 2024 09:25:34 +0200 Subject: [PATCH 05/26] Change ports of busole and extension config --- package.json | 2 +- public/extensions/extensions.yaml | 18 +++++++++++++++++- tests/integration/config.js | 2 +- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 6da13d19aa..5eb8b7babc 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "scripts": { "postinstall": "cd backend && npm install", "start": "concurrently -c cyan,green npm:busola npm:backend", - "busola": "npm run copy-themes; PORT=8080 BROWSER=none GENERATE_SOURCEMAP=false react-app-rewired start", + "busola": "npm run copy-themes; PORT=8000 BROWSER=none GENERATE_SOURCEMAP=false react-app-rewired start", "backend": "cd backend && npm run start", "eslint-check": "eslint src/ backend/", "lint-check": "prettier --config ./.prettierrc --ignore-path ./.prettierignore --check '**/*.{ts,tsx,js,jsx,json,html,css,yaml,md}'", diff --git a/public/extensions/extensions.yaml b/public/extensions/extensions.yaml index fe51488c70..fd29947c7d 100644 --- a/public/extensions/extensions.yaml +++ b/public/extensions/extensions.yaml @@ -1 +1,17 @@ -[] + +list: [] +details: [] +form: [] +general: + resource: + kind: DNSProvider + group: dns.gardener.cloud + version: v1alpha1 + backendUrls: + post: http://127.0.0.1:8001/api/v1/namespaces/ak/services/nginx-service/proxy/data.json + get: http://localhost:8080/api/secrets + name: Custom Extension + category: Configuration + urlPath: custom + scope: namespace + description: Custom \ No newline at end of file diff --git a/tests/integration/config.js b/tests/integration/config.js index cf8bb24d15..5a6573ed69 100644 --- a/tests/integration/config.js +++ b/tests/integration/config.js @@ -4,5 +4,5 @@ const domain = env.DOMAIN || 'https://local.kyma.dev'; export default { domain: domain, localDev: env.LOCAL_DEV || false, - clusterAddress: env.LOCAL_DEV ? `http://localhost:8080` : `${domain}`, + clusterAddress: env.LOCAL_DEV ? `http://localhost:8000` : `${domain}`, }; From 9e8f4de0cf15a5cafef709188d8e043cb76f89aa Mon Sep 17 00:00:00 2001 From: akucharska Date: Mon, 7 Oct 2024 10:02:50 +0200 Subject: [PATCH 06/26] Hardcode everything --- backend/common.js | 12 ++++++++---- backend/index.js | 1 + src/shared/hooks/BackendAPI/useFetch.ts | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/backend/common.js b/backend/common.js index f2070d0148..5cf3a9e604 100644 --- a/backend/common.js +++ b/backend/common.js @@ -83,10 +83,10 @@ export const makeHandleRequest = () => { options = { hostname: 'http://localhost:8080', //targetApiServer.hostname, path: '/api/secrets', //req.originalUrl.replace(/^\/maytheforce/, ''), - // headers, - // body: req.body, + headers, + body: req.body, method: req.method, - // port: targetApiServer.port || 443, + port: targetApiServer.port || 80, // ca, // cert, // key, @@ -125,7 +125,11 @@ export const makeHandleRequest = () => { // change all 503 into 502 const statusCode = k8sResponse.statusCode === 503 ? 502 : k8sResponse.statusCode; - + console.log( + 'lolo k8sResponse.statusCode', + k8sResponse.statusCode, + options, + ); res.writeHead(statusCode, { 'Content-Type': k8sResponse.headers['Content-Type'] || 'text/json', 'Content-Encoding': k8sResponse.headers['content-encoding'] || '', diff --git a/backend/index.js b/backend/index.js index d98c47589a..c8c046a369 100644 --- a/backend/index.js +++ b/backend/index.js @@ -87,6 +87,7 @@ if (isDocker) { serveStaticApp(app, '/', '/core-ui'); } else { handleTracking(app); + console.log('lolololo'); app.use(handleRequest); } diff --git a/src/shared/hooks/BackendAPI/useFetch.ts b/src/shared/hooks/BackendAPI/useFetch.ts index a559e0abc0..e889f28857 100644 --- a/src/shared/hooks/BackendAPI/useFetch.ts +++ b/src/shared/hooks/BackendAPI/useFetch.ts @@ -56,7 +56,7 @@ export const createFetchFn = ({ try { const response = await fetch( isAbsolute - ? customUIBackendAddress + relativeUrl + ? customUIBackendAddress //+ relativeUrl : backendAddress + relativeUrl, init, ); From c712d5c9414b6e38bcd16564690f0c1400e61ac0 Mon Sep 17 00:00:00 2001 From: akucharska Date: Mon, 7 Oct 2024 15:26:42 +0200 Subject: [PATCH 07/26] Get it to work --- backend/common.js | 55 ++----- backend/index.js | 15 +- backend/package-lock.json | 261 +++++++++++++++++++++++++++--- backend/package.json | 1 + src/state/utils/getBackendInfo.ts | 4 +- 5 files changed, 276 insertions(+), 60 deletions(-) diff --git a/backend/common.js b/backend/common.js index 5cf3a9e604..c69e9055b1 100644 --- a/backend/common.js +++ b/backend/common.js @@ -76,39 +76,22 @@ export const makeHandleRequest = () => { } const { targetApiServer, ca, cert, key, authorization } = headersData; - let headers, options; - if (req.originalUrl.includes('maytheforce')) { - headers = req.headers; - - options = { - hostname: 'http://localhost:8080', //targetApiServer.hostname, - path: '/api/secrets', //req.originalUrl.replace(/^\/maytheforce/, ''), - headers, - body: req.body, - method: req.method, - port: targetApiServer.port || 80, - // ca, - // cert, - // key, - }; - - console.log('lolo req.originalUrl', req.originalUrl); - console.log('lolo options', options); - } else { - headers = authorization ? { ...req.headers, authorization } : req.headers; - - options = { - hostname: targetApiServer.hostname, - path: req.originalUrl.replace(/^\/backend/, ''), - headers, - body: req.body, - method: req.method, - port: targetApiServer.port || 443, - ca, - cert, - key, - }; - } + + const headers = authorization + ? { ...req.headers, authorization } + : req.headers; + + const options = { + hostname: targetApiServer.hostname, + path: req.originalUrl.replace(/^\/backend/, ''), + headers, + body: req.body, + method: req.method, + port: targetApiServer.port || 443, + ca, + cert, + key, + }; workaroundForNodeMetrics(req); @@ -125,11 +108,7 @@ export const makeHandleRequest = () => { // change all 503 into 502 const statusCode = k8sResponse.statusCode === 503 ? 502 : k8sResponse.statusCode; - console.log( - 'lolo k8sResponse.statusCode', - k8sResponse.statusCode, - options, - ); + res.writeHead(statusCode, { 'Content-Type': k8sResponse.headers['Content-Type'] || 'text/json', 'Content-Encoding': k8sResponse.headers['content-encoding'] || '', diff --git a/backend/index.js b/backend/index.js index c8c046a369..70f0e6f401 100644 --- a/backend/index.js +++ b/backend/index.js @@ -1,6 +1,8 @@ import { makeHandleRequest, serveStaticApp, serveMonaco } from './common'; import { handleTracking } from './tracking.js'; import jsyaml from 'js-yaml'; +const { createProxyMiddleware } = require('http-proxy-middleware'); + //import { requestLogger } from './utils/other'; //uncomment this to log the outgoing traffic const express = require('express'); @@ -87,7 +89,18 @@ if (isDocker) { serveStaticApp(app, '/', '/core-ui'); } else { handleTracking(app); - console.log('lolololo'); + + const CUSTOM_UI_URL = 'http://localhost:8080'; + app.use( + '/maytheforce', + createProxyMiddleware({ + target: CUSTOM_UI_URL, + changeOrigin: true, + pathRewrite: { + [`^/maytheforce`]: '', + }, + }), + ); app.use(handleRequest); } diff --git a/backend/package-lock.json b/backend/package-lock.json index 2674b6dadb..427fbf8727 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -13,6 +13,7 @@ "compression": "^1.7.4", "cors": "^2.8.5", "express": "^4.21.0", + "http-proxy-middleware": "^1.0.5", "https": "^1.0.0", "jose": "^5.2.4", "js-yaml": "^4.1.0", @@ -1878,6 +1879,15 @@ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, + "node_modules/@types/http-proxy": { + "version": "1.17.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", @@ -1888,7 +1898,6 @@ "version": "20.10.4", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", - "dev": true, "dependencies": { "undici-types": "~5.26.4" } @@ -3452,6 +3461,12 @@ "node": ">= 0.6" } }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -3841,6 +3856,26 @@ "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz", "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==" }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -4174,6 +4209,94 @@ "node": ">= 0.8" } }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz", + "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.5", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/http-proxy-middleware/node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/http-proxy-middleware/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/https": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz", @@ -4503,7 +4626,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -4512,7 +4634,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -4573,6 +4694,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -5445,10 +5578,10 @@ "dev": true }, "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true, + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -5780,6 +5913,12 @@ "node": ">=0.10" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, "node_modules/resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", @@ -6586,8 +6725,7 @@ "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", @@ -8331,6 +8469,14 @@ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, + "@types/http-proxy": { + "version": "1.17.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", + "requires": { + "@types/node": "*" + } + }, "@types/json-schema": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", @@ -8341,7 +8487,6 @@ "version": "20.10.4", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", - "dev": true, "requires": { "undici-types": "~5.26.4" } @@ -9553,6 +9698,11 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -9873,6 +10023,11 @@ "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz", "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==" }, + "follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==" + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -10111,6 +10266,68 @@ "toidentifier": "1.0.1" } }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz", + "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==", + "requires": { + "@types/http-proxy": "^1.17.5", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "dependencies": { + "braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "requires": { + "fill-range": "^7.1.1" + } + }, + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "requires": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + } + } + }, "https": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz", @@ -10363,14 +10580,12 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -10412,6 +10627,11 @@ "has-tostringtag": "^1.0.0" } }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -11059,10 +11279,9 @@ "dev": true }, "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pify": { "version": "4.0.1", @@ -11332,6 +11551,11 @@ "dev": true, "optional": true }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, "resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", @@ -11969,8 +12193,7 @@ "undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", diff --git a/backend/package.json b/backend/package.json index 7d82c0dd51..c9a3af9e44 100644 --- a/backend/package.json +++ b/backend/package.json @@ -18,6 +18,7 @@ "cors": "^2.8.5", "express": "^4.21.0", "https": "^1.0.0", + "http-proxy-middleware": "^1.0.5", "jose": "^5.2.4", "js-yaml": "^4.1.0", "lodash.merge": "^4.6.2", diff --git a/src/state/utils/getBackendInfo.ts b/src/state/utils/getBackendInfo.ts index 77eb97d91a..6b06ac5c62 100644 --- a/src/state/utils/getBackendInfo.ts +++ b/src/state/utils/getBackendInfo.ts @@ -13,10 +13,10 @@ const getBackendAddress = () => { const getCustomUiBackendAddress = () => { // dev busola if (window.location.hostname.startsWith('localhost')) { - return 'http://localhost:3001/maytheforce/'; + return 'http://localhost:3001/maytheforce'; // on cluster } else { - return '/maytheforce/'; + return '/maytheforce'; } }; From db2dce46f7c34f85135fda7fc96b657214bc3bb8 Mon Sep 17 00:00:00 2001 From: akucharska Date: Tue, 8 Oct 2024 07:51:37 +0200 Subject: [PATCH 08/26] Disabe default columns --- docs/extensibility/resources.md | 1 + public/extensions/extensions.yaml | 11 +++++++++-- src/components/Extensibility/ExtensibilityList.js | 12 ++++++++++-- src/shared/hooks/BackendAPI/useFetch.ts | 12 ++++++++++-- 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/docs/extensibility/resources.md b/docs/extensibility/resources.md index 3439a0b2fa..3e5426b72f 100644 --- a/docs/extensibility/resources.md +++ b/docs/extensibility/resources.md @@ -45,6 +45,7 @@ The **general** section is required and contains basic information about the res - **disableCreate** - when set to `true`, it disables the **Create** button. Defaults to `false`. - **disableEdit** - when set to `true`, it disables the **Edit** button. Defaults to `false`. - **disableDelete** - when set to `true`, it disables the **Delete** button. Defaults to `false`. + - **disableDefaultColumns** - when set to `true`, it disables the default columns in the resource list. - **externalNodes** - an optional list of links to external websites. - **category** - a category name - **scope** - either `namespace` or `cluster`. Defaults to `cluster`. diff --git a/public/extensions/extensions.yaml b/public/extensions/extensions.yaml index fd29947c7d..b4a70b6373 100644 --- a/public/extensions/extensions.yaml +++ b/public/extensions/extensions.yaml @@ -1,5 +1,9 @@ -list: [] +list: + - name: Name + source: name + - name: Namespace + source: namespace details: [] form: [] general: @@ -9,7 +13,10 @@ general: version: v1alpha1 backendUrls: post: http://127.0.0.1:8001/api/v1/namespaces/ak/services/nginx-service/proxy/data.json - get: http://localhost:8080/api/secrets + get: /api/secrets + host: http://localhost:8080 + features: + disableDefaultColumns: true name: Custom Extension category: Configuration urlPath: custom diff --git a/src/components/Extensibility/ExtensibilityList.js b/src/components/Extensibility/ExtensibilityList.js index 94ab9fdd3a..4b09b0e5a3 100644 --- a/src/components/Extensibility/ExtensibilityList.js +++ b/src/components/Extensibility/ExtensibilityList.js @@ -46,6 +46,9 @@ export const ExtensibilityListCore = ({ disableDelete: props.disableDelete, }; + const disableDefaultColumns = + features?.disableDefaultColumns ?? props.disableDefaultColumns; + const dataSources = resMetaData?.dataSources || {}; const { schema } = useGetSchema({ resource, @@ -75,8 +78,7 @@ export const ExtensibilityListCore = ({ listProps.createFormProps = { resourceSchema: resMetaData }; listProps.description = useCreateResourceDescription(description); - - listProps.customColumns = Array.isArray(resMetaData?.list) + const columns = Array.isArray(resMetaData?.list) ? resMetaData?.list.map((column, i) => ({ header: widgetT(column), value: resource => ( @@ -93,6 +95,12 @@ export const ExtensibilityListCore = ({ })) : []; + if (disableDefaultColumns) { + listProps.columns = columns; + } else { + listProps.customColumns = columns; + } + const isFilterAString = typeof resMetaData?.resource?.filter === 'string' || typeof generalFilter === 'string'; diff --git a/src/shared/hooks/BackendAPI/useFetch.ts b/src/shared/hooks/BackendAPI/useFetch.ts index e889f28857..5c9ed082fc 100644 --- a/src/shared/hooks/BackendAPI/useFetch.ts +++ b/src/shared/hooks/BackendAPI/useFetch.ts @@ -56,9 +56,17 @@ export const createFetchFn = ({ try { const response = await fetch( isAbsolute - ? customUIBackendAddress //+ relativeUrl + ? customUIBackendAddress + relativeUrl : backendAddress + relativeUrl, - init, + isAbsolute + ? { + ...init, + headers: { + ...init.headers, + 'X-Cluster-Url': 'http://localhost:8080', + }, + } + : init, ); if (response.ok) { return response; From c771870e9e61ee15875588ea74126b2c26f2675e Mon Sep 17 00:00:00 2001 From: akucharska Date: Thu, 10 Oct 2024 11:09:24 +0200 Subject: [PATCH 09/26] Change port --- backend/index.js | 2 +- public/extensions/extensions.yaml | 2 +- src/components/Externals/Externals.js | 2 +- src/shared/hooks/BackendAPI/useFetch.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/index.js b/backend/index.js index 70f0e6f401..668e54c6e0 100644 --- a/backend/index.js +++ b/backend/index.js @@ -90,7 +90,7 @@ if (isDocker) { } else { handleTracking(app); - const CUSTOM_UI_URL = 'http://localhost:8080'; + const CUSTOM_UI_URL = 'http://localhost:8000'; app.use( '/maytheforce', createProxyMiddleware({ diff --git a/public/extensions/extensions.yaml b/public/extensions/extensions.yaml index b4a70b6373..330d0734c9 100644 --- a/public/extensions/extensions.yaml +++ b/public/extensions/extensions.yaml @@ -14,7 +14,7 @@ general: backendUrls: post: http://127.0.0.1:8001/api/v1/namespaces/ak/services/nginx-service/proxy/data.json get: /api/secrets - host: http://localhost:8080 + host: http://localhost:8000 features: disableDefaultColumns: true name: Custom Extension diff --git a/src/components/Externals/Externals.js b/src/components/Externals/Externals.js index 2754611061..14c961a633 100644 --- a/src/components/Externals/Externals.js +++ b/src/components/Externals/Externals.js @@ -4,7 +4,7 @@ export default function Externals() {
lo Externals
+ ); } diff --git a/src/shared/components/ResourcesList/ResourcesList.js b/src/shared/components/ResourcesList/ResourcesList.js index c89d23f0e6..2bd683f8ab 100644 --- a/src/shared/components/ResourcesList/ResourcesList.js +++ b/src/shared/components/ResourcesList/ResourcesList.js @@ -62,6 +62,7 @@ ResourcesList.propTypes = { description: PropTypes.node, readOnly: PropTypes.bool, customUrl: PropTypes.func, + customUIUrl: PropTypes.any, testid: PropTypes.string, omitColumnsIds: PropTypes.arrayOf(PropTypes.string.isRequired), resourceUrlPrefix: PropTypes.string, From c486b2e9e37cbd5f45cc31b6bae5b7af98b4478c Mon Sep 17 00:00:00 2001 From: akucharska Date: Mon, 28 Oct 2024 08:02:45 +0100 Subject: [PATCH 15/26] Set cookies --- package-lock.json | 27 ++++++++++++++++++++ package.json | 2 ++ src/shared/hooks/BackendAPI/createHeaders.ts | 9 +++++++ 3 files changed, 38 insertions(+) diff --git a/package-lock.json b/package-lock.json index c1079ad2ff..d9793853f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "@sentry/react": "^6.17.4", "@sentry/tracing": "^6.12.0", "@stoplight/json-ref-resolver": "^3.1.3", + "@types/js-cookie": "^3.0.6", "@types/jsonpath": "^0.2.0", "@types/pluralize": "^0.0.29", "@ui-schema/ui-schema": "^0.4.5", @@ -39,6 +40,7 @@ "i18next": "^22.0.4", "i18next-http-backend": "^1.3.2", "immutable": "^4.0.0", + "js-cookie": "^3.0.5", "js-yaml": "^4.1.0", "jsonata": "^1.8.7", "jsonpath": "^1.1.1", @@ -5962,6 +5964,12 @@ "@types/sizzle": "*" } }, + "node_modules/@types/js-cookie": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.6.tgz", + "integrity": "sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==", + "license": "MIT" + }, "node_modules/@types/js-yaml": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", @@ -17964,6 +17972,15 @@ "optional": true, "peer": true }, + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/js-sdsl": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", @@ -34703,6 +34720,11 @@ "@types/sizzle": "*" } }, + "@types/js-cookie": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.6.tgz", + "integrity": "sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==" + }, "@types/js-yaml": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", @@ -43736,6 +43758,11 @@ "optional": true, "peer": true }, + "js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==" + }, "js-sdsl": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", diff --git a/package.json b/package.json index 256d0b2f05..be703b2938 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ "@sentry/react": "^6.17.4", "@sentry/tracing": "^6.12.0", "@stoplight/json-ref-resolver": "^3.1.3", + "@types/js-cookie": "^3.0.6", "@types/jsonpath": "^0.2.0", "@types/pluralize": "^0.0.29", "@ui-schema/ui-schema": "^0.4.5", @@ -78,6 +79,7 @@ "i18next": "^22.0.4", "i18next-http-backend": "^1.3.2", "immutable": "^4.0.0", + "js-cookie": "^3.0.5", "js-yaml": "^4.1.0", "jsonata": "^1.8.7", "jsonpath": "^1.1.1", diff --git a/src/shared/hooks/BackendAPI/createHeaders.ts b/src/shared/hooks/BackendAPI/createHeaders.ts index 78e22a20b0..828a908681 100644 --- a/src/shared/hooks/BackendAPI/createHeaders.ts +++ b/src/shared/hooks/BackendAPI/createHeaders.ts @@ -1,5 +1,6 @@ import { AuthDataState } from 'state/authDataAtom'; import { ActiveClusterState } from 'state/clusterAtom'; +import Cookies from 'js-cookie'; export function createAuthHeaders(auth: AuthDataState) { if (!auth) { @@ -7,8 +8,16 @@ export function createAuthHeaders(auth: AuthDataState) { } if ('token' in auth) { + Cookies.set('X-K8s-Authorization', `Bearer ${auth.token}`, { + secure: true, + }); return { 'X-K8s-Authorization': `Bearer ${auth.token}` }; } else if (auth['client-certificate-data'] && auth['client-key-data']) { + Cookies.set('X-Client-Certificate-Data', auth['client-certificate-data'], { + secure: true, + }); + Cookies.set('X-Client-Key-Data', auth['client-key-data'], { secure: true }); + return { 'X-Client-Certificate-Data': auth['client-certificate-data'], 'X-Client-Key-Data': auth['client-key-data'], From 4f1ec9c1dbcc57ee2d67c7422b2eea7e94ba854e Mon Sep 17 00:00:00 2001 From: Damian Badura Date: Mon, 28 Oct 2024 09:25:02 +0100 Subject: [PATCH 16/26] add support for cookies in backend --- backend/common.js | 70 ++-- backend/index.js | 20 +- backend/package-lock.json | 770 +++++++++++++++++++++----------------- backend/package.json | 1 + 4 files changed, 472 insertions(+), 389 deletions(-) diff --git a/backend/common.js b/backend/common.js index c69e9055b1..8fbdf5a2f4 100644 --- a/backend/common.js +++ b/backend/common.js @@ -1,6 +1,8 @@ import PinoHttp from 'pino-http'; -import { handleDockerDesktopSubsitution } from './docker-desktop-substitution'; import { filters } from './request-filters'; +import { handleDockerDesktopSubsitution } from './docker-desktop-substitution'; +import { string } from 'prop-types'; +import { lowerCase } from 'lodash'; const https = require('https'); const express = require('express'); @@ -8,6 +10,14 @@ const path = require('path'); const fs = require('fs'); const uuid = require('uuid').v4; +const K8S_Keys = { + URL: 'x-cluster-url', + CA: 'x-cluster-certificate-authority-data', + CLIENT_CA: 'x-client-certificate-data', + CLIENT_KEY_DATA: 'x-client-key-data', + AUTH: 'x-k8s-authorization', +}; + // https://github.tools.sap/sgs/SAP-Global-Trust-List/blob/master/approved.pem const certs = fs.readFileSync('certs.pem', 'utf8'); @@ -58,9 +68,9 @@ export const makeHandleRequest = () => { return async (req, res) => { logger(req, res); - let headersData; + let k8sData; try { - headersData = extractHeadersData(req); + k8sData = extractK8sData(req); } catch (e) { req.log.error('Headers error:' + e.message); res.status(400).send('Headers are missing or in a wrong format.'); @@ -68,14 +78,14 @@ export const makeHandleRequest = () => { } try { - filters.forEach(filter => filter(req, headersData)); + filters.forEach(filter => filter(req, k8sData)); } catch (e) { req.log.error('Filters rejected the request: ' + e.message); res.status(400).send('Request ID: ' + req.id); return; } - const { targetApiServer, ca, cert, key, authorization } = headersData; + const { targetApiServer, ca, cert, key, authorization } = k8sData; const headers = authorization ? { ...req.headers, authorization } @@ -137,28 +147,44 @@ export const serveMonaco = app => { app.use('/vs', express.static(path.join(__dirname, '/core-ui/vs'))); }; -function extractHeadersData(req) { +function extractK8sData(req) { const urlHeader = 'x-cluster-url'; - const caHeader = 'x-cluster-certificate-authority-data'; - const clientCAHeader = 'x-client-certificate-data'; - const clientKeyDataHeader = 'x-client-key-data'; - const authorizationHeader = 'x-k8s-authorization'; - const targetApiServer = handleDockerDesktopSubsitution( - new URL(req.headers[urlHeader]), - ); - const ca = decodeHeaderToBuffer(req.headers[caHeader]) || certs; - const cert = decodeHeaderToBuffer(req.headers[clientCAHeader]); - const key = decodeHeaderToBuffer(req.headers[clientKeyDataHeader]); - const authorization = req.headers[authorizationHeader]; + let k8sData = null; + let k8sUrl = req.headers[K8S_Keys.URL]; + // If url is not in headers we will try to extract it from cookies + if (k8sUrl) { + k8sData = req.headers; + } else { + let cookies = {}; + Object.keys(req.cookies).forEach(key => { + cookies[key.toLowerCase()] = req.cookies[key]; + }); + k8sUrl = cookies[K8S_Keys.URL]; + k8sData = cookies; + } - delete req.headers[urlHeader]; - delete req.headers[caHeader]; - delete req.headers[clientCAHeader]; - delete req.headers[clientKeyDataHeader]; - delete req.headers[authorizationHeader]; + const targetApiServer = handleDockerDesktopSubsitution(new URL(k8sUrl)); + const { ca, cert, key, authorization } = getK8SData(k8sData); delete req.headers.host; // remove host in order not to confuse APIServer + deleteK8sHeaders(req.headers); return { targetApiServer, ca, cert, key, authorization }; } + +function getK8SData(data) { + const ca = decodeHeaderToBuffer(data[K8S_Keys.CA]) || certs; + const cert = decodeHeaderToBuffer(data[K8S_Keys.CLIENT_CA]); + const key = decodeHeaderToBuffer(data[K8S_Keys.CLIENT_KEY_DATA]); + const authorization = data[K8S_Keys.AUTH]; + return { ca, cert, key, authorization }; +} + +function deleteK8sHeaders(headers) { + delete headers[K8S_Keys.URL]; + delete headers[K8S_Keys.CA]; + delete headers[K8S_Keys.CLIENT_CA]; + delete headers[K8S_Keys.CLIENT_KEY_DATA]; + delete headers[K8S_Keys.AUTH]; +} diff --git a/backend/index.js b/backend/index.js index aa482b061e..b14b0adb55 100644 --- a/backend/index.js +++ b/backend/index.js @@ -1,8 +1,7 @@ import { makeHandleRequest, serveStaticApp, serveMonaco } from './common'; import { handleTracking } from './tracking.js'; import jsyaml from 'js-yaml'; -const { createProxyMiddleware } = require('http-proxy-middleware'); - +import cookieParser from 'cookie-parser'; //import { requestLogger } from './utils/other'; //uncomment this to log the outgoing traffic const express = require('express'); @@ -36,6 +35,8 @@ const app = express(); app.disable('x-powered-by'); app.use(express.raw({ type: '*/*', limit: '100mb' })); +app.use(cookieParser()); + const gzipEnabled = global.config.features?.GZIP?.isEnabled; if (gzipEnabled) app.use( @@ -89,21 +90,6 @@ if (isDocker) { serveStaticApp(app, '/', '/core-ui'); } else { handleTracking(app); - const customRouter = function(req) { - const { query } = req; - return query.customUIUrl; // protocol + host - }; - - app.use( - '/maytheforce', - createProxyMiddleware({ - router: customRouter, - changeOrigin: true, - pathRewrite: { - [`^/maytheforce`]: '', - }, - }), - ); app.use(handleRequest); } diff --git a/backend/package-lock.json b/backend/package-lock.json index 427fbf8727..715b31bc15 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "@babel/runtime": "^7.13.10", "compression": "^1.7.4", + "cookie-parser": "^1.4.7", "cors": "^2.8.5", "express": "^4.21.0", "http-proxy-middleware": "^1.0.5", @@ -34,6 +35,20 @@ "webpack-node-externals": "^2.5.2" } }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/cli": { "version": "7.14.8", "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.14.8.tgz", @@ -64,49 +79,49 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", "dev": true, "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.25.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz", - "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", + "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", - "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz", + "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", "dev": true, "peer": true, "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.0", - "@babel/helper-compilation-targets": "^7.15.0", - "@babel/helper-module-transforms": "^7.15.0", - "@babel/helpers": "^7.14.8", - "@babel/parser": "^7.15.0", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0", - "convert-source-map": "^1.7.0", + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.8", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.8", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -116,6 +131,13 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "peer": true + }, "node_modules/@babel/core/node_modules/debug": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", @@ -152,15 +174,15 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", + "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", "dev": true, "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/types": "^7.25.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" @@ -192,21 +214,19 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", - "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", + "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.16.4", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { @@ -365,34 +385,34 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", + "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", - "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", + "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { @@ -408,9 +428,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", + "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -447,12 +467,13 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", - "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", + "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -483,27 +504,27 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", + "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -525,29 +546,29 @@ } }, "node_modules/@babel/helpers": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz", - "integrity": "sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", + "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", "dev": true, "peer": true, "dependencies": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", + "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.25.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -577,10 +598,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", + "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", "dev": true, + "dependencies": { + "@babel/types": "^7.25.8" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -1695,33 +1719,30 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", + "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", - "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1753,13 +1774,13 @@ "dev": true }, "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", + "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1776,14 +1797,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -1799,9 +1820,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1824,9 +1845,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1883,7 +1904,6 @@ "version": "1.17.15", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -2626,9 +2646,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", "dev": true, "funding": [ { @@ -2645,10 +2665,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -2711,9 +2731,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001570", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz", - "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==", + "version": "1.0.30001668", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz", + "integrity": "sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==", "dev": true, "funding": [ { @@ -3062,6 +3082,26 @@ "node": ">= 0.6" } }, + "node_modules/cookie-parser": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", + "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", + "dependencies": { + "cookie": "0.7.2", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-parser/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -3258,9 +3298,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.613", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.613.tgz", - "integrity": "sha512-r4x5+FowKG6q+/Wj0W9nidx7QO31BJwmR2uEo+Qh3YLGQ8SbBAFuDFpTxzly/I2gsbrFwBuIjrMp423L3O5U3w==", + "version": "1.5.36", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.36.tgz", + "integrity": "sha512-HYTX8tKge/VNp6FGO+f/uVDmUkq+cEfcxYhKf15Akc4M5yxt5YmorwlAitKWjWhWQnKcDRBAQKXkhqqXMqcrjw==", "dev": true }, "node_modules/emojis-list": { @@ -3379,9 +3419,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "engines": { "node": ">=6" @@ -3464,8 +3504,7 @@ "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT" + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, "node_modules/events": { "version": "3.3.0", @@ -3866,7 +3905,6 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -4213,7 +4251,6 @@ "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -4227,7 +4264,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz", "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==", - "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.5", "http-proxy": "^1.18.1", @@ -4243,7 +4279,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -4255,7 +4290,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4267,7 +4301,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -4276,7 +4309,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -4289,7 +4321,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -4698,7 +4729,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -4872,15 +4902,15 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-parse-even-better-errors": { @@ -4976,6 +5006,15 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, "node_modules/make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -5203,19 +5242,10 @@ "semver": "^5.7.0" } }, - "node_modules/node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "node_modules/nodemon": { @@ -5572,16 +5602,15 @@ "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "dev": true }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", "engines": { "node": ">=8.6" }, @@ -5636,13 +5665,10 @@ "integrity": "sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==" }, "node_modules/pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, - "dependencies": { - "node-modules-regexp": "^1.0.0" - }, "engines": { "node": ">= 6" } @@ -5916,8 +5942,7 @@ "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "license": "MIT" + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/resolve": { "version": "1.20.0", @@ -6178,9 +6203,9 @@ } }, "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "node_modules/simple-update-notifier": { @@ -6855,9 +6880,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -6874,8 +6899,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -7161,9 +7186,26 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true } }, "dependencies": { + "@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "peer": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "@babel/cli": { "version": "7.14.8", "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.14.8.tgz", @@ -7182,45 +7224,52 @@ } }, "@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", "dev": true, "requires": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.25.7", + "picocolors": "^1.0.0" } }, "@babel/compat-data": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz", - "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", + "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", "dev": true }, "@babel/core": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", - "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz", + "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", "dev": true, "peer": true, "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.0", - "@babel/helper-compilation-targets": "^7.15.0", - "@babel/helper-module-transforms": "^7.15.0", - "@babel/helpers": "^7.14.8", - "@babel/parser": "^7.15.0", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0", - "convert-source-map": "^1.7.0", + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.8", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.8", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "dependencies": { + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "peer": true + }, "debug": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", @@ -7248,15 +7297,15 @@ } }, "@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", + "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", "dev": true, "requires": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/types": "^7.25.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" } }, "@babel/helper-annotate-as-pure": { @@ -7279,15 +7328,16 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", - "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", + "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", "dev": true, "requires": { - "@babel/compat-data": "^7.16.4", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "dependencies": { "semver": { @@ -7406,28 +7456,25 @@ } }, "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", + "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" } }, "@babel/helper-module-transforms": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", - "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", + "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" } }, "@babel/helper-optimise-call-expression": { @@ -7440,9 +7487,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", + "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", "dev": true }, "@babel/helper-remap-async-to-generator": { @@ -7470,12 +7517,13 @@ } }, "@babel/helper-simple-access": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", - "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", + "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -7497,21 +7545,21 @@ } }, "@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", + "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", "dev": true }, "@babel/helper-wrap-function": { @@ -7527,26 +7575,26 @@ } }, "@babel/helpers": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz", - "integrity": "sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", + "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", "dev": true, "peer": true, "requires": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7" } }, "@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", + "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.25.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" } }, "@babel/node": { @@ -7564,10 +7612,13 @@ } }, "@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", - "dev": true + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", + "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", + "dev": true, + "requires": { + "@babel/types": "^7.25.8" + } }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.16.7", @@ -8312,30 +8363,27 @@ } }, "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", + "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", "dev": true, "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" } }, "@babel/traverse": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", - "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -8358,13 +8406,13 @@ } }, "@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", + "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", "to-fast-properties": "^2.0.0" } }, @@ -8375,14 +8423,14 @@ "dev": true }, "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" } }, "@jridgewell/resolve-uri": { @@ -8392,9 +8440,9 @@ "dev": true }, "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true }, "@jridgewell/source-map": { @@ -8414,9 +8462,9 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.1.0", @@ -9085,15 +9133,15 @@ } }, "browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" } }, "buffer-from": { @@ -9138,9 +9186,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001570", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz", - "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==", + "version": "1.0.30001668", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz", + "integrity": "sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==", "dev": true }, "chalk": { @@ -9401,6 +9449,22 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" }, + "cookie-parser": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", + "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", + "requires": { + "cookie": "0.7.2", + "cookie-signature": "1.0.6" + }, + "dependencies": { + "cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==" + } + } + }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -9550,9 +9614,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "electron-to-chromium": { - "version": "1.4.613", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.613.tgz", - "integrity": "sha512-r4x5+FowKG6q+/Wj0W9nidx7QO31BJwmR2uEo+Qh3YLGQ8SbBAFuDFpTxzly/I2gsbrFwBuIjrMp423L3O5U3w==", + "version": "1.5.36", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.36.tgz", + "integrity": "sha512-HYTX8tKge/VNp6FGO+f/uVDmUkq+cEfcxYhKf15Akc4M5yxt5YmorwlAitKWjWhWQnKcDRBAQKXkhqqXMqcrjw==", "dev": true }, "emojis-list": { @@ -9638,9 +9702,9 @@ } }, "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true }, "escape-html": { @@ -10749,9 +10813,9 @@ } }, "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true }, "json-parse-even-better-errors": { @@ -10828,6 +10892,15 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -11006,16 +11079,10 @@ "semver": "^5.7.0" } }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true - }, "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "nodemon": { @@ -11273,9 +11340,9 @@ "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "dev": true }, "picomatch": { @@ -11326,13 +11393,10 @@ "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==" }, "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true }, "pkg-dir": { "version": "3.0.0", @@ -11763,9 +11827,9 @@ } }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "simple-update-notifier": { @@ -12293,13 +12357,13 @@ "optional": true }, "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" } }, "uri-js": { @@ -12501,6 +12565,12 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true } } } diff --git a/backend/package.json b/backend/package.json index c9a3af9e44..c4ed0ed4dd 100644 --- a/backend/package.json +++ b/backend/package.json @@ -15,6 +15,7 @@ "dependencies": { "@babel/runtime": "^7.13.10", "compression": "^1.7.4", + "cookie-parser": "^1.4.7", "cors": "^2.8.5", "express": "^4.21.0", "https": "^1.0.0", From ee1d783d71a1610311f1348d4b65c565f6b5def1 Mon Sep 17 00:00:00 2001 From: Damian Badura Date: Mon, 28 Oct 2024 09:33:50 +0100 Subject: [PATCH 17/26] add all needed cookies --- src/components/Externals/Externals.js | 3 ++- src/shared/hooks/BackendAPI/createHeaders.ts | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/components/Externals/Externals.js b/src/components/Externals/Externals.js index 3d8268c324..79c20c0d56 100644 --- a/src/components/Externals/Externals.js +++ b/src/components/Externals/Externals.js @@ -41,7 +41,8 @@ export default function Externals() { id="iframe" width="100%" height="50%" - srcDoc={src} + src="http://localhost:3001/backend/api/v1/namespaces/kyma-system/services/btp-manager-metrics-service:8080/proxy/" + // srcDoc={src} > ); diff --git a/src/shared/hooks/BackendAPI/createHeaders.ts b/src/shared/hooks/BackendAPI/createHeaders.ts index 828a908681..b0d8cb8e58 100644 --- a/src/shared/hooks/BackendAPI/createHeaders.ts +++ b/src/shared/hooks/BackendAPI/createHeaders.ts @@ -29,6 +29,22 @@ export function createHeaders( authData: AuthDataState, cluster: ActiveClusterState, ): HeadersInit { + if (cluster?.currentContext.cluster.cluster.server != null) { + Cookies.set( + 'X-Cluster-Url', + cluster?.currentContext.cluster.cluster.server, + { secure: true }, + ); + } + + Cookies.set( + 'X-Cluster-Certificate-Authority-Data', + ( + cluster?.currentContext.cluster.cluster['certificate-authority-data'] + ), + { secure: true }, + ); + return { ...createAuthHeaders(authData), 'X-Cluster-Url': cluster?.currentContext.cluster.cluster.server, From 8f5ee757ac12d58d662d595817d0b73e8ddb5da9 Mon Sep 17 00:00:00 2001 From: Damian Badura Date: Mon, 28 Oct 2024 10:01:10 +0100 Subject: [PATCH 18/26] suport html type --- backend/common.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/common.js b/backend/common.js index 8fbdf5a2f4..8fee2d9cb8 100644 --- a/backend/common.js +++ b/backend/common.js @@ -1,8 +1,6 @@ import PinoHttp from 'pino-http'; import { filters } from './request-filters'; import { handleDockerDesktopSubsitution } from './docker-desktop-substitution'; -import { string } from 'prop-types'; -import { lowerCase } from 'lodash'; const https = require('https'); const express = require('express'); @@ -118,9 +116,11 @@ export const makeHandleRequest = () => { // change all 503 into 502 const statusCode = k8sResponse.statusCode === 503 ? 502 : k8sResponse.statusCode; - + const contentType = req.originalUrl.includes('proxy') + ? 'text/html; charset=utf-8' + : 'text/json'; res.writeHead(statusCode, { - 'Content-Type': k8sResponse.headers['Content-Type'] || 'text/json', + 'Content-Type': k8sResponse.headers['Content-Type'] || contentType, 'Content-Encoding': k8sResponse.headers['content-encoding'] || '', }); k8sResponse.pipe(res); From 48e6b3b1031b5b0adf11b22fe228483217d71fcd Mon Sep 17 00:00:00 2001 From: Damian Badura Date: Wed, 30 Oct 2024 13:38:33 +0100 Subject: [PATCH 19/26] fix content-type --- backend/common.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/backend/common.js b/backend/common.js index 8fee2d9cb8..e381f780c0 100644 --- a/backend/common.js +++ b/backend/common.js @@ -106,7 +106,7 @@ export const makeHandleRequest = () => { const k8sRequest = https.request(options, function(k8sResponse) { if ( k8sResponse.headers && - (k8sResponse.headers['Content-Type']?.includes('\\') || + (k8sResponse.headers['content-type']?.includes('\\') || //content-type, with uppercase it can't find the app type k8sResponse.headers['content-encoding']?.includes('\\')) ) return throwInternalServerError( @@ -114,13 +114,12 @@ export const makeHandleRequest = () => { ); // change all 503 into 502 + console.log('MIME type', k8sResponse.headers['content-type']); const statusCode = k8sResponse.statusCode === 503 ? 502 : k8sResponse.statusCode; - const contentType = req.originalUrl.includes('proxy') - ? 'text/html; charset=utf-8' - : 'text/json'; + res.writeHead(statusCode, { - 'Content-Type': k8sResponse.headers['Content-Type'] || contentType, + 'Content-Type': k8sResponse.headers['content-type'] || 'text/json', 'Content-Encoding': k8sResponse.headers['content-encoding'] || '', }); k8sResponse.pipe(res); From 461623f15e89325652f3423d7e10653b3696e674 Mon Sep 17 00:00:00 2001 From: Damian Badura Date: Wed, 30 Oct 2024 13:39:11 +0100 Subject: [PATCH 20/26] remove comment --- backend/common.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/common.js b/backend/common.js index e381f780c0..192a881e44 100644 --- a/backend/common.js +++ b/backend/common.js @@ -106,7 +106,7 @@ export const makeHandleRequest = () => { const k8sRequest = https.request(options, function(k8sResponse) { if ( k8sResponse.headers && - (k8sResponse.headers['content-type']?.includes('\\') || //content-type, with uppercase it can't find the app type + (k8sResponse.headers['content-type']?.includes('\\') || k8sResponse.headers['content-encoding']?.includes('\\')) ) return throwInternalServerError( From 2bfbf8c9ca288dde77ef36bebde403858ff6b8c6 Mon Sep 17 00:00:00 2001 From: akucharska Date: Wed, 30 Oct 2024 14:00:25 +0100 Subject: [PATCH 21/26] Clear externals file --- src/components/Externals/Externals.js | 36 --------------------------- 1 file changed, 36 deletions(-) diff --git a/src/components/Externals/Externals.js b/src/components/Externals/Externals.js index 79c20c0d56..c3c4ade480 100644 --- a/src/components/Externals/Externals.js +++ b/src/components/Externals/Externals.js @@ -1,48 +1,12 @@ -import { useEffect, useState } from 'react'; -import { useFetch } from 'shared/hooks/BackendAPI/useFetch'; - export default function Externals() { - const [src, setSrc] = useState(null); - - // const fetch = useFetch(); - const fetchSrc = async () => { - const res = await fetch('https://ui-btp.a83a150.stage.kyma.ondemand.com/'); - - const sth = await res.text(); - - // const iframe = document.getElementById('iframe')?.contentWindow?.document?.write(`${sth}`); - // console.log('lo iframe',iframe) - return sth; - }; - useEffect(() => { - fetch('https://ui-btp.a83a150.stage.kyma.ondemand.com/').then(r => { - console.log('roro r', r); - r.text().then(t => { - console.log('lolo t', t); - setSrc(t); - }); - }); - console.log('lolo', src); - }, [src, setSrc]); - return ( <> -
lo Externals
- ); From 487264bf77ed0e77e37528beed8636efc3e1757b Mon Sep 17 00:00:00 2001 From: akucharska Date: Thu, 31 Oct 2024 07:27:50 +0100 Subject: [PATCH 22/26] Clear externals --- src/components/Externals/Externals.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/components/Externals/Externals.js b/src/components/Externals/Externals.js index c3c4ade480..1f48e2e1f5 100644 --- a/src/components/Externals/Externals.js +++ b/src/components/Externals/Externals.js @@ -1,13 +1,11 @@ export default function Externals() { return ( - <> - - +