family1
1 of 1
@@ -1280,39 +1285,39 @@ exports[`EditScanConfigDialog component tests > should render dialog 1`] = `
family2
2 of 4
@@ -1461,39 +1466,39 @@ exports[`EditScanConfigDialog component tests > should render dialog 1`] = `
family3
0 of 2
@@ -1642,39 +1647,39 @@ exports[`EditScanConfigDialog component tests > should render dialog 1`] = `
family4
0 of 6
@@ -1827,13 +1832,13 @@ exports[`EditScanConfigDialog component tests > should render dialog 1`] = `
Name
New Value
Default Value
@@ -1921,23 +1926,23 @@ exports[`EditScanConfigDialog component tests > should render dialog 1`] = `
Scanner Preference 1
@@ -1957,13 +1962,13 @@ exports[`EditScanConfigDialog component tests > should render dialog 1`] = `
NVT
Name
Value
Actions
@@ -2059,38 +2064,38 @@ exports[`EditScanConfigDialog component tests > should render dialog 1`] = `
>
preference0
preference1
3
@@ -2117,38 +2122,38 @@ exports[`EditScanConfigDialog component tests > should render dialog 1`] = `
preference1
preference2
4
@@ -2175,38 +2180,38 @@ exports[`EditScanConfigDialog component tests > should render dialog 1`] = `
preference2
preference
5
@@ -2240,17 +2245,17 @@ exports[`EditScanConfigDialog component tests > should render dialog 1`] = `
Cancel
@@ -2259,10 +2264,10 @@ exports[`EditScanConfigDialog component tests > should render dialog 1`] = `
@@ -2291,7 +2296,7 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
align-items: center;
}
-.c7 {
+.c6 {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
@@ -2313,7 +2318,7 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
align-items: flex-start;
}
-.c10 {
+.c9 {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
@@ -2331,7 +2336,7 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
align-items: stretch;
}
-.c13 {
+.c12 {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
@@ -2349,7 +2354,7 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
align-items: center;
}
-.c19 {
+.c18 {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
@@ -2403,7 +2408,7 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
height: 100%;
}
-.c26 {
+.c25 {
width: 0;
height: 0;
cursor: nwse-resize;
@@ -2412,7 +2417,7 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
border-top: 20px solid #fff;
}
-.c25 {
+.c24 {
position: absolute;
bottom: 3px;
right: 3px;
@@ -2460,24 +2465,21 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
-webkit-flex-shrink: 0;
-ms-flex-negative: 0;
flex-shrink: 0;
+ width: 24px;
+ height: 24px;
+ line-height: 24px;
}
.c5 :hover {
border: 1px solid #074320;
}
-.c6 {
- height: 24px;
- width: 24px;
- line-height: 24px;
-}
-
-.c6 * {
+.c5 * {
height: inherit;
width: inherit;
}
-.c22 {
+.c21 {
display: inline-block;
padding: 0 15px;
color: #4C4C4C;
@@ -2497,12 +2499,12 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
z-index: 1;
}
-.c22:focus,
-.c22:hover {
+.c21:focus,
+.c21:hover {
border: 1px solid #4C4C4C;
}
-.c22:hover {
+.c21:hover {
-webkit-text-decoration: none;
text-decoration: none;
background: #11ab51;
@@ -2510,26 +2512,26 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
color: #fff;
}
-.c22[disabled] {
+.c21[disabled] {
cursor: not-allowed;
opacity: 0.65;
box-shadow: none;
}
-.c22 img {
+.c21 img {
height: 32px;
width: 32px;
margin-top: 5px 10px 5px -10px;
vertical-align: middle;
}
-.c22:link {
+.c21:link {
-webkit-text-decoration: none;
text-decoration: none;
color: #4C4C4C;
}
-.c23 {
+.c22 {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
@@ -2547,18 +2549,18 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
align-items: center;
}
-.c24 {
+.c23 {
border: 1px solid #7F7F7F;
color: #fff;
background: #11ab51;
}
-.c24 :hover {
+.c23 :hover {
color: #074320;
background: #A1DDBA;
}
-.c20 {
+.c19 {
border-width: 1px 0 0 0;
border-style: solid;
border-color: #e5e5e5;
@@ -2566,7 +2568,7 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
padding: 10px 20px 10px 20px;
}
-.c21 {
+.c20 {
-webkit-box-pack: justify;
-webkit-justify-content: space-between;
justify-content: space-between;
@@ -2594,7 +2596,7 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
cursor: grab;
}
-.c9 {
+.c8 {
overflow: auto;
padding: 0 15px;
width: 100%;
@@ -2602,12 +2604,12 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
max-height: 400px;
}
-.c8 {
+.c7 {
overflow: hidden;
height: 100%;
}
-.c11 {
+.c10 {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
@@ -2623,7 +2625,7 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
padding-bottom: 10px;
}
-.c12 {
+.c11 {
display: inline-block;
max-width: 100%;
font-weight: bold;
@@ -2634,13 +2636,13 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
margin-left: 0;
}
-.c14 {
+.c13 {
width: 83.33333333%;
padding-left: 10px;
padding-right: 10px;
}
-.c17 {
+.c16 {
color: #c12c30;
font-weight: bold;
font-size: 19px;
@@ -2649,7 +2651,7 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
display: none;
}
-.c15 {
+.c14 {
font-family: inherit;
font-size: inherit;
line-height: inherit;
@@ -2663,11 +2665,11 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
padding: 1px 8px;
}
-.c15:-webkit-autofill {
+.c14:-webkit-autofill {
box-shadow: 0 0 0 1000px white inset;
}
-.c16 {
+.c15 {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
@@ -2689,7 +2691,7 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
align-items: center;
}
-.c18 {
+.c17 {
font-size: 14px;
margin-bottom: 0px;
display: -webkit-box;
@@ -2728,7 +2730,7 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
Edit Scan Config
@@ -2736,37 +2738,37 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
Name
Comment
The scan config is currently in use by one or more tasks, therefore only name and comment can be modified.
@@ -2811,17 +2813,17 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
Cancel
@@ -2830,10 +2832,10 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
@@ -2862,7 +2864,7 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
align-items: center;
}
-.c7 {
+.c6 {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
@@ -2884,7 +2886,7 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
align-items: flex-start;
}
-.c10 {
+.c9 {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
@@ -2902,7 +2904,7 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
align-items: stretch;
}
-.c13 {
+.c12 {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
@@ -2920,7 +2922,7 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
align-items: center;
}
-.c19 {
+.c18 {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
@@ -2974,7 +2976,7 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
height: 100%;
}
-.c26 {
+.c25 {
width: 0;
height: 0;
cursor: nwse-resize;
@@ -2983,7 +2985,7 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
border-top: 20px solid #fff;
}
-.c25 {
+.c24 {
position: absolute;
bottom: 3px;
right: 3px;
@@ -3031,24 +3033,21 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
-webkit-flex-shrink: 0;
-ms-flex-negative: 0;
flex-shrink: 0;
+ width: 24px;
+ height: 24px;
+ line-height: 24px;
}
.c5 :hover {
border: 1px solid #074320;
}
-.c6 {
- height: 24px;
- width: 24px;
- line-height: 24px;
-}
-
-.c6 * {
+.c5 * {
height: inherit;
width: inherit;
}
-.c22 {
+.c21 {
display: inline-block;
padding: 0 15px;
color: #4C4C4C;
@@ -3068,12 +3067,12 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
z-index: 1;
}
-.c22:focus,
-.c22:hover {
+.c21:focus,
+.c21:hover {
border: 1px solid #4C4C4C;
}
-.c22:hover {
+.c21:hover {
-webkit-text-decoration: none;
text-decoration: none;
background: #11ab51;
@@ -3081,26 +3080,26 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
color: #fff;
}
-.c22[disabled] {
+.c21[disabled] {
cursor: not-allowed;
opacity: 0.65;
box-shadow: none;
}
-.c22 img {
+.c21 img {
height: 32px;
width: 32px;
margin-top: 5px 10px 5px -10px;
vertical-align: middle;
}
-.c22:link {
+.c21:link {
-webkit-text-decoration: none;
text-decoration: none;
color: #4C4C4C;
}
-.c23 {
+.c22 {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
@@ -3118,18 +3117,18 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
align-items: center;
}
-.c24 {
+.c23 {
border: 1px solid #7F7F7F;
color: #fff;
background: #11ab51;
}
-.c24 :hover {
+.c23 :hover {
color: #074320;
background: #A1DDBA;
}
-.c20 {
+.c19 {
border-width: 1px 0 0 0;
border-style: solid;
border-color: #e5e5e5;
@@ -3137,7 +3136,7 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
padding: 10px 20px 10px 20px;
}
-.c21 {
+.c20 {
-webkit-box-pack: justify;
-webkit-justify-content: space-between;
justify-content: space-between;
@@ -3165,7 +3164,7 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
cursor: grab;
}
-.c9 {
+.c8 {
overflow: auto;
padding: 0 15px;
width: 100%;
@@ -3173,12 +3172,12 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
max-height: 400px;
}
-.c8 {
+.c7 {
overflow: hidden;
height: 100%;
}
-.c11 {
+.c10 {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
@@ -3194,7 +3193,7 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
padding-bottom: 10px;
}
-.c12 {
+.c11 {
display: inline-block;
max-width: 100%;
font-weight: bold;
@@ -3205,13 +3204,13 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
margin-left: 0;
}
-.c14 {
+.c13 {
width: 83.33333333%;
padding-left: 10px;
padding-right: 10px;
}
-.c17 {
+.c16 {
color: #c12c30;
font-weight: bold;
font-size: 19px;
@@ -3220,7 +3219,7 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
display: none;
}
-.c15 {
+.c14 {
font-family: inherit;
font-size: inherit;
line-height: inherit;
@@ -3234,11 +3233,11 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
padding: 1px 8px;
}
-.c15:-webkit-autofill {
+.c14:-webkit-autofill {
box-shadow: 0 0 0 1000px white inset;
}
-.c16 {
+.c15 {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
@@ -3260,7 +3259,7 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
align-items: center;
}
-.c18 {
+.c17 {
font-size: 14px;
margin-bottom: 0px;
display: -webkit-box;
@@ -3299,7 +3298,7 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
Edit Policy
@@ -3307,37 +3306,37 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
Name
Comment
The policy is currently in use by one or more audits, therefore only name and comment can be modified.
@@ -3382,17 +3381,17 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
Cancel
@@ -3401,10 +3400,10 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
diff --git a/src/web/pages/scanconfigs/__tests__/__snapshots__/listpage.jsx.snap b/src/web/pages/scanconfigs/__tests__/__snapshots__/listpage.jsx.snap
deleted file mode 100644
index 5c389dcaf3..0000000000
--- a/src/web/pages/scanconfigs/__tests__/__snapshots__/listpage.jsx.snap
+++ /dev/null
@@ -1,2112 +0,0 @@
-// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
-
-exports[`ScanConfigsPage ToolBarIcons test > should render 1`] = `
-.c0 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c2 {
- margin-left: -5px;
-}
-
-.c2>* {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c2>* {
- margin-left: 5px;
-}
-
-.c1 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c4 {
- cursor: pointer;
-}
-
-.c3 {
- height: 16px;
- width: 16px;
- line-height: 16px;
-}
-
-.c3 * {
- height: inherit;
- width: inherit;
-}
-
-@media print {
- .c4 {
- display: none;
- }
-}
-
-
-`;
-
-exports[`ScanConfigsPage tests > should render full ScanConfigsPage 1`] = `
-.c0 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
-}
-
-.c1 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
- -webkit-align-items: flex-start;
- -webkit-box-align: flex-start;
- -ms-flex-align: flex-start;
- align-items: flex-start;
-}
-
-.c2 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c7 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: end;
- -ms-flex-pack: end;
- -webkit-justify-content: flex-end;
- justify-content: flex-end;
-}
-
-.c8 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: flex-start;
- justify-content: flex-start;
- -webkit-align-items: stetch;
- -webkit-box-align: stetch;
- -ms-flex-align: stetch;
- align-items: stetch;
-}
-
-.c9 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c10 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: flex-start;
- justify-content: flex-start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c21 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c24 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
- -webkit-align-items: flex-end;
- -webkit-box-align: flex-end;
- -ms-flex-align: flex-end;
- align-items: flex-end;
-}
-
-.c28 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: flex-start;
- justify-content: flex-start;
- -webkit-align-items: flex-end;
- -webkit-box-align: flex-end;
- -ms-flex-align: flex-end;
- align-items: flex-end;
-}
-
-.c33 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
-}
-
-.c35 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: end;
- -ms-flex-pack: end;
- -webkit-justify-content: flex-end;
- justify-content: flex-end;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c47 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
-}
-
-.c49 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
-}
-
-.c50 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
-}
-
-.c52 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c53 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c4 {
- margin-left: -5px;
-}
-
-.c4>* {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c4>* {
- margin-left: 5px;
-}
-
-.c3 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c6 {
- cursor: pointer;
-}
-
-.c37 svg path {
- fill: #bfbfbf;
-}
-
-.c5 {
- height: 16px;
- width: 16px;
- line-height: 16px;
-}
-
-.c5 * {
- height: inherit;
- width: inherit;
-}
-
-.c30 {
- height: 50px;
- width: 50px;
- line-height: 50px;
-}
-
-.c30 * {
- height: inherit;
- width: inherit;
-}
-
-.c25 {
- margin: 10px 0px;
- padding-bottom: 1px;
- border-bottom: 2px solid #e5e5e5;
- position: relative;
-}
-
-.c26 {
- margin: 0 0 1px 0;
-}
-
-.c27 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: flex-start;
- justify-content: flex-start;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
-}
-
-.c29 {
- margin-right: 5px;
-}
-
-.c31 {
- word-break: break-all;
- min-width: 100px;
-}
-
-.c22 {
- background-color: transparent;
- border: none;
- cursor: pointer;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- outline: none;
- margin: 1px;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- cursor: pointer;
-}
-
-.c23 {
- height: 16px;
- width: 16px;
- line-height: 16px;
-}
-
-.c23 * {
- height: inherit;
- width: inherit;
-}
-
-.c18 {
- border: 1px solid #bfbfbf;
- border-radius: 2px;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- padding: 1px 5px;
- background-color: #fff;
- color: #000;
- font-weight: normal;
-}
-
-.c17 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- position: relative;
- width: 150px;
-}
-
-.c54 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- position: relative;
- width: 180px;
-}
-
-.c19 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- word-break: keep-all;
- white-space: nowrap;
- overflow: hidden;
- cursor: pointer;
-}
-
-.c15 {
- color: #c12c30;
- font-weight: bold;
- font-size: 19px;
- padding-bottom: 1px;
- padding-left: 4px;
- display: none;
-}
-
-.c20 {
- cursor: default;
-}
-
-.c16 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
-}
-
-.c39 {
- border: 0;
- border-spacing: 0px;
- font-size: 12px;
- text-align: left;
- table-layout: auto;
- width: 100%;
-}
-
-.c40 th,
-.c40 td {
- padding: 4px 10px;
- border-bottom: 1px solid #e5e5e5;
-}
-
-.c40 tfoot tr {
- background: #fff;
-}
-
-.c40 tfoot tr td {
- border-bottom: 1px solid #e5e5e5;
-}
-
-.c42 a {
- -webkit-text-decoration: none;
- text-decoration: none;
- color: #000;
-}
-
-.c42 a:hover {
- -webkit-text-decoration: underline;
- text-decoration: underline;
- color: #000;
-}
-
-.c44 {
- cursor: pointer;
-}
-
-.c43 {
- background-color: #fff;
- color: #000;
- border-top: 1px solid #e5e5e5;
- font-weight: bold;
- width: 72%;
-}
-
-.c45 {
- background-color: #fff;
- color: #000;
- border-top: 1px solid #e5e5e5;
- font-weight: bold;
- width: 10%;
-}
-
-.c46 {
- background-color: #fff;
- color: #000;
- border-top: 1px solid #e5e5e5;
- font-weight: bold;
- width: 8%;
-}
-
-.c48 {
- background-color: #fff;
- color: #000;
- border-top: 1px solid #e5e5e5;
- font-weight: bold;
- width: 5%;
-}
-
-.c13 {
- font-family: inherit;
- font-size: inherit;
- line-height: inherit;
- display: block;
- height: 22px;
- color: #4C4C4C;
- background-color: #fff;
- background-image: none;
- border: 1px solid #bfbfbf;
- border-radius: 2px;
- padding: 1px 8px;
-}
-
-.c13:-webkit-autofill {
- box-shadow: 0 0 0 1000px white inset;
-}
-
-.c14 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c12 {
- margin-right: 5px;
-}
-
-.c11 {
- margin-right: 5px;
-}
-
-.c55 {
- font-size: 10px;
- color: #7F7F7F;
- text-align: left;
-}
-
-.c38 {
- margin: 0 3px;
-}
-
-.c36 {
- margin: 2px 3px;
-}
-
-.c41 {
- opacity: 1.0;
-}
-
-.c34 {
- margin-top: 2px;
- margin-left: 2px;
-}
-
-.c32 {
- margin-top: 20px;
-}
-
-.c51 {
- cursor: pointer;
- -webkit-text-decoration: none;
- text-decoration: none;
- color: #0a53b8;
-}
-
-.c51 :hover {
- -webkit-text-decoration: underline;
- text-decoration: underline;
- color: #0a53b8;
-}
-
-@media print {
- .c6 {
- display: none;
- }
-}
-
-@media print {
- .c39 {
- border-collapse: collapse;
- }
-}
-
-@media screen {
- .c40>tbody:nth-of-type(even),
- .c40>tbody:only-of-type>tr:nth-of-type(even) {
- background: #f3f3f3;
- }
-
- .c40>tbody:not(:only-of-type):hover,
- .c40>tbody:only-of-type>tr:hover {
- background: #e5e5e5;
- }
-}
-
-@media print {
- .c42 {
- border-bottom: 1px solid black;
- }
-
- .c42 a,
- .c42 a:hover {
- -webkit-text-decoration: none;
- text-decoration: none;
- color: #000;
- }
-}
-
-@media print {
- .c43 {
- color: #000;
- font-size: 1.2em;
- background-color: transparent;
- font-weight: bold;
- }
-}
-
-@media print {
- .c45 {
- color: #000;
- font-size: 1.2em;
- background-color: transparent;
- font-weight: bold;
- }
-}
-
-@media print {
- .c46 {
- color: #000;
- font-size: 1.2em;
- background-color: transparent;
- font-weight: bold;
- }
-}
-
-@media print {
- .c48 {
- color: #000;
- font-size: 1.2em;
- background-color: transparent;
- font-weight: bold;
- }
-}
-
-@media print {
- .c36 svg {
- display: none;
- }
-}
-
-@media print {
- .c51 {
- color: #000;
- }
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0 - 0 of 0
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Name
-
-
-
-
-
- Family
-
-
-
-
- NVTs
-
-
-
-
- Actions
-
-
-
-
-
-
-
- Total
-
-
-
-
-
-
- Trend
-
-
-
-
-
-
- Total
-
-
-
-
-
-
- Trend
-
-
-
-
-
-
-
-
-
-
-
-
- 2
-
-
-
-
-
-
-
- 4
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Apply to page contents
-
-
-
- ▼
-
-
-
-
-
- ×
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- (Applied filter: )
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0 - 0 of 0
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Download
-
-
-
-`;
diff --git a/src/web/pages/scanconfigs/__tests__/__snapshots__/row.jsx.snap b/src/web/pages/scanconfigs/__tests__/__snapshots__/row.jsx.snap
deleted file mode 100644
index df44a48430..0000000000
--- a/src/web/pages/scanconfigs/__tests__/__snapshots__/row.jsx.snap
+++ /dev/null
@@ -1,405 +0,0 @@
-// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
-
-exports[`Scan Config row tests > should render 1`] = `
-.c0 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
-}
-
-.c1 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
-}
-
-.c4 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
-}
-
-.c5 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c7 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c8 {
- margin-left: -5px;
-}
-
-.c8>* {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c8>* {
- margin-left: 5px;
-}
-
-.c6 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c9 {
- cursor: pointer;
-}
-
-.c3 {
- height: 16px;
- width: 16px;
- line-height: 16px;
-}
-
-.c3 * {
- height: inherit;
- width: inherit;
-}
-
-.c2 {
- cursor: pointer;
- -webkit-text-decoration: none;
- text-decoration: none;
- color: #0a53b8;
-}
-
-.c2 :hover {
- -webkit-text-decoration: underline;
- text-decoration: underline;
- color: #0a53b8;
-}
-
-@media print {
- .c9 {
- display: none;
- }
-}
-
-@media print {
- .c2 {
- color: #000;
- }
-}
-
-
-
-
-
-
-
-
-
-
- 2
-
-
-
-
-
-
-
- 4
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-`;
diff --git a/src/web/pages/scanconfigs/__tests__/__snapshots__/table.jsx.snap b/src/web/pages/scanconfigs/__tests__/__snapshots__/table.jsx.snap
deleted file mode 100644
index d231968767..0000000000
--- a/src/web/pages/scanconfigs/__tests__/__snapshots__/table.jsx.snap
+++ /dev/null
@@ -1,1772 +0,0 @@
-// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
-
-exports[`Scan Config table tests > should render 1`] = `
-.c0 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
-}
-
-.c2 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
-}
-
-.c6 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: end;
- -ms-flex-pack: end;
- -webkit-justify-content: flex-end;
- justify-content: flex-end;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c8 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c20 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
-}
-
-.c22 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
-}
-
-.c23 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
-}
-
-.c25 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c26 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c32 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c10 {
- margin-left: -5px;
-}
-
-.c10>* {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c10>* {
- margin-left: 5px;
-}
-
-.c9 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c3 {
- cursor: pointer;
-}
-
-.c11 svg path {
- fill: #bfbfbf;
-}
-
-.c4 {
- height: 16px;
- width: 16px;
- line-height: 16px;
-}
-
-.c4 * {
- height: inherit;
- width: inherit;
-}
-
-.c33 {
- background-color: transparent;
- border: none;
- cursor: pointer;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- outline: none;
- margin: 1px;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- cursor: pointer;
-}
-
-.c34 {
- height: 16px;
- width: 16px;
- line-height: 16px;
-}
-
-.c34 * {
- height: inherit;
- width: inherit;
-}
-
-.c29 {
- border: 1px solid #bfbfbf;
- border-radius: 2px;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- padding: 1px 5px;
- background-color: #fff;
- color: #000;
- font-weight: normal;
-}
-
-.c28 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- position: relative;
- width: 180px;
-}
-
-.c30 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- word-break: keep-all;
- white-space: nowrap;
- overflow: hidden;
- cursor: pointer;
-}
-
-.c35 {
- color: #c12c30;
- font-weight: bold;
- font-size: 19px;
- padding-bottom: 1px;
- padding-left: 4px;
- display: none;
-}
-
-.c31 {
- cursor: default;
-}
-
-.c27 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
-}
-
-.c13 {
- border: 0;
- border-spacing: 0px;
- font-size: 12px;
- text-align: left;
- table-layout: auto;
- width: 100%;
-}
-
-.c14 th,
-.c14 td {
- padding: 4px 10px;
- border-bottom: 1px solid #e5e5e5;
-}
-
-.c14 tfoot tr {
- background: #fff;
-}
-
-.c14 tfoot tr td {
- border-bottom: 1px solid #e5e5e5;
-}
-
-.c16 a {
- -webkit-text-decoration: none;
- text-decoration: none;
- color: #000;
-}
-
-.c16 a:hover {
- -webkit-text-decoration: underline;
- text-decoration: underline;
- color: #000;
-}
-
-.c17 {
- background-color: #fff;
- color: #000;
- border-top: 1px solid #e5e5e5;
- font-weight: bold;
- width: 72%;
-}
-
-.c18 {
- background-color: #fff;
- color: #000;
- border-top: 1px solid #e5e5e5;
- font-weight: bold;
- width: 10%;
-}
-
-.c19 {
- background-color: #fff;
- color: #000;
- border-top: 1px solid #e5e5e5;
- font-weight: bold;
- width: 8%;
-}
-
-.c21 {
- background-color: #fff;
- color: #000;
- border-top: 1px solid #e5e5e5;
- font-weight: bold;
- width: 5%;
-}
-
-.c36 {
- font-size: 10px;
- color: #7F7F7F;
- text-align: left;
-}
-
-.c12 {
- margin: 0 3px;
-}
-
-.c7 {
- margin: 2px 3px;
-}
-
-.c15 {
- opacity: 1.0;
-}
-
-.c5 {
- margin-top: 2px;
- margin-left: 2px;
-}
-
-.c1 {
- margin-top: 20px;
-}
-
-.c24 {
- cursor: pointer;
- -webkit-text-decoration: none;
- text-decoration: none;
- color: #0a53b8;
-}
-
-.c24 :hover {
- -webkit-text-decoration: underline;
- text-decoration: underline;
- color: #0a53b8;
-}
-
-@media print {
- .c3 {
- display: none;
- }
-}
-
-@media print {
- .c13 {
- border-collapse: collapse;
- }
-}
-
-@media screen {
- .c14>tbody:nth-of-type(even),
- .c14>tbody:only-of-type>tr:nth-of-type(even) {
- background: #f3f3f3;
- }
-
- .c14>tbody:not(:only-of-type):hover,
- .c14>tbody:only-of-type>tr:hover {
- background: #e5e5e5;
- }
-}
-
-@media print {
- .c16 {
- border-bottom: 1px solid black;
- }
-
- .c16 a,
- .c16 a:hover {
- -webkit-text-decoration: none;
- text-decoration: none;
- color: #000;
- }
-}
-
-@media print {
- .c17 {
- color: #000;
- font-size: 1.2em;
- background-color: transparent;
- font-weight: bold;
- }
-}
-
-@media print {
- .c18 {
- color: #000;
- font-size: 1.2em;
- background-color: transparent;
- font-weight: bold;
- }
-}
-
-@media print {
- .c19 {
- color: #000;
- font-size: 1.2em;
- background-color: transparent;
- font-weight: bold;
- }
-}
-
-@media print {
- .c21 {
- color: #000;
- font-size: 1.2em;
- background-color: transparent;
- font-weight: bold;
- }
-}
-
-@media print {
- .c7 svg {
- display: none;
- }
-}
-
-@media print {
- .c24 {
- color: #000;
- }
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1 - 1 of 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Name
-
-
-
-
- Family
-
-
-
-
- NVTs
-
-
-
-
- Actions
-
-
-
-
-
-
- Total
-
-
-
-
- Trend
-
-
-
-
- Total
-
-
-
-
- Trend
-
-
-
-
-
-
-
-
-
-
-
- 2
-
-
-
-
-
-
-
- 4
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 3
-
-
-
-
-
-
-
- 5
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
-
-
-
-
-
- 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- (Applied filter: rows=2)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1 - 1 of 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-`;
diff --git a/src/web/pages/scanconfigs/__tests__/__snapshots__/trend.jsx.snap b/src/web/pages/scanconfigs/__tests__/__snapshots__/trend.jsx.snap
index 49a37ee85a..af7d7f84f3 100644
--- a/src/web/pages/scanconfigs/__tests__/__snapshots__/trend.jsx.snap
+++ b/src/web/pages/scanconfigs/__tests__/__snapshots__/trend.jsx.snap
@@ -2,8 +2,8 @@
exports[`Scan Config Trend tests > should render 1`] = `
.c0 {
- height: 16px;
width: 16px;
+ height: 16px;
line-height: 16px;
}
diff --git a/src/web/pages/scanconfigs/__tests__/detailspage.jsx b/src/web/pages/scanconfigs/__tests__/detailspage.jsx
index 7996b71cba..77aa7420fc 100644
--- a/src/web/pages/scanconfigs/__tests__/detailspage.jsx
+++ b/src/web/pages/scanconfigs/__tests__/detailspage.jsx
@@ -245,7 +245,7 @@ describe('Scan Config Detailspage tests', () => {
,
);
- expect(element).toMatchSnapshot();
+ expect(element).toBeVisible();
expect(element).toHaveTextContent('Scan Config: foo');
const links = baseElement.querySelectorAll('a');
@@ -942,7 +942,7 @@ describe('Scan Config ToolBarIcons tests', () => {
/>,
);
- expect(element).toMatchSnapshot();
+ expect(element).toBeVisible();
const links = element.querySelectorAll('a');
const icons = getAllByTestId('svg-icon');
diff --git a/src/web/pages/scanconfigs/__tests__/editconfigfamilydialog.jsx b/src/web/pages/scanconfigs/__tests__/editconfigfamilydialog.jsx
index f9a0529428..ebdbfdf705 100644
--- a/src/web/pages/scanconfigs/__tests__/editconfigfamilydialog.jsx
+++ b/src/web/pages/scanconfigs/__tests__/editconfigfamilydialog.jsx
@@ -64,7 +64,7 @@ describe('EditConfigFamilyDialog component tests', () => {
/>,
);
- expect(baseElement).toMatchSnapshot();
+ expect(baseElement).toBeVisible();
expect(baseElement).toHaveTextContent('Config');
expect(baseElement).toHaveTextContent('foo');
@@ -92,7 +92,7 @@ describe('EditConfigFamilyDialog component tests', () => {
/>,
);
- expect(baseElement).toMatchSnapshot();
+ expect(baseElement).toBeVisible();
expect(getByTestId('loading')).toBeInTheDocument();
diff --git a/src/web/pages/scanconfigs/__tests__/listpage.jsx b/src/web/pages/scanconfigs/__tests__/listpage.jsx
index 7aaf40e482..f42c196d8d 100644
--- a/src/web/pages/scanconfigs/__tests__/listpage.jsx
+++ b/src/web/pages/scanconfigs/__tests__/listpage.jsx
@@ -126,7 +126,7 @@ describe('ScanConfigsPage tests', () => {
await waitFor(() => baseElement.querySelectorAll('table'));
- expect(baseElement).toMatchSnapshot();
+ expect(baseElement).toBeVisible();
});
test('should call commands for bulk actions', async () => {
@@ -224,7 +224,7 @@ describe('ScanConfigsPage ToolBarIcons test', () => {
onScanConfigImportClick={handleScanConfigImportClick}
/>,
);
- expect(element).toMatchSnapshot();
+ expect(element).toBeVisible();
const icons = getAllByTestId('svg-icon');
const links = element.querySelectorAll('a');
diff --git a/src/web/pages/scanconfigs/__tests__/row.jsx b/src/web/pages/scanconfigs/__tests__/row.jsx
index 03b359fa57..33eba1815c 100644
--- a/src/web/pages/scanconfigs/__tests__/row.jsx
+++ b/src/web/pages/scanconfigs/__tests__/row.jsx
@@ -70,7 +70,7 @@ describe('Scan Config row tests', () => {
/>,
);
- expect(baseElement).toMatchSnapshot();
+ expect(baseElement).toBeVisible();
expect(baseElement).toHaveTextContent('foo');
expect(baseElement).toHaveTextContent('(bar)');
diff --git a/src/web/pages/scanconfigs/__tests__/table.jsx b/src/web/pages/scanconfigs/__tests__/table.jsx
index c2d8402fe0..ffd1c65cc3 100644
--- a/src/web/pages/scanconfigs/__tests__/table.jsx
+++ b/src/web/pages/scanconfigs/__tests__/table.jsx
@@ -108,7 +108,7 @@ describe('Scan Config table tests', () => {
/>,
);
- expect(baseElement).toMatchSnapshot();
+ expect(baseElement).toBeVisible();
const header = baseElement.querySelectorAll('th');
expect(header[0]).toHaveTextContent('Name');
expect(header[1]).toHaveTextContent('Family');
diff --git a/src/web/pages/scanners/__tests__/__snapshots__/dialog.jsx.snap b/src/web/pages/scanners/__tests__/__snapshots__/dialog.jsx.snap
deleted file mode 100644
index 56d9653883..0000000000
--- a/src/web/pages/scanners/__tests__/__snapshots__/dialog.jsx.snap
+++ /dev/null
@@ -1,758 +0,0 @@
-// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
-
-exports[`ScannerDialog component tests > should render 1`] = `
-.c3 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c7 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: flex-start;
- -webkit-box-align: flex-start;
- -ms-flex-align: flex-start;
- align-items: flex-start;
-}
-
-.c10 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
-}
-
-.c13 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c23 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c26 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-flex-shrink: 0;
- -ms-flex-negative: 0;
- flex-shrink: 0;
- -webkit-box-pack: end;
- -ms-flex-pack: end;
- -webkit-justify-content: flex-end;
- justify-content: flex-end;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c1 {
- position: relative;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- margin: 10% auto;
- border: 0;
- outline: 0;
- width: 800px;
- height: px;
-}
-
-.c0 {
- position: fixed;
- font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
- font-size: 1.1em;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- margin: 0;
- background: rgba(102, 102, 102, 0.5);
- z-index: 600;
- -webkit-transition: opacity 1s ease-in;
- transition: opacity 1s ease-in;
- width: 100%;
- height: 100%;
-}
-
-.c33 {
- width: 0;
- height: 0;
- cursor: nwse-resize;
- border-right: 20px solid transparent;
- border-bottom: 20px solid transparent;
- border-top: 20px solid #fff;
-}
-
-.c32 {
- position: absolute;
- bottom: 3px;
- right: 3px;
- width: 20px;
- height: 20px;
- background: repeating-linear-gradient( -45deg, transparent, transparent 2px, #000 2px, #000 3px );
-}
-
-.c2 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- height: inherit;
- padding: 0;
- background: #fff;
- box-shadow: 5px 5px 10px #7F7F7F;
- border-radius: 3px;
- border: 1px solid #7F7F7F;
-}
-
-.c5 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- font-weight: bold;
- font-size: 12px;
- font-family: Verdana,sans-serif;
- color: #074320;
- cursor: pointer;
- border-radius: 2px;
- padding: 0;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-flex-shrink: 0;
- -ms-flex-negative: 0;
- flex-shrink: 0;
-}
-
-.c5 :hover {
- border: 1px solid #074320;
-}
-
-.c6 {
- height: 24px;
- width: 24px;
- line-height: 24px;
-}
-
-.c6 * {
- height: inherit;
- width: inherit;
-}
-
-.c29 {
- display: inline-block;
- padding: 0 15px;
- color: #4C4C4C;
- text-align: center;
- vertical-align: middle;
- font-size: 11px;
- font-weight: bold;
- line-height: 30px;
- -webkit-text-decoration: none;
- text-decoration: none;
- white-space: nowrap;
- background-color: #fff;
- border-radius: 2px;
- border: 1px solid #bfbfbf;
- cursor: pointer;
- overflow: visible;
- z-index: 1;
-}
-
-.c29:focus,
-.c29:hover {
- border: 1px solid #4C4C4C;
-}
-
-.c29:hover {
- -webkit-text-decoration: none;
- text-decoration: none;
- background: #11ab51;
- font-weight: bold;
- color: #fff;
-}
-
-.c29[disabled] {
- cursor: not-allowed;
- opacity: 0.65;
- box-shadow: none;
-}
-
-.c29 img {
- height: 32px;
- width: 32px;
- margin-top: 5px 10px 5px -10px;
- vertical-align: middle;
-}
-
-.c29:link {
- -webkit-text-decoration: none;
- text-decoration: none;
- color: #4C4C4C;
-}
-
-.c30 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c31 {
- border: 1px solid #7F7F7F;
- color: #fff;
- background: #11ab51;
-}
-
-.c31 :hover {
- color: #074320;
- background: #A1DDBA;
-}
-
-.c27 {
- border-width: 1px 0 0 0;
- border-style: solid;
- border-color: #e5e5e5;
- margin-top: 15px;
- padding: 10px 20px 10px 20px;
-}
-
-.c28 {
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
-}
-
-.c4 {
- padding: 5px 5px 5px 10px;
- margin-bottom: 15px;
- border-radius: 2px 2px 0 0;
- border-bottom: 1px solid #7F7F7F;
- color: #fff;
- font-weight: bold;
- background: #11ab51;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
- -webkit-flex-shrink: 0;
- -ms-flex-negative: 0;
- flex-shrink: 0;
- cursor: -webkit-grab;
- cursor: grab;
-}
-
-.c9 {
- overflow: auto;
- padding: 0 15px;
- width: 100%;
- height: 100%;
- max-height: 400px;
-}
-
-.c8 {
- overflow: hidden;
- height: 100%;
-}
-
-.c11 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- padding-bottom: 10px;
-}
-
-.c12 {
- display: inline-block;
- max-width: 100%;
- font-weight: bold;
- text-align: right;
- padding-left: 10px;
- padding-right: 10px;
- width: 16.66666667%;
- margin-left: 0;
-}
-
-.c14 {
- width: 83.33333333%;
- padding-left: 10px;
- padding-right: 10px;
-}
-
-.c24 {
- background-color: transparent;
- border: none;
- cursor: pointer;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- outline: none;
- margin: 1px;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- cursor: pointer;
-}
-
-.c25 {
- height: 16px;
- width: 16px;
- line-height: 16px;
-}
-
-.c25 * {
- height: inherit;
- width: inherit;
-}
-
-.c20 {
- border: 1px solid #bfbfbf;
- border-radius: 2px;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- padding: 1px 5px;
- background-color: #fff;
- color: #000;
- font-weight: normal;
-}
-
-.c19 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- position: relative;
- width: 180px;
-}
-
-.c21 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- word-break: keep-all;
- white-space: nowrap;
- overflow: hidden;
- cursor: pointer;
-}
-
-.c17 {
- color: #c12c30;
- font-weight: bold;
- font-size: 19px;
- padding-bottom: 1px;
- padding-left: 4px;
- display: none;
-}
-
-.c22 {
- cursor: default;
-}
-
-.c18 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
-}
-
-.c15 {
- font-family: inherit;
- font-size: inherit;
- line-height: inherit;
- display: block;
- height: 22px;
- color: #4C4C4C;
- background-color: #fff;
- background-image: none;
- border: 1px solid #bfbfbf;
- border-radius: 2px;
- padding: 1px 8px;
-}
-
-.c15:-webkit-autofill {
- box-shadow: 0 0 0 1000px white inset;
-}
-
-.c16 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-
-
-
-
-
-
-
-
- New Scanner
-
-
- ×
-
-
-
-
-
-
-
-
-
- Type
-
-
-
-
-
-
- Greenbone Sensor
-
-
-
- ▼
-
-
-
-
-
- ×
-
-
-
-
-
-
-
-
-
-
- Cancel
-
-
- Save
-
-
-
-
-
-
-
-
-
-
-`;
diff --git a/src/web/pages/scanners/__tests__/dialog.jsx b/src/web/pages/scanners/__tests__/dialog.jsx
index 4a2ff0320e..1d807f989d 100644
--- a/src/web/pages/scanners/__tests__/dialog.jsx
+++ b/src/web/pages/scanners/__tests__/dialog.jsx
@@ -71,7 +71,7 @@ describe('ScannerDialog component tests', () => {
/>,
);
- expect(baseElement).toMatchSnapshot();
+ expect(baseElement).toBeVisible();
});
test('should display default info', () => {
diff --git a/src/web/pages/tasks/__tests__/__snapshots__/actions.jsx.snap b/src/web/pages/tasks/__tests__/__snapshots__/actions.jsx.snap
deleted file mode 100644
index fa0cc64029..0000000000
--- a/src/web/pages/tasks/__tests__/__snapshots__/actions.jsx.snap
+++ /dev/null
@@ -1,293 +0,0 @@
-// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
-
-exports[`Task Actions tests > should render 1`] = `
-.c0 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
-}
-
-.c1 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c3 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c4 {
- margin-left: -5px;
-}
-
-.c4>* {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c4>* {
- margin-left: 5px;
-}
-
-.c2 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c5 {
- cursor: pointer;
-}
-
-.c7 svg path {
- fill: #bfbfbf;
-}
-
-.c6 {
- height: 16px;
- width: 16px;
- line-height: 16px;
-}
-
-.c6 * {
- height: inherit;
- width: inherit;
-}
-
-@media print {
- .c5 {
- display: none;
- }
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-`;
diff --git a/src/web/pages/tasks/__tests__/__snapshots__/containerdialog.jsx.snap b/src/web/pages/tasks/__tests__/__snapshots__/containerdialog.jsx.snap
deleted file mode 100644
index 87baf50bc7..0000000000
--- a/src/web/pages/tasks/__tests__/__snapshots__/containerdialog.jsx.snap
+++ /dev/null
@@ -1,1254 +0,0 @@
-// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
-
-exports[`ContainerDialog tests > should render create dialog 1`] = `
-.c3 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c7 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: flex-start;
- -webkit-box-align: flex-start;
- -ms-flex-align: flex-start;
- align-items: flex-start;
-}
-
-.c10 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
-}
-
-.c13 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c18 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-flex-shrink: 0;
- -ms-flex-negative: 0;
- flex-shrink: 0;
- -webkit-box-pack: end;
- -ms-flex-pack: end;
- -webkit-justify-content: flex-end;
- justify-content: flex-end;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c1 {
- position: relative;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- margin: 10% auto;
- border: 0;
- outline: 0;
- width: 800px;
- height: px;
-}
-
-.c0 {
- position: fixed;
- font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
- font-size: 1.1em;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- margin: 0;
- background: rgba(102, 102, 102, 0.5);
- z-index: 600;
- -webkit-transition: opacity 1s ease-in;
- transition: opacity 1s ease-in;
- width: 100%;
- height: 100%;
-}
-
-.c25 {
- width: 0;
- height: 0;
- cursor: nwse-resize;
- border-right: 20px solid transparent;
- border-bottom: 20px solid transparent;
- border-top: 20px solid #fff;
-}
-
-.c24 {
- position: absolute;
- bottom: 3px;
- right: 3px;
- width: 20px;
- height: 20px;
- background: repeating-linear-gradient( -45deg, transparent, transparent 2px, #000 2px, #000 3px );
-}
-
-.c2 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- height: inherit;
- padding: 0;
- background: #fff;
- box-shadow: 5px 5px 10px #7F7F7F;
- border-radius: 3px;
- border: 1px solid #7F7F7F;
-}
-
-.c5 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- font-weight: bold;
- font-size: 12px;
- font-family: Verdana,sans-serif;
- color: #074320;
- cursor: pointer;
- border-radius: 2px;
- padding: 0;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-flex-shrink: 0;
- -ms-flex-negative: 0;
- flex-shrink: 0;
-}
-
-.c5 :hover {
- border: 1px solid #074320;
-}
-
-.c6 {
- height: 24px;
- width: 24px;
- line-height: 24px;
-}
-
-.c6 * {
- height: inherit;
- width: inherit;
-}
-
-.c21 {
- display: inline-block;
- padding: 0 15px;
- color: #4C4C4C;
- text-align: center;
- vertical-align: middle;
- font-size: 11px;
- font-weight: bold;
- line-height: 30px;
- -webkit-text-decoration: none;
- text-decoration: none;
- white-space: nowrap;
- background-color: #fff;
- border-radius: 2px;
- border: 1px solid #bfbfbf;
- cursor: pointer;
- overflow: visible;
- z-index: 1;
-}
-
-.c21:focus,
-.c21:hover {
- border: 1px solid #4C4C4C;
-}
-
-.c21:hover {
- -webkit-text-decoration: none;
- text-decoration: none;
- background: #11ab51;
- font-weight: bold;
- color: #fff;
-}
-
-.c21[disabled] {
- cursor: not-allowed;
- opacity: 0.65;
- box-shadow: none;
-}
-
-.c21 img {
- height: 32px;
- width: 32px;
- margin-top: 5px 10px 5px -10px;
- vertical-align: middle;
-}
-
-.c21:link {
- -webkit-text-decoration: none;
- text-decoration: none;
- color: #4C4C4C;
-}
-
-.c22 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c23 {
- border: 1px solid #7F7F7F;
- color: #fff;
- background: #11ab51;
-}
-
-.c23 :hover {
- color: #074320;
- background: #A1DDBA;
-}
-
-.c19 {
- border-width: 1px 0 0 0;
- border-style: solid;
- border-color: #e5e5e5;
- margin-top: 15px;
- padding: 10px 20px 10px 20px;
-}
-
-.c20 {
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
-}
-
-.c4 {
- padding: 5px 5px 5px 10px;
- margin-bottom: 15px;
- border-radius: 2px 2px 0 0;
- border-bottom: 1px solid #7F7F7F;
- color: #fff;
- font-weight: bold;
- background: #11ab51;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
- -webkit-flex-shrink: 0;
- -ms-flex-negative: 0;
- flex-shrink: 0;
- cursor: -webkit-grab;
- cursor: grab;
-}
-
-.c9 {
- overflow: auto;
- padding: 0 15px;
- width: 100%;
- height: 100%;
- max-height: 400px;
-}
-
-.c8 {
- overflow: hidden;
- height: 100%;
-}
-
-.c11 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- padding-bottom: 10px;
-}
-
-.c12 {
- display: inline-block;
- max-width: 100%;
- font-weight: bold;
- text-align: right;
- padding-left: 10px;
- padding-right: 10px;
- width: 16.66666667%;
- margin-left: 0;
-}
-
-.c14 {
- width: 83.33333333%;
- padding-left: 10px;
- padding-right: 10px;
-}
-
-.c17 {
- color: #c12c30;
- font-weight: bold;
- font-size: 19px;
- padding-bottom: 1px;
- padding-left: 4px;
- display: none;
-}
-
-.c15 {
- font-family: inherit;
- font-size: inherit;
- line-height: inherit;
- display: block;
- height: 22px;
- color: #4C4C4C;
- background-color: #fff;
- background-image: none;
- border: 1px solid #bfbfbf;
- border-radius: 2px;
- padding: 1px 8px;
-}
-
-.c15:-webkit-autofill {
- box-shadow: 0 0 0 1000px white inset;
-}
-
-.c16 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-
-
-
-
-
-
-
-
- New Container Task
-
-
- ×
-
-
-
-
-
- Cancel
-
-
- Save
-
-
-
-
-
-
-
-
-
-
-`;
-
-exports[`ContainerDialog tests > should render edit dialog 1`] = `
-.c3 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c7 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: flex-start;
- -webkit-box-align: flex-start;
- -ms-flex-align: flex-start;
- align-items: flex-start;
-}
-
-.c10 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
-}
-
-.c13 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c24 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-flex-shrink: 0;
- -ms-flex-negative: 0;
- flex-shrink: 0;
- -webkit-box-pack: end;
- -ms-flex-pack: end;
- -webkit-justify-content: flex-end;
- justify-content: flex-end;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c19 {
- margin-left: -5px;
-}
-
-.c19>* {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c19>* {
- margin-left: 5px;
-}
-
-.c18 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c1 {
- position: relative;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- margin: 10% auto;
- border: 0;
- outline: 0;
- width: 800px;
- height: px;
-}
-
-.c0 {
- position: fixed;
- font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
- font-size: 1.1em;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- margin: 0;
- background: rgba(102, 102, 102, 0.5);
- z-index: 600;
- -webkit-transition: opacity 1s ease-in;
- transition: opacity 1s ease-in;
- width: 100%;
- height: 100%;
-}
-
-.c31 {
- width: 0;
- height: 0;
- cursor: nwse-resize;
- border-right: 20px solid transparent;
- border-bottom: 20px solid transparent;
- border-top: 20px solid #fff;
-}
-
-.c30 {
- position: absolute;
- bottom: 3px;
- right: 3px;
- width: 20px;
- height: 20px;
- background: repeating-linear-gradient( -45deg, transparent, transparent 2px, #000 2px, #000 3px );
-}
-
-.c2 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- height: inherit;
- padding: 0;
- background: #fff;
- box-shadow: 5px 5px 10px #7F7F7F;
- border-radius: 3px;
- border: 1px solid #7F7F7F;
-}
-
-.c5 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- font-weight: bold;
- font-size: 12px;
- font-family: Verdana,sans-serif;
- color: #074320;
- cursor: pointer;
- border-radius: 2px;
- padding: 0;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-flex-shrink: 0;
- -ms-flex-negative: 0;
- flex-shrink: 0;
-}
-
-.c5 :hover {
- border: 1px solid #074320;
-}
-
-.c6 {
- height: 24px;
- width: 24px;
- line-height: 24px;
-}
-
-.c6 * {
- height: inherit;
- width: inherit;
-}
-
-.c27 {
- display: inline-block;
- padding: 0 15px;
- color: #4C4C4C;
- text-align: center;
- vertical-align: middle;
- font-size: 11px;
- font-weight: bold;
- line-height: 30px;
- -webkit-text-decoration: none;
- text-decoration: none;
- white-space: nowrap;
- background-color: #fff;
- border-radius: 2px;
- border: 1px solid #bfbfbf;
- cursor: pointer;
- overflow: visible;
- z-index: 1;
-}
-
-.c27:focus,
-.c27:hover {
- border: 1px solid #4C4C4C;
-}
-
-.c27:hover {
- -webkit-text-decoration: none;
- text-decoration: none;
- background: #11ab51;
- font-weight: bold;
- color: #fff;
-}
-
-.c27[disabled] {
- cursor: not-allowed;
- opacity: 0.65;
- box-shadow: none;
-}
-
-.c27 img {
- height: 32px;
- width: 32px;
- margin-top: 5px 10px 5px -10px;
- vertical-align: middle;
-}
-
-.c27:link {
- -webkit-text-decoration: none;
- text-decoration: none;
- color: #4C4C4C;
-}
-
-.c28 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c29 {
- border: 1px solid #7F7F7F;
- color: #fff;
- background: #11ab51;
-}
-
-.c29 :hover {
- color: #074320;
- background: #A1DDBA;
-}
-
-.c25 {
- border-width: 1px 0 0 0;
- border-style: solid;
- border-color: #e5e5e5;
- margin-top: 15px;
- padding: 10px 20px 10px 20px;
-}
-
-.c26 {
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
-}
-
-.c4 {
- padding: 5px 5px 5px 10px;
- margin-bottom: 15px;
- border-radius: 2px 2px 0 0;
- border-bottom: 1px solid #7F7F7F;
- color: #fff;
- font-weight: bold;
- background: #11ab51;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
- -webkit-flex-shrink: 0;
- -ms-flex-negative: 0;
- flex-shrink: 0;
- cursor: -webkit-grab;
- cursor: grab;
-}
-
-.c9 {
- overflow: auto;
- padding: 0 15px;
- width: 100%;
- height: 100%;
- max-height: 400px;
-}
-
-.c8 {
- overflow: hidden;
- height: 100%;
-}
-
-.c11 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- padding-bottom: 10px;
-}
-
-.c12 {
- display: inline-block;
- max-width: 100%;
- font-weight: bold;
- text-align: right;
- padding-left: 10px;
- padding-right: 10px;
- width: 16.66666667%;
- margin-left: 0;
-}
-
-.c14 {
- width: 83.33333333%;
- padding-left: 10px;
- padding-right: 10px;
-}
-
-.c17 {
- color: #c12c30;
- font-weight: bold;
- font-size: 19px;
- padding-bottom: 1px;
- padding-left: 4px;
- display: none;
-}
-
-.c15 {
- font-family: inherit;
- font-size: inherit;
- line-height: inherit;
- display: block;
- height: 22px;
- color: #4C4C4C;
- background-color: #fff;
- background-image: none;
- border: 1px solid #bfbfbf;
- border-radius: 2px;
- padding: 1px 8px;
-}
-
-.c15:-webkit-autofill {
- box-shadow: 0 0 0 1000px white inset;
-}
-
-.c16 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c20 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- font-weight: normal;
- cursor: pointer;
-}
-
-.c21 {
- font-family: inherit;
- font-size: inherit;
- padding: 0;
- margin: 0;
- margin-left: 10px;
- line-height: normal;
- width: auto;
- height: auto;
-}
-
-.c23 {
- opacity: 1;
-}
-
-.c22 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: flex-start;
- justify-content: flex-start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-
-
-
-
-
-
-
-
- New Container Task
-
-
- ×
-
-
-
-
-
-
-
-
-
- Add results to Assets
-
-
-
-
-
-
-
-
- Cancel
-
-
- Save
-
-
-
-
-
-
-
-
-
-
-`;
diff --git a/src/web/pages/tasks/__tests__/__snapshots__/detailspage.jsx.snap b/src/web/pages/tasks/__tests__/__snapshots__/detailspage.jsx.snap
deleted file mode 100644
index 3d014424de..0000000000
--- a/src/web/pages/tasks/__tests__/__snapshots__/detailspage.jsx.snap
+++ /dev/null
@@ -1,2538 +0,0 @@
-// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
-
-exports[`Task Detailspage tests > should render full Detailspage 1`] = `
-.c0 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: flex-start;
- justify-content: flex-start;
-}
-
-.c1 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
- -webkit-align-items: flex-start;
- -webkit-box-align: flex-start;
- -ms-flex-align: flex-start;
- align-items: flex-start;
-}
-
-.c2 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c5 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: flex-start;
- justify-content: flex-start;
- -webkit-align-items: flex-start;
- -webkit-box-align: flex-start;
- -ms-flex-align: flex-start;
- align-items: flex-start;
-}
-
-.c14 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: flex-start;
- justify-content: flex-start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c19 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
- -webkit-align-items: flex-end;
- -webkit-box-align: flex-end;
- -ms-flex-align: flex-end;
- align-items: flex-end;
-}
-
-.c23 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: flex-start;
- justify-content: flex-start;
- -webkit-align-items: flex-end;
- -webkit-box-align: flex-end;
- -ms-flex-align: flex-end;
- align-items: flex-end;
-}
-
-.c27 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c28 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: flex-start;
- justify-content: flex-start;
-}
-
-.c30 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
-}
-
-.c31 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: flex-start;
- justify-content: flex-start;
- -webkit-align-items: flex-end;
- -webkit-box-align: flex-end;
- -ms-flex-align: flex-end;
- align-items: flex-end;
-}
-
-.c33 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: flex-start;
- justify-content: flex-start;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
-}
-
-.c36 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c38 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
-}
-
-.c8 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c4 {
- margin-left: -10px;
-}
-
-.c4>* {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c4>* {
- margin-left: 10px;
-}
-
-.c6 {
- margin-left: -5px;
-}
-
-.c6>* {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c6>* {
- margin-left: 5px;
-}
-
-.c3 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c15 {
- cursor: pointer;
-}
-
-.c16 svg path {
- fill: #bfbfbf;
-}
-
-.c7 {
- height: 16px;
- width: 16px;
- line-height: 16px;
-}
-
-.c7 * {
- height: inherit;
- width: inherit;
-}
-
-.c25 {
- height: 50px;
- width: 50px;
- line-height: 50px;
-}
-
-.c25 * {
- height: inherit;
- width: inherit;
-}
-
-.c20 {
- margin: 10px 0px;
- padding-bottom: 1px;
- border-bottom: 2px solid #e5e5e5;
- position: relative;
-}
-
-.c21 {
- margin: 0 0 1px 0;
-}
-
-.c22 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: flex-start;
- justify-content: flex-start;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
-}
-
-.c24 {
- margin-right: 5px;
-}
-
-.c26 {
- word-break: break-all;
- min-width: 100px;
-}
-
-.c34 {
- font-size: 16px;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: start;
- -webkit-box-align: start;
- -ms-flex-align: start;
- align-items: start;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- padding-left: 8px;
- padding-right: 8px;
- padding-bottom: 2px;
- padding-top: 2px;
- border-left: 1px solid #f3f3f3;
- border-right: 1px solid #e5e5e5;
- cursor: pointer;
- background-color: #f3f3f3;
- border-bottom: 1px solid #f3f3f3;
- margin-bottom: -2px;
- border-top: 2px solid #11ab51;
-}
-
-.c34:hover {
- border-top: 2px solid #11ab51;
-}
-
-.c34:first-child {
- border-left: 1px solid #e5e5e5;
-}
-
-.c35 {
- font-size: 16px;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: start;
- -webkit-box-align: start;
- -ms-flex-align: start;
- align-items: start;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- padding-left: 8px;
- padding-right: 8px;
- padding-bottom: 2px;
- padding-top: 2px;
- border-left: 1px solid #fff;
- border-right: 1px solid #e5e5e5;
- cursor: pointer;
- border-top: 2px solid #fff;
-}
-
-.c35:hover {
- border-top: 2px solid #e5e5e5;
-}
-
-.c35:first-child {
- border-left: 1px solid #fff;
-}
-
-.c32 {
- border-bottom: 2px solid #11ab51;
- margin-top: 30px;
- margin-bottom: 15px;
-}
-
-.c39 {
- border: 0;
- border-spacing: 0px;
- font-size: 12px;
- text-align: left;
- table-layout: auto;
-}
-
-.c49 {
- border: 0;
- border-spacing: 0px;
- font-size: 12px;
- text-align: left;
- table-layout: auto;
- width: 100%;
-}
-
-.c48>*:not(:last-child)::after {
- content: '•';
- margin-left: 5px;
-}
-
-.c40 td {
- padding: 4px 4px 4px 0;
-}
-
-.c40 tr td:first-child {
- padding-right: 5px;
-}
-
-.c29 {
- border-spacing: 0px;
- color: #7F7F7F;
- font-size: 10px;
-}
-
-.c29 :nth-child(even) {
- margin-left: 3px;
-}
-
-.c29 :nth-child(odd) {
- margin-left: 30px;
-}
-
-.c41 {
- width: 10%;
-}
-
-.c42 {
- width: 90%;
-}
-
-.c37 {
- font-size: 0.7em;
-}
-
-.c44 {
- height: 13px;
- box-sizing: content-box;
- display: inline-block;
- width: 100px;
- background: #4C4C4C;
- vertical-align: middle;
- text-align: center;
-}
-
-.c46 {
- z-index: 1;
- font-weight: bold;
- color: #fff;
- font-size: 9px;
- margin: 0;
- position: relative;
- top: -13px;
- padding-top: 1px;
-}
-
-.c45 {
- height: 13px;
- width: 100%;
- background: #4f91c7;
-}
-
-.c47 {
- white-space: nowrap;
-}
-
-.c43:hover {
- -webkit-text-decoration: none;
- text-decoration: none;
-}
-
-.c10 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
-}
-
-.c11 {
- position: relative;
- display: none;
-}
-
-.c9:hover .c11 {
- display: block;
-}
-
-.c12 {
- position: absolute;
- margin: 0;
- padding: 0;
- left: 0;
- top: 0;
- z-index: 100;
- list-style: none;
- font-size: 10px;
- width: 255px;
-}
-
-.c13 {
- height: 22px;
- width: 255px;
- border-left: 1px solid #7F7F7F;
- border-right: 1px solid #7F7F7F;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
- background-color: #fff;
- font-weight: bold;
- text-indent: 12px;
- text-align: left;
-}
-
-.c13:first-child {
- border-top: 1px solid #7F7F7F;
-}
-
-.c13:last-child {
- border-bottom: 1px solid #7F7F7F;
-}
-
-.c13:hover {
- background: #11ab51;
- color: #fff;
-}
-
-.c13 div {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- cursor: pointer;
-}
-
-.c17 {
- position: relative;
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
- margin-right: 0px;
-}
-
-.c18 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex-wrap: wrap;
- -webkit-flex-wrap: wrap;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-content: center;
- -ms-flex-line-pack: center;
- align-content: center;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- position: absolute;
- font-size: 10px;
- background-color: red;
- font-weight: bold;
- border-radius: 10px;
- min-width: 10px;
- padding: 3px 5px;
- z-index: 1;
- background-color: #11ab51;
- color: #fff;
- bottom: -8px;
- right: 0px;
-}
-
-@media print {
- .c15 {
- display: none;
- }
-}
-
-@media print {
- .c39 {
- border-collapse: collapse;
- }
-}
-
-@media print {
- .c49 {
- border-collapse: collapse;
- }
-}
-
-@media print {
- .c44 {
- background: none;
- border: 0;
- }
-}
-
-@media print {
- .c46 {
- color: black;
- }
-}
-
-@media print {
- .c45 {
- background: none;
- }
-}
-
-
-
-
-
-
-
-
-
- Information
-
-
-
-
- User Tags
-
-
- (
-
- 0
-
- )
-
-
-
-
-
-
- Permissions
-
-
- (
-
- 0
-
- )
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Name
-
-
-
-
- foo
-
-
-
-
-
-
- Comment
-
-
-
-
- bar
-
-
-
-
-
-
- Alterable
-
-
-
-
- Yes
-
-
-
-
-
-
- Status
-
-
-
-
-
-
-
-
-
-
-
-
-
- Scanner
-
-
-
-
-
-
-
-
-
-
-
- Name
-
-
-
-
-
-
-
-
-
- Type
-
-
-
-
- OpenVAS Scanner
-
-
-
-
-
-
-
-
-
- Assets
-
-
-
-
-
-
-
-
-
-
-
- Add to Assets
-
-
-
-
- Yes
-
-
-
-
-
-
- Apply Overrides
-
-
-
-
- Yes
-
-
-
-
-
-
- Min QoD
-
-
-
-
- 70 %
-
-
-
-
-
-
-
-
-
- Scan
-
-
-
-
-
-
-
-
-
-
-
- Duration of last Scan
-
-
-
-
- 2 minutes
-
-
-
-
-
-
- Auto delete Reports
-
-
-
-
- Do not automatically delete reports
-
-
-
-
-
-
-
-
-
-
-
-
-`;
-
-exports[`Task ToolBarIcons tests > should render 1`] = `
-.c0 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c3 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: flex-start;
- justify-content: flex-start;
- -webkit-align-items: flex-start;
- -webkit-box-align: flex-start;
- -ms-flex-align: flex-start;
- align-items: flex-start;
-}
-
-.c12 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: flex-start;
- justify-content: flex-start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c6 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c2 {
- margin-left: -10px;
-}
-
-.c2>* {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c2>* {
- margin-left: 10px;
-}
-
-.c4 {
- margin-left: -5px;
-}
-
-.c4>* {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c4>* {
- margin-left: 5px;
-}
-
-.c1 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c13 {
- cursor: pointer;
-}
-
-.c14 svg path {
- fill: #bfbfbf;
-}
-
-.c5 {
- height: 16px;
- width: 16px;
- line-height: 16px;
-}
-
-.c5 * {
- height: inherit;
- width: inherit;
-}
-
-.c8 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
-}
-
-.c9 {
- position: relative;
- display: none;
-}
-
-.c7:hover .c9 {
- display: block;
-}
-
-.c10 {
- position: absolute;
- margin: 0;
- padding: 0;
- left: 0;
- top: 0;
- z-index: 100;
- list-style: none;
- font-size: 10px;
- width: 255px;
-}
-
-.c11 {
- height: 22px;
- width: 255px;
- border-left: 1px solid #7F7F7F;
- border-right: 1px solid #7F7F7F;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
- background-color: #fff;
- font-weight: bold;
- text-indent: 12px;
- text-align: left;
-}
-
-.c11:first-child {
- border-top: 1px solid #7F7F7F;
-}
-
-.c11:last-child {
- border-bottom: 1px solid #7F7F7F;
-}
-
-.c11:hover {
- background: #11ab51;
- color: #fff;
-}
-
-.c11 div {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- cursor: pointer;
-}
-
-.c15 {
- position: relative;
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
- margin-right: 0px;
-}
-
-.c16 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex-wrap: wrap;
- -webkit-flex-wrap: wrap;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-content: center;
- -ms-flex-line-pack: center;
- align-content: center;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- position: absolute;
- font-size: 10px;
- background-color: red;
- font-weight: bold;
- border-radius: 10px;
- min-width: 10px;
- padding: 3px 5px;
- z-index: 1;
- background-color: #11ab51;
- color: #fff;
- bottom: -8px;
- right: 0px;
-}
-
-@media print {
- .c13 {
- display: none;
- }
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- New Task
-
-
-
-
- New Container Task
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-`;
diff --git a/src/web/pages/tasks/__tests__/__snapshots__/listpage.jsx.snap b/src/web/pages/tasks/__tests__/__snapshots__/listpage.jsx.snap
deleted file mode 100644
index 085c619886..0000000000
--- a/src/web/pages/tasks/__tests__/__snapshots__/listpage.jsx.snap
+++ /dev/null
@@ -1,308 +0,0 @@
-// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
-
-exports[`TaskPage ToolBarIcons test > should render 1`] = `
-.c0 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c9 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: flex-start;
- justify-content: flex-start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c2 {
- margin-left: -5px;
-}
-
-.c2>* {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c2>* {
- margin-left: 5px;
-}
-
-.c1 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c3 {
- height: 16px;
- width: 16px;
- line-height: 16px;
-}
-
-.c3 * {
- height: inherit;
- width: inherit;
-}
-
-.c5 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
-}
-
-.c6 {
- position: relative;
- display: none;
-}
-
-.c4:hover .c6 {
- display: block;
-}
-
-.c7 {
- position: absolute;
- margin: 0;
- padding: 0;
- left: 0;
- top: 0;
- z-index: 100;
- list-style: none;
- font-size: 10px;
- width: 255px;
-}
-
-.c8 {
- height: 22px;
- width: 255px;
- border-left: 1px solid #7F7F7F;
- border-right: 1px solid #7F7F7F;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
- background-color: #fff;
- font-weight: bold;
- text-indent: 12px;
- text-align: left;
-}
-
-.c8:first-child {
- border-top: 1px solid #7F7F7F;
-}
-
-.c8:last-child {
- border-bottom: 1px solid #7F7F7F;
-}
-
-.c8:hover {
- background: #11ab51;
- color: #fff;
-}
-
-.c8 div {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- cursor: pointer;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Task Wizard
-
-
-
-
- Advanced Task Wizard
-
-
-
-
- Modify Task Wizard
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- New Task
-
-
-
-
- New Container Task
-
-
-
-
-
-
-
-`;
diff --git a/src/web/pages/tasks/__tests__/__snapshots__/row.jsx.snap b/src/web/pages/tasks/__tests__/__snapshots__/row.jsx.snap
deleted file mode 100644
index 469ca7ac53..0000000000
--- a/src/web/pages/tasks/__tests__/__snapshots__/row.jsx.snap
+++ /dev/null
@@ -1,601 +0,0 @@
-// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
-
-exports[`Task Row tests > should render 1`] = `
-.c0 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
-}
-
-.c1 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
-}
-
-.c3 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c13 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
-}
-
-.c15 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
-}
-
-.c16 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c17 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c6 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c5 {
- margin-left: -5px;
-}
-
-.c5>* {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c5>* {
- margin-left: 5px;
-}
-
-.c4 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c18 {
- cursor: pointer;
-}
-
-.c19 svg path {
- fill: #bfbfbf;
-}
-
-.c14 {
- height: 16px;
- width: 16px;
- line-height: 16px;
-}
-
-.c14 * {
- height: inherit;
- width: inherit;
-}
-
-.c2 {
- cursor: pointer;
- -webkit-text-decoration: none;
- text-decoration: none;
- color: #0a53b8;
-}
-
-.c2 :hover {
- -webkit-text-decoration: underline;
- text-decoration: underline;
- color: #0a53b8;
-}
-
-.c8 {
- height: 13px;
- box-sizing: content-box;
- display: inline-block;
- width: 100px;
- background: #4C4C4C;
- vertical-align: middle;
- text-align: center;
-}
-
-.c10 {
- z-index: 1;
- font-weight: bold;
- color: #fff;
- font-size: 9px;
- margin: 0;
- position: relative;
- top: -13px;
- padding-top: 1px;
-}
-
-.c9 {
- height: 13px;
- width: 100%;
- background: #4f91c7;
-}
-
-.c12 {
- height: 13px;
- width: 50%;
- background: #f0a519;
-}
-
-.c11 {
- white-space: nowrap;
-}
-
-.c7:hover {
- -webkit-text-decoration: none;
- text-decoration: none;
-}
-
-@media print {
- .c18 {
- display: none;
- }
-}
-
-@media print {
- .c2 {
- color: #000;
- }
-}
-
-@media print {
- .c8 {
- background: none;
- border: 0;
- }
-}
-
-@media print {
- .c10 {
- color: black;
- }
-}
-
-@media print {
- .c9 {
- background: none;
- }
-}
-
-@media print {
- .c12 {
- background: none;
- }
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-`;
diff --git a/src/web/pages/tasks/__tests__/__snapshots__/table.jsx.snap b/src/web/pages/tasks/__tests__/__snapshots__/table.jsx.snap
deleted file mode 100644
index 4328ee971b..0000000000
--- a/src/web/pages/tasks/__tests__/__snapshots__/table.jsx.snap
+++ /dev/null
@@ -1,2109 +0,0 @@
-// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
-
-exports[`Tasks table tests > should render 1`] = `
-.c0 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
-}
-
-.c2 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
-}
-
-.c6 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: end;
- -ms-flex-pack: end;
- -webkit-justify-content: flex-end;
- justify-content: flex-end;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c8 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c22 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
-}
-
-.c24 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
-}
-
-.c25 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
-}
-
-.c34 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
-}
-
-.c35 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c36 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c45 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c27 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c10 {
- margin-left: -5px;
-}
-
-.c10>* {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c10>* {
- margin-left: 5px;
-}
-
-.c9 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c3 {
- cursor: pointer;
-}
-
-.c11 svg path {
- fill: #bfbfbf;
-}
-
-.c4 {
- height: 16px;
- width: 16px;
- line-height: 16px;
-}
-
-.c4 * {
- height: inherit;
- width: inherit;
-}
-
-.c46 {
- background-color: transparent;
- border: none;
- cursor: pointer;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- outline: none;
- margin: 1px;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- cursor: pointer;
-}
-
-.c47 {
- height: 16px;
- width: 16px;
- line-height: 16px;
-}
-
-.c47 * {
- height: inherit;
- width: inherit;
-}
-
-.c42 {
- border: 1px solid #bfbfbf;
- border-radius: 2px;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- padding: 1px 5px;
- background-color: #fff;
- color: #000;
- font-weight: normal;
-}
-
-.c41 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- position: relative;
- width: 180px;
-}
-
-.c43 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- word-break: keep-all;
- white-space: nowrap;
- overflow: hidden;
- cursor: pointer;
-}
-
-.c48 {
- color: #c12c30;
- font-weight: bold;
- font-size: 19px;
- padding-bottom: 1px;
- padding-left: 4px;
- display: none;
-}
-
-.c44 {
- cursor: default;
-}
-
-.c40 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
-}
-
-.c13 {
- border: 0;
- border-spacing: 0px;
- font-size: 12px;
- text-align: left;
- table-layout: auto;
- width: 100%;
-}
-
-.c14 th,
-.c14 td {
- padding: 4px 10px;
- border-bottom: 1px solid #e5e5e5;
-}
-
-.c14 tfoot tr {
- background: #fff;
-}
-
-.c14 tfoot tr td {
- border-bottom: 1px solid #e5e5e5;
-}
-
-.c16 a {
- -webkit-text-decoration: none;
- text-decoration: none;
- color: #000;
-}
-
-.c16 a:hover {
- -webkit-text-decoration: underline;
- text-decoration: underline;
- color: #000;
-}
-
-.c17 {
- background-color: #fff;
- color: #000;
- border-top: 1px solid #e5e5e5;
- font-weight: bold;
- width: 41%;
-}
-
-.c18 {
- background-color: #fff;
- color: #000;
- border-top: 1px solid #e5e5e5;
- font-weight: bold;
- width: 8%;
-}
-
-.c19 {
- background-color: #fff;
- color: #000;
- border-top: 1px solid #e5e5e5;
- font-weight: bold;
- width: 6%;
-}
-
-.c20 {
- background-color: #fff;
- color: #000;
- border-top: 1px solid #e5e5e5;
- font-weight: bold;
- width: 24%;
-}
-
-.c21 {
- background-color: #fff;
- color: #000;
- border-top: 1px solid #e5e5e5;
- font-weight: bold;
- width: 5%;
-}
-
-.c23 {
- background-color: #fff;
- color: #000;
- border-top: 1px solid #e5e5e5;
- font-weight: bold;
- width: 10em;
-}
-
-.c49 {
- font-size: 10px;
- color: #7F7F7F;
- text-align: left;
-}
-
-.c12 {
- margin: 0 3px;
-}
-
-.c7 {
- margin: 2px 3px;
-}
-
-.c15 {
- opacity: 1.0;
-}
-
-.c5 {
- margin-top: 2px;
- margin-left: 2px;
-}
-
-.c1 {
- margin-top: 20px;
-}
-
-.c26 {
- cursor: pointer;
- -webkit-text-decoration: none;
- text-decoration: none;
- color: #0a53b8;
-}
-
-.c26 :hover {
- -webkit-text-decoration: underline;
- text-decoration: underline;
- color: #0a53b8;
-}
-
-.c29 {
- height: 13px;
- box-sizing: content-box;
- display: inline-block;
- width: 100px;
- background: #4C4C4C;
- vertical-align: middle;
- text-align: center;
-}
-
-.c31 {
- z-index: 1;
- font-weight: bold;
- color: #fff;
- font-size: 9px;
- margin: 0;
- position: relative;
- top: -13px;
- padding-top: 1px;
-}
-
-.c30 {
- height: 13px;
- width: 100%;
- background: #4f91c7;
-}
-
-.c33 {
- height: 13px;
- width: 50%;
- background: #f0a519;
-}
-
-.c37 {
- height: 13px;
- width: 100%;
- background: #99be48;
-}
-
-.c38 {
- height: 13px;
- width: 0%;
- background: #70c000;
-}
-
-.c39 {
- height: 13px;
- width: 100%;
- background: #c83814;
-}
-
-.c32 {
- white-space: nowrap;
-}
-
-.c28:hover {
- -webkit-text-decoration: none;
- text-decoration: none;
-}
-
-@media print {
- .c3 {
- display: none;
- }
-}
-
-@media print {
- .c13 {
- border-collapse: collapse;
- }
-}
-
-@media screen {
- .c14>tbody:nth-of-type(even),
- .c14>tbody:only-of-type>tr:nth-of-type(even) {
- background: #f3f3f3;
- }
-
- .c14>tbody:not(:only-of-type):hover,
- .c14>tbody:only-of-type>tr:hover {
- background: #e5e5e5;
- }
-}
-
-@media print {
- .c16 {
- border-bottom: 1px solid black;
- }
-
- .c16 a,
- .c16 a:hover {
- -webkit-text-decoration: none;
- text-decoration: none;
- color: #000;
- }
-}
-
-@media print {
- .c17 {
- color: #000;
- font-size: 1.2em;
- background-color: transparent;
- font-weight: bold;
- }
-}
-
-@media print {
- .c18 {
- color: #000;
- font-size: 1.2em;
- background-color: transparent;
- font-weight: bold;
- }
-}
-
-@media print {
- .c19 {
- color: #000;
- font-size: 1.2em;
- background-color: transparent;
- font-weight: bold;
- }
-}
-
-@media print {
- .c20 {
- color: #000;
- font-size: 1.2em;
- background-color: transparent;
- font-weight: bold;
- }
-}
-
-@media print {
- .c21 {
- color: #000;
- font-size: 1.2em;
- background-color: transparent;
- font-weight: bold;
- }
-}
-
-@media print {
- .c23 {
- color: #000;
- font-size: 1.2em;
- background-color: transparent;
- font-weight: bold;
- }
-}
-
-@media print {
- .c7 svg {
- display: none;
- }
-}
-
-@media print {
- .c26 {
- color: #000;
- }
-}
-
-@media print {
- .c29 {
- background: none;
- border: 0;
- }
-}
-
-@media print {
- .c31 {
- color: black;
- }
-}
-
-@media print {
- .c30 {
- background: none;
- }
-}
-
-@media print {
- .c33 {
- background: none;
- }
-}
-
-@media print {
- .c37 {
- background: none;
- }
-}
-
-@media print {
- .c38 {
- background: none;
- }
-}
-
-@media print {
- .c39 {
- background: none;
- }
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1 - 1 of 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Name
-
-
-
-
- Status
-
-
-
-
- Reports
-
-
-
-
- Last Report
-
-
-
-
- Severity
-
-
-
-
- Trend
-
-
-
-
- Actions
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- (Applied filter: rows=2)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1 - 1 of 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-`;
diff --git a/src/web/pages/tasks/__tests__/__snapshots__/trend.jsx.snap b/src/web/pages/tasks/__tests__/__snapshots__/trend.jsx.snap
deleted file mode 100644
index 7495d7bf95..0000000000
--- a/src/web/pages/tasks/__tests__/__snapshots__/trend.jsx.snap
+++ /dev/null
@@ -1,43 +0,0 @@
-// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
-
-exports[`Task Trend tests > should render 1`] = `
-.c0 {
- height: 16px;
- width: 16px;
- line-height: 16px;
-}
-
-.c0 * {
- height: inherit;
- width: inherit;
-}
-
-
-
-
-
-
-
-
-
-
-`;
diff --git a/src/web/pages/tasks/__tests__/actions.jsx b/src/web/pages/tasks/__tests__/actions.jsx
index e6a4566b5f..974d3be9e3 100644
--- a/src/web/pages/tasks/__tests__/actions.jsx
+++ b/src/web/pages/tasks/__tests__/actions.jsx
@@ -55,7 +55,7 @@ describe('Task Actions tests', () => {
/>,
);
- expect(baseElement).toMatchSnapshot();
+ expect(baseElement).toBeVisible();
});
test('should call click handlers', () => {
diff --git a/src/web/pages/tasks/__tests__/containerdialog.jsx b/src/web/pages/tasks/__tests__/containerdialog.jsx
index 0e14e1d963..5aa8844fd6 100644
--- a/src/web/pages/tasks/__tests__/containerdialog.jsx
+++ b/src/web/pages/tasks/__tests__/containerdialog.jsx
@@ -19,7 +19,7 @@ describe('ContainerDialog tests', () => {
,
);
- expect(baseElement).toMatchSnapshot();
+ expect(baseElement).toBeVisible();
});
test('should render edit dialog', () => {
@@ -31,7 +31,7 @@ describe('ContainerDialog tests', () => {
,
);
- expect(baseElement).toMatchSnapshot();
+ expect(baseElement).toBeVisible();
});
test('should change fields in create dialog', () => {
diff --git a/src/web/pages/tasks/__tests__/detailspage.jsx b/src/web/pages/tasks/__tests__/detailspage.jsx
index 09a9a14d4d..395d0899e1 100644
--- a/src/web/pages/tasks/__tests__/detailspage.jsx
+++ b/src/web/pages/tasks/__tests__/detailspage.jsx
@@ -330,7 +330,7 @@ describe('Task Detailspage tests', () => {
,
);
- expect(element).toMatchSnapshot();
+ expect(element).toBeVisible();
expect(element).toHaveTextContent('Task: foo');
@@ -641,7 +641,7 @@ describe('Task ToolBarIcons tests', () => {
/>,
);
- expect(element).toMatchSnapshot();
+ expect(element).toBeVisible();
const icons = getAllByTestId('svg-icon');
const links = element.querySelectorAll('a');
diff --git a/src/web/pages/tasks/__tests__/listpage.jsx b/src/web/pages/tasks/__tests__/listpage.jsx
index 592b24ee15..c108e4a8f7 100644
--- a/src/web/pages/tasks/__tests__/listpage.jsx
+++ b/src/web/pages/tasks/__tests__/listpage.jsx
@@ -318,7 +318,7 @@ describe('TaskPage ToolBarIcons test', () => {
onTaskWizardClick={handleTaskWizardClick}
/>,
);
- expect(element).toMatchSnapshot();
+ expect(element).toBeVisible();
const links = element.querySelectorAll('a');
const icons = getAllByTestId('svg-icon');
diff --git a/src/web/pages/tasks/__tests__/row.jsx b/src/web/pages/tasks/__tests__/row.jsx
index dfc68c8ac7..44b0cbab62 100644
--- a/src/web/pages/tasks/__tests__/row.jsx
+++ b/src/web/pages/tasks/__tests__/row.jsx
@@ -92,8 +92,6 @@ describe('Task Row tests', () => {
/>,
);
- expect(baseElement).toMatchSnapshot();
-
// Name
expect(baseElement).toHaveTextContent('foo');
expect(baseElement).toHaveTextContent('(bar)');
diff --git a/src/web/pages/tasks/__tests__/table.jsx b/src/web/pages/tasks/__tests__/table.jsx
index 79d05da265..dc6f774de7 100644
--- a/src/web/pages/tasks/__tests__/table.jsx
+++ b/src/web/pages/tasks/__tests__/table.jsx
@@ -134,7 +134,6 @@ describe('Tasks table tests', () => {
/>,
);
- expect(baseElement).toMatchSnapshot();
const header = baseElement.querySelectorAll('th');
expect(header[0]).toHaveTextContent('Name');
expect(header[1]).toHaveTextContent('Status');
diff --git a/src/web/pages/tasks/__tests__/trend.jsx b/src/web/pages/tasks/__tests__/trend.jsx
index de2e007fea..7f09fe7780 100644
--- a/src/web/pages/tasks/__tests__/trend.jsx
+++ b/src/web/pages/tasks/__tests__/trend.jsx
@@ -13,7 +13,7 @@ describe('Task Trend tests', () => {
test('should render', () => {
const {element} = render(
);
- expect(element).toMatchSnapshot();
+ expect(element).toBeVisible();
});
test('should render trend up icon', () => {
diff --git a/src/web/pages/tickets/__tests__/__snapshots__/createdialog.jsx.snap b/src/web/pages/tickets/__tests__/__snapshots__/createdialog.jsx.snap
deleted file mode 100644
index 0866b87b7b..0000000000
--- a/src/web/pages/tickets/__tests__/__snapshots__/createdialog.jsx.snap
+++ /dev/null
@@ -1,696 +0,0 @@
-// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
-
-exports[`CreateTicketDialog component tests > should render dialog 1`] = `
-.c3 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c7 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: flex-start;
- -webkit-box-align: flex-start;
- -ms-flex-align: flex-start;
- align-items: flex-start;
-}
-
-.c10 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
-}
-
-.c13 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c20 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c26 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-flex-shrink: 0;
- -ms-flex-negative: 0;
- flex-shrink: 0;
- -webkit-box-pack: end;
- -ms-flex-pack: end;
- -webkit-justify-content: flex-end;
- justify-content: flex-end;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c1 {
- position: relative;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- margin: 10% auto;
- border: 0;
- outline: 0;
- width: 800px;
- height: px;
-}
-
-.c0 {
- position: fixed;
- font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
- font-size: 1.1em;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- margin: 0;
- background: rgba(102, 102, 102, 0.5);
- z-index: 600;
- -webkit-transition: opacity 1s ease-in;
- transition: opacity 1s ease-in;
- width: 100%;
- height: 100%;
-}
-
-.c33 {
- width: 0;
- height: 0;
- cursor: nwse-resize;
- border-right: 20px solid transparent;
- border-bottom: 20px solid transparent;
- border-top: 20px solid #fff;
-}
-
-.c32 {
- position: absolute;
- bottom: 3px;
- right: 3px;
- width: 20px;
- height: 20px;
- background: repeating-linear-gradient( -45deg, transparent, transparent 2px, #000 2px, #000 3px );
-}
-
-.c2 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- height: inherit;
- padding: 0;
- background: #fff;
- box-shadow: 5px 5px 10px #7F7F7F;
- border-radius: 3px;
- border: 1px solid #7F7F7F;
-}
-
-.c5 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- font-weight: bold;
- font-size: 12px;
- font-family: Verdana,sans-serif;
- color: #074320;
- cursor: pointer;
- border-radius: 2px;
- padding: 0;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-flex-shrink: 0;
- -ms-flex-negative: 0;
- flex-shrink: 0;
-}
-
-.c5 :hover {
- border: 1px solid #074320;
-}
-
-.c6 {
- height: 24px;
- width: 24px;
- line-height: 24px;
-}
-
-.c6 * {
- height: inherit;
- width: inherit;
-}
-
-.c29 {
- display: inline-block;
- padding: 0 15px;
- color: #4C4C4C;
- text-align: center;
- vertical-align: middle;
- font-size: 11px;
- font-weight: bold;
- line-height: 30px;
- -webkit-text-decoration: none;
- text-decoration: none;
- white-space: nowrap;
- background-color: #fff;
- border-radius: 2px;
- border: 1px solid #bfbfbf;
- cursor: pointer;
- overflow: visible;
- z-index: 1;
-}
-
-.c29:focus,
-.c29:hover {
- border: 1px solid #4C4C4C;
-}
-
-.c29:hover {
- -webkit-text-decoration: none;
- text-decoration: none;
- background: #11ab51;
- font-weight: bold;
- color: #fff;
-}
-
-.c29[disabled] {
- cursor: not-allowed;
- opacity: 0.65;
- box-shadow: none;
-}
-
-.c29 img {
- height: 32px;
- width: 32px;
- margin-top: 5px 10px 5px -10px;
- vertical-align: middle;
-}
-
-.c29:link {
- -webkit-text-decoration: none;
- text-decoration: none;
- color: #4C4C4C;
-}
-
-.c30 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c31 {
- border: 1px solid #7F7F7F;
- color: #fff;
- background: #11ab51;
-}
-
-.c31 :hover {
- color: #074320;
- background: #A1DDBA;
-}
-
-.c27 {
- border-width: 1px 0 0 0;
- border-style: solid;
- border-color: #e5e5e5;
- margin-top: 15px;
- padding: 10px 20px 10px 20px;
-}
-
-.c28 {
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
-}
-
-.c4 {
- padding: 5px 5px 5px 10px;
- margin-bottom: 15px;
- border-radius: 2px 2px 0 0;
- border-bottom: 1px solid #7F7F7F;
- color: #fff;
- font-weight: bold;
- background: #11ab51;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
- -webkit-flex-shrink: 0;
- -ms-flex-negative: 0;
- flex-shrink: 0;
- cursor: -webkit-grab;
- cursor: grab;
-}
-
-.c9 {
- overflow: auto;
- padding: 0 15px;
- width: 100%;
- height: 100%;
- max-height: 400px;
-}
-
-.c8 {
- overflow: hidden;
- height: 100%;
-}
-
-.c11 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- padding-bottom: 10px;
-}
-
-.c12 {
- display: inline-block;
- max-width: 100%;
- font-weight: bold;
- text-align: right;
- padding-left: 10px;
- padding-right: 10px;
- width: 16.66666667%;
- margin-left: 0;
-}
-
-.c14 {
- width: 83.33333333%;
- padding-left: 10px;
- padding-right: 10px;
-}
-
-.c21 {
- background-color: transparent;
- border: none;
- cursor: pointer;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- outline: none;
- margin: 1px;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- cursor: pointer;
-}
-
-.c22 {
- height: 16px;
- width: 16px;
- line-height: 16px;
-}
-
-.c22 * {
- height: inherit;
- width: inherit;
-}
-
-.c17 {
- border: 1px solid #bfbfbf;
- border-radius: 2px;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- padding: 1px 5px;
- background-color: #fff;
- color: #000;
- font-weight: normal;
-}
-
-.c16 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- position: relative;
- width: 180px;
-}
-
-.c18 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- word-break: keep-all;
- white-space: nowrap;
- overflow: hidden;
- cursor: pointer;
-}
-
-.c23 {
- color: #c12c30;
- font-weight: bold;
- font-size: 19px;
- padding-bottom: 1px;
- padding-left: 4px;
- display: none;
-}
-
-.c19 {
- cursor: default;
-}
-
-.c15 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
-}
-
-.c24 {
- display: block;
- height: auto;
- color: #4C4C4C;
- background-color: #fff;
- background-image: none;
- border: 1px solid #bfbfbf;
- border-radius: 2px;
- padding: 4px 8px;
-}
-
-.c25 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-
-
-
-
-
-
-
-
- Create new Ticket for Result
-
-
- ×
-
-
-
-
-
- Cancel
-
-
- Save
-
-
-
-
-
-
-
-
-
-
-`;
diff --git a/src/web/pages/tickets/__tests__/__snapshots__/editdialog.jsx.snap b/src/web/pages/tickets/__tests__/__snapshots__/editdialog.jsx.snap
deleted file mode 100644
index 80d384591e..0000000000
--- a/src/web/pages/tickets/__tests__/__snapshots__/editdialog.jsx.snap
+++ /dev/null
@@ -1,808 +0,0 @@
-// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
-
-exports[`EditTicketDialog component tests > should render dialog 1`] = `
-.c3 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c7 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: flex-start;
- -webkit-box-align: flex-start;
- -ms-flex-align: flex-start;
- align-items: flex-start;
-}
-
-.c10 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
-}
-
-.c13 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c20 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c26 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-flex-shrink: 0;
- -ms-flex-negative: 0;
- flex-shrink: 0;
- -webkit-box-pack: end;
- -ms-flex-pack: end;
- -webkit-justify-content: flex-end;
- justify-content: flex-end;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c1 {
- position: relative;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- margin: 10% auto;
- border: 0;
- outline: 0;
- width: 800px;
- height: px;
-}
-
-.c0 {
- position: fixed;
- font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
- font-size: 1.1em;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- margin: 0;
- background: rgba(102, 102, 102, 0.5);
- z-index: 600;
- -webkit-transition: opacity 1s ease-in;
- transition: opacity 1s ease-in;
- width: 100%;
- height: 100%;
-}
-
-.c33 {
- width: 0;
- height: 0;
- cursor: nwse-resize;
- border-right: 20px solid transparent;
- border-bottom: 20px solid transparent;
- border-top: 20px solid #fff;
-}
-
-.c32 {
- position: absolute;
- bottom: 3px;
- right: 3px;
- width: 20px;
- height: 20px;
- background: repeating-linear-gradient( -45deg, transparent, transparent 2px, #000 2px, #000 3px );
-}
-
-.c2 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- height: inherit;
- padding: 0;
- background: #fff;
- box-shadow: 5px 5px 10px #7F7F7F;
- border-radius: 3px;
- border: 1px solid #7F7F7F;
-}
-
-.c5 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- font-weight: bold;
- font-size: 12px;
- font-family: Verdana,sans-serif;
- color: #074320;
- cursor: pointer;
- border-radius: 2px;
- padding: 0;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-flex-shrink: 0;
- -ms-flex-negative: 0;
- flex-shrink: 0;
-}
-
-.c5 :hover {
- border: 1px solid #074320;
-}
-
-.c6 {
- height: 24px;
- width: 24px;
- line-height: 24px;
-}
-
-.c6 * {
- height: inherit;
- width: inherit;
-}
-
-.c29 {
- display: inline-block;
- padding: 0 15px;
- color: #4C4C4C;
- text-align: center;
- vertical-align: middle;
- font-size: 11px;
- font-weight: bold;
- line-height: 30px;
- -webkit-text-decoration: none;
- text-decoration: none;
- white-space: nowrap;
- background-color: #fff;
- border-radius: 2px;
- border: 1px solid #bfbfbf;
- cursor: pointer;
- overflow: visible;
- z-index: 1;
-}
-
-.c29:focus,
-.c29:hover {
- border: 1px solid #4C4C4C;
-}
-
-.c29:hover {
- -webkit-text-decoration: none;
- text-decoration: none;
- background: #11ab51;
- font-weight: bold;
- color: #fff;
-}
-
-.c29[disabled] {
- cursor: not-allowed;
- opacity: 0.65;
- box-shadow: none;
-}
-
-.c29 img {
- height: 32px;
- width: 32px;
- margin-top: 5px 10px 5px -10px;
- vertical-align: middle;
-}
-
-.c29:link {
- -webkit-text-decoration: none;
- text-decoration: none;
- color: #4C4C4C;
-}
-
-.c30 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.c31 {
- border: 1px solid #7F7F7F;
- color: #fff;
- background: #11ab51;
-}
-
-.c31 :hover {
- color: #074320;
- background: #A1DDBA;
-}
-
-.c27 {
- border-width: 1px 0 0 0;
- border-style: solid;
- border-color: #e5e5e5;
- margin-top: 15px;
- padding: 10px 20px 10px 20px;
-}
-
-.c28 {
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
-}
-
-.c4 {
- padding: 5px 5px 5px 10px;
- margin-bottom: 15px;
- border-radius: 2px 2px 0 0;
- border-bottom: 1px solid #7F7F7F;
- color: #fff;
- font-weight: bold;
- background: #11ab51;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- justify-content: space-between;
- -webkit-flex-shrink: 0;
- -ms-flex-negative: 0;
- flex-shrink: 0;
- cursor: -webkit-grab;
- cursor: grab;
-}
-
-.c9 {
- overflow: auto;
- padding: 0 15px;
- width: 100%;
- height: 100%;
- max-height: 400px;
-}
-
-.c8 {
- overflow: hidden;
- height: 100%;
-}
-
-.c11 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- padding-bottom: 10px;
-}
-
-.c12 {
- display: inline-block;
- max-width: 100%;
- font-weight: bold;
- text-align: right;
- padding-left: 10px;
- padding-right: 10px;
- width: 16.66666667%;
- margin-left: 0;
-}
-
-.c14 {
- width: 83.33333333%;
- padding-left: 10px;
- padding-right: 10px;
-}
-
-.c21 {
- background-color: transparent;
- border: none;
- cursor: pointer;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
- outline: none;
- margin: 1px;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- cursor: pointer;
-}
-
-.c22 {
- height: 16px;
- width: 16px;
- line-height: 16px;
-}
-
-.c22 * {
- height: inherit;
- width: inherit;
-}
-
-.c17 {
- border: 1px solid #bfbfbf;
- border-radius: 2px;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- padding: 1px 5px;
- background-color: #fff;
- color: #000;
- font-weight: normal;
-}
-
-.c16 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- position: relative;
- width: 180px;
-}
-
-.c18 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- word-break: keep-all;
- white-space: nowrap;
- overflow: hidden;
- cursor: pointer;
-}
-
-.c23 {
- color: #c12c30;
- font-weight: bold;
- font-size: 19px;
- padding-bottom: 1px;
- padding-left: 4px;
- display: none;
-}
-
-.c19 {
- cursor: default;
-}
-
-.c15 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
-}
-
-.c24 {
- display: block;
- height: auto;
- color: #4C4C4C;
- background-color: #fff;
- background-image: none;
- border: 1px solid #bfbfbf;
- border-radius: 2px;
- padding: 4px 8px;
-}
-
-.c25 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-
-
-
-
-
-
-
-
- Edit Ticket
-
-
- ×
-
-
-
-
-
-
-
-
-
-
-
- Note for Closed
-
-
-
-
-
-
-
-
- Cancel
-
-
- Save
-
-
-
-
-
-
-
-
-
-
-`;
diff --git a/src/web/pages/tickets/__tests__/createdialog.jsx b/src/web/pages/tickets/__tests__/createdialog.jsx
index 2a6ad8aec4..bec362e166 100644
--- a/src/web/pages/tickets/__tests__/createdialog.jsx
+++ b/src/web/pages/tickets/__tests__/createdialog.jsx
@@ -39,7 +39,7 @@ describe('CreateTicketDialog component tests', () => {
/>,
);
- expect(baseElement).toMatchSnapshot();
+ expect(baseElement).toBeVisible();
});
test('should allow to select user', () => {
diff --git a/src/web/pages/tickets/__tests__/editdialog.jsx b/src/web/pages/tickets/__tests__/editdialog.jsx
index 43d424138b..a8f6c69490 100644
--- a/src/web/pages/tickets/__tests__/editdialog.jsx
+++ b/src/web/pages/tickets/__tests__/editdialog.jsx
@@ -39,7 +39,7 @@ describe('EditTicketDialog component tests', () => {
/>,
);
- expect(baseElement).toMatchSnapshot();
+ expect(baseElement).toBeVisible();
});
test('should display notes', () => {
diff --git a/src/web/utils/testing.jsx b/src/web/utils/testing.jsx
index 0317cc129e..2492e9ed7f 100644
--- a/src/web/utils/testing.jsx
+++ b/src/web/utils/testing.jsx
@@ -20,6 +20,7 @@ import {
queryAllByAttribute,
getElementError,
within,
+ renderHook,
} from '@testing-library/react/pure';
import userEvent from '@testing-library/user-event';
@@ -95,6 +96,7 @@ export const render = ui => {
queryByName: name => queryByName(baseElement, name),
queryAllByName: name => queryAllByName(baseElement, name),
within: () => within(baseElement),
+ renderHook: hook => renderHook(hook, {wrapper: ui}),
rerender: component =>
rerender(
{component} ,
From ea02ad7ffdde16d8169670473926fb2569269b67 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 12 Jun 2024 14:16:28 +0000
Subject: [PATCH 024/130] Bump braces from 3.0.2 to 3.0.3
Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3.
- [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3)
---
updated-dependencies:
- dependency-name: braces
dependency-type: indirect
...
Signed-off-by: dependabot[bot]
---
package-lock.json | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 3f8bd8bad6..b1f8ff611c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5704,12 +5704,12 @@
}
},
"node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dev": true,
"dependencies": {
- "fill-range": "^7.0.1"
+ "fill-range": "^7.1.1"
},
"engines": {
"node": ">=8"
@@ -7680,9 +7680,9 @@
}
},
"node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dev": true,
"dependencies": {
"to-regex-range": "^5.0.1"
From 2bf49dcac272064c9bdada771a7f61a67a8fb3b6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?=
Date: Thu, 13 Jun 2024 10:20:10 +0200
Subject: [PATCH 025/130] Add: Add a useReload hook to make the Reload
component obsolete
The new useReload hook is based in useTiming. It calls a timing
function before every reload to calculate the timeout before the reload.
This timing function gets a isVisible argument passed. Using the
argument the timing function can decide to extend the timeout when the
current browser window is not visible.
---
src/web/hooks/__tests__/useReload.jsx | 188 ++++++++++++++++++++++++++
src/web/hooks/useReload.js | 47 +++++++
2 files changed, 235 insertions(+)
create mode 100644 src/web/hooks/__tests__/useReload.jsx
create mode 100644 src/web/hooks/useReload.js
diff --git a/src/web/hooks/__tests__/useReload.jsx b/src/web/hooks/__tests__/useReload.jsx
new file mode 100644
index 0000000000..e3a33e64eb
--- /dev/null
+++ b/src/web/hooks/__tests__/useReload.jsx
@@ -0,0 +1,188 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+/* eslint-disable react/prop-types */
+
+import {describe, test, expect, testing} from '@gsa/testing';
+
+import {act, fireEvent, render, screen} from 'web/utils/testing';
+
+import useReload from '../useReload';
+
+const TestComponent = ({reload, timeout}) => {
+ const [startTimer, clearTimer, isRunning] = useReload(reload, timeout);
+ return (
+ <>
+
+
+ {'' + isRunning}
+ >
+ );
+};
+
+const runTimers = async () => {
+ await act(async () => {
+ await testing.advanceTimersToNextTimerAsync();
+ });
+};
+
+describe('useTiming', () => {
+ test('should start a timer to reload', async () => {
+ testing.useFakeTimers();
+
+ const reload = testing.fn();
+ const timeout = testing.fn().mockImplementation(() => 900);
+
+ render( );
+
+ const isRunning = screen.getByTestId('isRunning');
+
+ expect(isRunning).toHaveTextContent('false');
+ expect(reload).not.toHaveBeenCalled();
+ expect(timeout).not.toHaveBeenCalled();
+
+ fireEvent.click(screen.getByTestId('startTimer'));
+
+ expect(isRunning).toHaveTextContent('true');
+ expect(reload).not.toHaveBeenCalled();
+ expect(timeout).toHaveBeenCalledWith({isVisible: true});
+
+ timeout.mockClear();
+
+ await runTimers();
+
+ expect(isRunning).toHaveTextContent('false');
+ expect(reload).toHaveBeenCalled();
+ expect(timeout).not.toHaveBeenCalled();
+ });
+
+ test('should reload forever', async () => {
+ testing.useFakeTimers();
+
+ const reload = testing.fn().mockResolvedValue();
+ const timeout = testing.fn().mockImplementation(() => 900);
+
+ render( );
+
+ const isRunning = screen.getByTestId('isRunning');
+
+ expect(isRunning).toHaveTextContent('false');
+ expect(reload).not.toHaveBeenCalled();
+ expect(timeout).not.toHaveBeenCalled();
+
+ fireEvent.click(screen.getByTestId('startTimer'));
+
+ expect(isRunning).toHaveTextContent('true');
+ expect(reload).not.toHaveBeenCalled();
+ expect(timeout).toHaveBeenCalledWith({isVisible: true});
+
+ timeout.mockClear();
+
+ await runTimers();
+
+ expect(isRunning).toHaveTextContent('true');
+ expect(reload).toHaveBeenCalled();
+ expect(timeout).toHaveBeenCalledWith({isVisible: true});
+
+ timeout.mockClear();
+ reload.mockClear();
+
+ await runTimers();
+
+ expect(isRunning).toHaveTextContent('true');
+ expect(reload).toHaveBeenCalled();
+ expect(timeout).toHaveBeenCalledWith({isVisible: true});
+ });
+
+ test('should not reload if loading fails', async () => {
+ testing.useFakeTimers();
+
+ const reload = testing.fn().mockRejectedValue();
+ const timeout = testing.fn().mockImplementation(() => 900);
+
+ render( );
+
+ const isRunning = screen.getByTestId('isRunning');
+
+ expect(isRunning).toHaveTextContent('false');
+ expect(reload).not.toHaveBeenCalled();
+ expect(timeout).not.toHaveBeenCalled();
+
+ fireEvent.click(screen.getByTestId('startTimer'));
+
+ expect(isRunning).toHaveTextContent('true');
+ expect(reload).not.toHaveBeenCalled();
+ expect(timeout).toHaveBeenCalledWith({isVisible: true});
+
+ timeout.mockClear();
+
+ await runTimers();
+
+ expect(isRunning).toHaveTextContent('false');
+ expect(reload).toHaveBeenCalled();
+ expect(timeout).not.toHaveBeenCalled();
+ });
+
+ test('should allow to cancel reload', async () => {
+ testing.useFakeTimers();
+
+ const reload = testing.fn().mockResolvedValue();
+ const timeout = testing.fn().mockImplementation(() => 900);
+
+ render( );
+
+ const isRunning = screen.getByTestId('isRunning');
+
+ expect(isRunning).toHaveTextContent('false');
+ expect(reload).not.toHaveBeenCalled();
+ expect(timeout).not.toHaveBeenCalled();
+
+ fireEvent.click(screen.getByTestId('startTimer'));
+
+ expect(isRunning).toHaveTextContent('true');
+ expect(reload).not.toHaveBeenCalled();
+ expect(timeout).toHaveBeenCalledWith({isVisible: true});
+
+ timeout.mockClear();
+
+ await runTimers();
+
+ expect(isRunning).toHaveTextContent('true');
+ expect(reload).toHaveBeenCalled();
+ expect(timeout).toHaveBeenCalledWith({isVisible: true});
+
+ timeout.mockClear();
+ reload.mockClear();
+
+ fireEvent.click(screen.getByTestId('clearTimer'));
+
+ await runTimers();
+
+ expect(isRunning).toHaveTextContent('false');
+ expect(reload).not.toHaveBeenCalled();
+ expect(timeout).not.toHaveBeenCalled();
+ });
+
+ test('should not start reload reload timer', async () => {
+ testing.useFakeTimers();
+
+ const reload = testing.fn();
+ const timeout = testing.fn();
+
+ render( );
+
+ const isRunning = screen.getByTestId('isRunning');
+
+ expect(isRunning).toHaveTextContent('false');
+ expect(reload).not.toHaveBeenCalled();
+ expect(timeout).not.toHaveBeenCalled();
+
+ fireEvent.click(screen.getByTestId('startTimer'));
+
+ expect(isRunning).toHaveTextContent('false');
+ expect(reload).not.toHaveBeenCalled();
+ expect(timeout).toHaveBeenCalledWith({isVisible: true});
+ });
+});
diff --git a/src/web/hooks/useReload.js b/src/web/hooks/useReload.js
new file mode 100644
index 0000000000..c950401ec6
--- /dev/null
+++ b/src/web/hooks/useReload.js
@@ -0,0 +1,47 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {useCallback, useEffect} from 'react';
+
+import useTiming from 'web/hooks/useTiming';
+
+/**
+ * A hook to reload data considering the visibility change of the browser tab.
+ *
+ * @param {Function} reloadFunc Function to call when the timer fires
+ * @param {Function} timeoutFunc Function to get the timeout value from
+ * @returns Array of startTimer function, clearTimer function and boolean isRunning
+ */
+const useReload = (reloadFunc, timeoutFunc) => {
+ const timeout = useCallback(
+ () => timeoutFunc({isVisible: !document.hidden}),
+ [timeoutFunc],
+ );
+
+ const [startTimer, clearTimer, isRunning] = useTiming(reloadFunc, timeout);
+
+ const handleVisibilityChange = useCallback(() => {
+ const isVisible = !document.hidden;
+
+ if (isVisible) {
+ // browser tab is visible again
+ // restart timer to get a possible shorter interval as the remaining time
+
+ clearTimer();
+ startTimer();
+ }
+ }, [clearTimer, startTimer]);
+
+ useEffect(() => {
+ document.addEventListener('visibilitychange', handleVisibilityChange);
+ return () => {
+ document.removeEventListener('visibilitychange', handleVisibilityChange);
+ };
+ }, [handleVisibilityChange]);
+
+ return [startTimer, clearTimer, isRunning];
+};
+
+export default useReload;
From 3af32a485001cf9ddca9ae8e5493114533e6ace0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?=
Date: Thu, 13 Jun 2024 11:34:09 +0200
Subject: [PATCH 026/130] Add: Add a useFilterSortBy hook
The hook determines the sort field and direction of a filter and allows
to change both via a returned function. The hook can be used to
implement the filter changes when clicking on the different header
columns of a entities list.
---
src/web/hooks/__tests__/useFilterSortBy.jsx | 67 +++++++++++++++++++++
src/web/hooks/useFilterSortBy.js | 49 +++++++++++++++
2 files changed, 116 insertions(+)
create mode 100644 src/web/hooks/__tests__/useFilterSortBy.jsx
create mode 100644 src/web/hooks/useFilterSortBy.js
diff --git a/src/web/hooks/__tests__/useFilterSortBy.jsx b/src/web/hooks/__tests__/useFilterSortBy.jsx
new file mode 100644
index 0000000000..263bad2164
--- /dev/null
+++ b/src/web/hooks/__tests__/useFilterSortBy.jsx
@@ -0,0 +1,67 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+/* eslint-disable react/prop-types */
+
+import {describe, test, expect, testing} from '@gsa/testing';
+
+import {fireEvent, render, screen} from 'web/utils/testing';
+
+import Filter from 'gmp/models/filter';
+
+import useFilterSortBy from '../useFilterSortBy';
+
+const TestComponent = ({filter, changeFilter}) => {
+ const [sortBy, sortDir, sortChange] = useFilterSortBy(filter, changeFilter);
+ return (
+ <>
+ {sortBy}
+ {sortDir}
+ sortChange('field')} data-testid="sortDirChange" />
+ sortChange('other-field')}
+ data-testid="sortFieldChange"
+ />
+ >
+ );
+};
+
+describe('useFilterSortBy', () => {
+ test('should return the sort by field and direction', () => {
+ const changeFilter = testing.fn();
+ const filter = Filter.fromString('sort=field');
+
+ render( );
+
+ expect(screen.getByTestId('sortBy')).toHaveTextContent('field');
+ expect(screen.getByTestId('sortDir')).toHaveTextContent('asc');
+ });
+
+ test('should change the sort direction', () => {
+ const filter = Filter.fromString('sort=field');
+ let currentFilter = filter;
+ const changeFilter = testing.fn().mockImplementation(filter => {
+ currentFilter = filter;
+ });
+
+ const {rerender} = render(
+ ,
+ );
+
+ fireEvent.click(screen.getByTestId('sortDirChange'));
+
+ expect(changeFilter).toHaveBeenCalledWith(
+ Filter.fromString('first=1 sort-reverse=field'),
+ );
+
+ // the filter is not in the state. so a rerender with the new filter is needed
+ rerender(
+ ,
+ );
+
+ expect(screen.getByTestId('sortBy')).toHaveTextContent('field');
+ expect(screen.getByTestId('sortDir')).toHaveTextContent('desc');
+ });
+});
diff --git a/src/web/hooks/useFilterSortBy.js b/src/web/hooks/useFilterSortBy.js
new file mode 100644
index 0000000000..c9a47a3540
--- /dev/null
+++ b/src/web/hooks/useFilterSortBy.js
@@ -0,0 +1,49 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {useCallback} from 'react';
+
+import {isDefined} from 'gmp/utils/identity';
+
+const ASC = 'asc';
+const DESC = 'desc';
+
+/**
+ * Hook to get the sort by field and direction from a filter
+ *
+ * @param {Filter} filter The current filter
+ * @param {Function} changeFilter Function to call when the filter changes
+ * @returns Array of the sort by field, sort direction and a function to change the sort by field
+ */
+const useFilterSortBy = (filter, changeFilter) => {
+ const reverseField = isDefined(filter)
+ ? filter.get('sort-reverse')
+ : undefined;
+ const reverse = isDefined(reverseField);
+ const sortBy =
+ reverse || !isDefined(filter) ? reverseField : filter.get('sort');
+ const sortDir = reverse ? DESC : ASC;
+
+ const sortChange = useCallback(
+ field => {
+ let sort = 'sort';
+ const newFilter = filter.copy().first();
+ const sortField = filter.getSortBy();
+
+ if (sortField && sortField === field) {
+ sort = filter.getSortOrder() === 'sort' ? 'sort-reverse' : 'sort';
+ }
+
+ newFilter.set(sort, field);
+
+ changeFilter(newFilter);
+ },
+ [changeFilter, filter],
+ );
+
+ return [sortBy, sortDir, sortChange];
+};
+
+export default useFilterSortBy;
From 5a78a99e06b630dfa4a36d807d65c9773407c480 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?=
Date: Thu, 13 Jun 2024 12:02:44 +0200
Subject: [PATCH 027/130] Add: Add a usePagination hook
The hook returns functions the update a filter for getting the next,
previous, first and last page for a list of entities.
---
src/web/hooks/__tests__/usePagination.jsx | 108 ++++++++++++++++++++++
src/web/hooks/usePagination.js | 54 +++++++++++
2 files changed, 162 insertions(+)
create mode 100644 src/web/hooks/__tests__/usePagination.jsx
create mode 100644 src/web/hooks/usePagination.js
diff --git a/src/web/hooks/__tests__/usePagination.jsx b/src/web/hooks/__tests__/usePagination.jsx
new file mode 100644
index 0000000000..827bf344c7
--- /dev/null
+++ b/src/web/hooks/__tests__/usePagination.jsx
@@ -0,0 +1,108 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+/* eslint-disable react/prop-types */
+
+import {describe, test, expect, testing} from '@gsa/testing';
+
+import {fireEvent, render, screen} from 'web/utils/testing';
+
+import Filter from 'gmp/models/filter';
+
+import usePagination from '../usePagination';
+
+const TestComponent = ({filter, counts, changeFilter}) => {
+ const [first, last, next, previous] = usePagination(
+ filter,
+ counts,
+ changeFilter,
+ );
+ return (
+ <>
+
+
+
+
+ >
+ );
+};
+
+describe('usePageFilter', () => {
+ test('should change the filter for the first page', () => {
+ const filter = Filter.fromString('first=10');
+ const counts = {filtered: 100, rows: 10};
+ const changeFilter = testing.fn();
+
+ render(
+ ,
+ );
+
+ fireEvent.click(screen.getByTestId('first'));
+
+ expect(changeFilter).toHaveBeenCalledWith(Filter.fromString('first=1'));
+ });
+
+ test('should change the filter for the last page', () => {
+ const filter = Filter.fromString('first=10');
+ const counts = {filtered: 100, rows: 10};
+ const changeFilter = testing.fn();
+
+ render(
+ ,
+ );
+
+ fireEvent.click(screen.getByTestId('last'));
+
+ expect(changeFilter).toHaveBeenCalledWith(Filter.fromString('first=91'));
+ });
+
+ test('should change the filter for the next page', () => {
+ const filter = Filter.fromString('first=10');
+ const counts = {filtered: 100, rows: 10};
+ const changeFilter = testing.fn();
+
+ render(
+ ,
+ );
+
+ fireEvent.click(screen.getByTestId('next'));
+
+ expect(changeFilter).toHaveBeenCalledWith(
+ Filter.fromString('first=20 rows=10'),
+ );
+ });
+
+ test('should change the filter for the previous page', () => {
+ const filter = Filter.fromString('first=10');
+ const counts = {filtered: 100, rows: 10};
+ const changeFilter = testing.fn();
+
+ render(
+ ,
+ );
+
+ fireEvent.click(screen.getByTestId('previous'));
+
+ expect(changeFilter).toHaveBeenCalledWith(
+ Filter.fromString('first=1 rows=10'),
+ );
+ });
+});
diff --git a/src/web/hooks/usePagination.js b/src/web/hooks/usePagination.js
new file mode 100644
index 0000000000..4149d0567e
--- /dev/null
+++ b/src/web/hooks/usePagination.js
@@ -0,0 +1,54 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {useCallback} from 'react';
+
+/**
+ * Hook to to get the filter for the next, previous, last and first page for a
+ * list of entities
+ *
+ * @example
+ *
+ * const gmp = useGmp();
+ * const [filter, setFilter] = useState(new Filter());
+ * const [entities, setEntities] = useState([]);
+ * const [counts, setCounts] = useState({});
+ * const updateFilter = useCallback(filter => {
+ * setFilter(filter);
+ * gmp.tasks.get(filter).then(response => {setEntities(response.data);setCounts(response.meta.counts)});
+ * }, [gmp.tasks]);
+ * const [first, last, next, previous] = usePagination(filter, counts, updateFilter)
+ *
+ * @param {Filter} filter Current applied filter
+ * @param {Object} counts Current entities counts. Required for calculating the
+ * last page.
+ * @param {Function} changeFilter Function to call when the new filter is applied
+ * @returns {Array} Tuple of functions to update the filter for the first, last,
+ * next and previous page.
+ */
+const usePagination = (filter, counts, changeFilter) => {
+ const getNext = useCallback(() => {
+ changeFilter(filter.next());
+ }, [filter, changeFilter]);
+
+ const getPrevious = useCallback(() => {
+ changeFilter(filter.previous());
+ }, [filter, changeFilter]);
+
+ const getFirst = useCallback(() => {
+ changeFilter(filter.first());
+ }, [filter, changeFilter]);
+
+ const getLast = useCallback(() => {
+ const last =
+ Math.floor((counts.filtered - 1) / counts.rows) * counts.rows + 1;
+ const newFilter = filter.first(last);
+ changeFilter(newFilter);
+ }, [filter, counts, changeFilter]);
+
+ return [getFirst, getLast, getNext, getPrevious];
+};
+
+export default usePagination;
From 2528ea5f19d6ac70c2aa94c7a17c278cb3a17db5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?=
Date: Thu, 13 Jun 2024 15:32:11 +0200
Subject: [PATCH 028/130] Add: Add a useSelection hook
The useSelection hook implements the entity selection at a entities list
table. It is possible to select/deselect specific entities from the
list/table, to select all entities displayed at the page or all entities
for the current filter (filter without rows value applied).
---
src/web/hooks/__tests__/useSelection.jsx | 78 ++++++++++++++++++++++++
src/web/hooks/useSelection.js | 58 ++++++++++++++++++
2 files changed, 136 insertions(+)
create mode 100644 src/web/hooks/__tests__/useSelection.jsx
create mode 100644 src/web/hooks/useSelection.js
diff --git a/src/web/hooks/__tests__/useSelection.jsx b/src/web/hooks/__tests__/useSelection.jsx
new file mode 100644
index 0000000000..6996fcd058
--- /dev/null
+++ b/src/web/hooks/__tests__/useSelection.jsx
@@ -0,0 +1,78 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+/* eslint-disable react/prop-types */
+
+import {describe, test, expect} from '@gsa/testing';
+
+import {fireEvent, render, screen} from 'web/utils/testing';
+import SelectionType from 'web/utils/selectiontype';
+
+import useSelection from '../useSelection';
+
+const TestComponent = () => {
+ const {selected, selectionType, select, deselect, changeSelectionType} =
+ useSelection(SelectionType.SELECTION_USER);
+ return (
+ <>
+ {selectionType}
+
+
+ select(1)} data-testid="select1" />
+ select(2)} data-testid="select2" />
+ deselect(1)} data-testid="deselect1" />
+
+ changeSelectionType(SelectionType.SELECTION_PAGE_CONTENTS)
+ }
+ data-testid="selectPageContent"
+ />
+ >
+ );
+};
+
+describe('useSelection', () => {
+ test('should select and deselect entities', () => {
+ render( );
+
+ fireEvent.click(screen.getByTestId('select1'));
+ fireEvent.click(screen.getByTestId('select2'));
+
+ expect(screen.getByTestId('checked1')).toBeChecked();
+ expect(screen.getByTestId('checked2')).toBeChecked();
+
+ fireEvent.click(screen.getByTestId('deselect1'));
+
+ expect(screen.getByTestId('checked1')).not.toBeChecked();
+ });
+
+ test('should change selection type', () => {
+ render( );
+
+ fireEvent.click(screen.getByTestId('select1'));
+ fireEvent.click(screen.getByTestId('select2'));
+
+ expect(screen.getByTestId('checked1')).toBeChecked();
+ expect(screen.getByTestId('checked2')).toBeChecked();
+
+ fireEvent.click(screen.getByTestId('selectPageContent'));
+
+ expect(screen.getByTestId('checked1')).not.toBeChecked();
+ expect(screen.getByTestId('checked2')).not.toBeChecked();
+ expect(screen.getByTestId('selectionType')).toHaveTextContent(
+ SelectionType.SELECTION_PAGE_CONTENTS,
+ );
+ });
+});
diff --git a/src/web/hooks/useSelection.js b/src/web/hooks/useSelection.js
new file mode 100644
index 0000000000..346b9b9c8b
--- /dev/null
+++ b/src/web/hooks/useSelection.js
@@ -0,0 +1,58 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {useState, useCallback} from 'react';
+
+import {isDefined} from 'gmp/utils/identity';
+
+import SelectionType from 'web/utils/selectiontype';
+
+/**
+ * Hook to manage selection of entities
+ *
+ * @param {int} initialSelectionType The initial selection type to be used.
+ * Default is SelectionType.SELECTION_PAGE_CONTENTS
+ * @returns {Object} selected, selectionType, select, deselect, changeSelectionType
+ */
+const useSelection = (
+ initialSelectionType = SelectionType.SELECTION_PAGE_CONTENTS,
+) => {
+ const [selected, setSelected] = useState(
+ initialSelectionType === SelectionType.SELECTION_USER ? [] : undefined,
+ );
+ const [selectionType, setSelectionType] = useState(initialSelectionType);
+
+ const select = useCallback(obj => {
+ // ensure the using component gets re-rendered by creating new array
+ setSelected(prevSelected =>
+ isDefined(prevSelected) && !prevSelected.includes(obj)
+ ? [...prevSelected, obj]
+ : undefined,
+ );
+ }, []);
+
+ const deselect = useCallback(obj => {
+ // ensure the using component gets re-rendered by creating new array
+ setSelected(prevSelected => {
+ if (isDefined(prevSelected) && prevSelected.includes(obj)) {
+ return prevSelected.filter(o => o !== obj);
+ }
+ return undefined;
+ });
+ }, []);
+
+ const changeSelectionType = useCallback(newSelectionType => {
+ if (newSelectionType === SelectionType.SELECTION_USER) {
+ setSelected([]);
+ } else {
+ setSelected();
+ }
+
+ setSelectionType(newSelectionType);
+ }, []);
+ return {selected, selectionType, select, deselect, changeSelectionType};
+};
+
+export default useSelection;
From 9ddb2d6556eac98896800b61d35199c0a5bad3fc Mon Sep 17 00:00:00 2001
From: daniele-mng
Date: Wed, 12 Jun 2024 17:00:28 +0200
Subject: [PATCH 029/130] Add: eslint rule camelCase
---
.eslintrc.cjs | 1 +
1 file changed, 1 insertion(+)
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
index e1fb300d68..9aaf334298 100644
--- a/.eslintrc.cjs
+++ b/.eslintrc.cjs
@@ -31,6 +31,7 @@ module.exports = {
'warn',
{ignore: ['children', 'className', 'location']},
],
+ camelcase: ['warn', {properties: 'always'}],
'no-case-declarations': 'off',
'no-unused-vars': [
'warn',
From 12f9e5c9f30528bf8cb5547e2fb81b2c7fecf1d5 Mon Sep 17 00:00:00 2001
From: daniele-mng
Date: Fri, 14 Jun 2024 08:31:34 +0200
Subject: [PATCH 030/130] create exeptions
---
.eslintrc.cjs | 10 +-
allowedSnakeCase.cjs | 688 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 697 insertions(+), 1 deletion(-)
create mode 100644 allowedSnakeCase.cjs
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
index 9aaf334298..3c4373bc58 100644
--- a/.eslintrc.cjs
+++ b/.eslintrc.cjs
@@ -1,3 +1,5 @@
+const allowedSnakeCase = require('./allowedSnakeCase.cjs');
+
module.exports = {
ignorePatterns: ['build', '.eslintrc.cjs'],
extends: [
@@ -31,7 +33,13 @@ module.exports = {
'warn',
{ignore: ['children', 'className', 'location']},
],
- camelcase: ['warn', {properties: 'always'}],
+ camelcase: [
+ 'warn',
+ {
+ allow: allowedSnakeCase,
+ properties: 'always',
+ },
+ ],
'no-case-declarations': 'off',
'no-unused-vars': [
'warn',
diff --git a/allowedSnakeCase.cjs b/allowedSnakeCase.cjs
new file mode 100644
index 0000000000..2ba2448ee2
--- /dev/null
+++ b/allowedSnakeCase.cjs
@@ -0,0 +1,688 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+module.exports = [
+ 'access_hosts',
+ 'action_result',
+ 'actions_column',
+ 'activation_time',
+ 'active_filter',
+ 'active_notes',
+ 'active_overrides',
+ 'add_tag',
+ 'aggregate_mode',
+ 'aggregate_type',
+ 'alert_email',
+ 'alert_id',
+ 'alert_ids',
+ 'alert_items',
+ 'alert_list',
+ 'alerts_data',
+ 'alive_tests',
+ 'allow_insecure',
+ 'allow_simultaneous_ips',
+ 'apply_overrides',
+ 'apps_array',
+ 'apps_temp',
+ '_asset_id',
+ 'asset_id',
+ 'assigned_to',
+ 'auth_algorithm',
+ 'auth_conf_setting',
+ 'auth_method',
+ 'auth_settings',
+ 'auto_cache_rebuild',
+ 'auto_delete',
+ 'auto_delete_data',
+ 'auto_start',
+ 'av_duration',
+ 'average_duration',
+ 'average_severity',
+ 'average_severity_score',
+ 'backend_operation',
+ 'base_metrics',
+ 'best_os_cpe',
+ 'best_os_txt',
+ 'bulk_select',
+ 'cancel_token',
+ 'can_create_target',
+ 'cap_names',
+ 'ca_pub',
+ 'ca_pub_info',
+ 'c_count',
+ 'cert_bund_adv',
+ 'certificate_info',
+ 'cert_ref',
+ 'certs_array',
+ 'certs_per_port',
+ 'cert_type',
+ 'change_community',
+ 'change_passphrase',
+ 'change_password',
+ 'change_privacy_password',
+ 'change_task',
+ 'client_address',
+ 'closed_cves',
+ 'closed_note',
+ 'closed_time',
+ 'collection_count_parse_func',
+ 'compliance_count',
+ 'component_name',
+ 'condition_data_at_least_count',
+ 'condition_data_at_least_filter_id',
+ 'condition_data_count',
+ 'condition_data_direction',
+ 'condition_data_fields',
+ 'condition_data_filter_id',
+ 'condition_data_filters',
+ 'condition_data_filt_id',
+ 'condition_data_severity',
+ 'config_id',
+ 'config_list',
+ 'config_resp',
+ 'config_resp_all',
+ 'configs_data',
+ 'configurable_formats',
+ 'contents_table',
+ 'content_type',
+ 'convert_allow',
+ 'convert_auth_method',
+ 'convert_data',
+ 'convert_func',
+ 'cpe_host_details',
+ 'created_port_ranges',
+ 'created_port_ranges_copy',
+ 'create_func',
+ 'create_pem_certificate',
+ 'create_values',
+ 'creation_time',
+ 'credential_id',
+ 'credential_list',
+ 'credential_login',
+ 'credentials_data',
+ 'credentials_title',
+ 'credential_type',
+ 'csv_blob',
+ 'csv_data',
+ 'currently_syncing',
+ 'current_report',
+ 'customer_name',
+ 'custom_severity',
+ 'cve_id',
+ 'cve_refs',
+ 'cves_array',
+ 'cvss_base',
+ 'cvss_v2_entries',
+ 'cvss_v3_entries',
+ 'cvss_vector',
+ 'data_all',
+ 'default_item',
+ 'default_item_label',
+ 'default_item_value',
+ 'default_labels',
+ 'default_severity',
+ 'default_timeout',
+ 'default_values',
+ 'deleted_port_ranges',
+ 'deleted_port_ranges_copy',
+ 'delete_func',
+ 'delta_report',
+ 'delta_report_id',
+ 'delta_states',
+ 'delta_type',
+ '_deprecated_by',
+ 'describe_auth_response',
+ 'details_count_for_cpe',
+ 'details_fname',
+ 'detection_details',
+ 'dfn_cert_adv',
+ 'download_title',
+ 'dynamic_severity',
+ 'edit_alert',
+ 'email_credential_filter',
+ 'empty_default',
+ 'end_time',
+ 'entities_filter_func',
+ 'entities_parse_func',
+ 'entity_v2',
+ 'entity_v3',
+ 'errors_array',
+ 'esxi_cred',
+ 'esxi_credential',
+ 'esxi_credential_filter',
+ 'esxi_credential_id',
+ 'event_data',
+ 'event_data_feed_event',
+ 'event_data_fields',
+ 'event_data_modify_task_fields',
+ 'event_data_quick_first_scan_fields',
+ 'event_data_quick_task_fields',
+ 'event_data_secinfo_type',
+ 'event_data_status',
+ 'event_type',
+ 'exclude_array',
+ 'exclude_file',
+ 'exclude_hosts',
+ 'exclude_props',
+ 'executable_version',
+ 'executable_version_unreliable',
+ 'expiration_time',
+ 'false_positive',
+ 'family_count',
+ 'family_list',
+ 'feed_event',
+ 'feed_type',
+ 'field_value',
+ 'filtered_count',
+ 'filter_func',
+ 'filter_id',
+ 'filter_identifiers',
+ 'filter_list',
+ 'filter_parse_func',
+ 'filter_results_filter',
+ 'filters_data',
+ 'filter_secinfo_filter',
+ 'filter_string',
+ 'filter_type',
+ 'filter_types',
+ 'f_impact',
+ 'find_item',
+ 'find_label',
+ 'first_time',
+ 'fixed_note',
+ 'fixed_time',
+ 'fix_verified_report',
+ 'fix_verified_time',
+ 'foo_id',
+ 'format_items',
+ 'formdata_append',
+ 'from_address',
+ 'from_file',
+ 'full_count',
+ 'full_type',
+ 'general_note',
+ 'general_permissions',
+ 'get_aggregate',
+ 'get_aggregates_response',
+ 'get_config_family_response',
+ 'get_config_nvt_response',
+ 'get_feeds',
+ 'get_feeds_response',
+ 'get_identifier',
+ 'get_img_url',
+ 'get_info',
+ 'get_info_response',
+ 'get_license',
+ 'get_license_response',
+ 'get_nvt_families',
+ 'get_nvt_families_response',
+ 'get_nvts_response',
+ 'get_resource_names',
+ 'get_resource_names_response',
+ 'get_scanner',
+ 'get_settings',
+ 'get_settings_response',
+ 'get_value',
+ 'goto_details',
+ 'goto_host',
+ 'goto_list',
+ 'grant_full',
+ 'group_column',
+ 'group_id',
+ 'group_ids',
+ 'group_list',
+ 'groups_data',
+ 'gsad_response',
+ 'has_av_duration',
+ '_has_caps',
+ 'has_detection',
+ 'has_duration',
+ 'has_reference',
+ 'has_selected',
+ 'has_severity_filter',
+ 'header_title',
+ 'highest_severity',
+ 'high_per_host',
+ 'host_allow',
+ 'host_cves',
+ 'hostnames_by_ip',
+ 'hosts_allow',
+ 'hosts_array',
+ 'hosts_count',
+ 'hosts_filter',
+ 'hosts_manual',
+ 'hosts_ordering',
+ 'hr_name',
+ 'i18n_1',
+ 'id_field',
+ 'id_lists',
+ 'id_name',
+ 'id_or__',
+ 'id_or_empty',
+ 'ignore_pagination',
+ 'img_path',
+ 'import_func',
+ 'in_assets',
+ 'include_related',
+ 'includes_type',
+ 'info_elem',
+ 'info_filter',
+ 'info_id',
+ '_Info_Issuer',
+ 'info_type',
+ '_Info_URL',
+ 'inheritor_id',
+ 'in_use',
+ 'invisible_alerts',
+ 'invisible_report_configs',
+ 'is_edit',
+ 'is_ended',
+ 'is_radio',
+ 'issuer_dn',
+ 'is_task_event',
+ 'key_code',
+ 'known_nvt_count',
+ 'last_id',
+ 'last_report',
+ 'last_seen',
+ 'latest_severity',
+ 'ldaps_only',
+ 'list_fname',
+ 'load_formats',
+ 'lsc_password',
+ 'max_checks',
+ 'max_epss',
+ 'max_groups',
+ 'max_high',
+ 'max_hosts',
+ 'max_log',
+ 'max_low',
+ 'max_medium',
+ 'max_nvt_count',
+ 'max_severity',
+ 'may_edit_target',
+ 'may_op_configuration',
+ 'may_op_scans',
+ 'md5_fingerprint',
+ 'method_data_composer_ignore_pagination',
+ 'method_data_composer_include_notes',
+ 'method_data_composer_include_overrides',
+ 'method_data_defense_center_ip',
+ 'method_data_defense_center_port',
+ 'method_data_delta_report_id',
+ 'method_data_delta_type',
+ 'method_data_details_url',
+ 'method_data_fields',
+ 'method_data_from_address',
+ 'method_data_message',
+ 'method_data_message_attach',
+ 'method_data_notice',
+ 'method_data_notice_attach_config',
+ 'method_data_notice_attach_format',
+ 'method_data_notice_report_config',
+ 'method_data_notice_report_format',
+ 'method_data_pkcs12_credential',
+ 'method_data_recipient_credential',
+ 'method_data_scp_credential',
+ 'method_data_scp_host',
+ 'method_data_scp_known_hosts',
+ 'method_data_scp_path',
+ 'method_data_scp_port',
+ 'method_data_scp_report_config',
+ 'method_data_scp_report_format',
+ 'method_data_send_host',
+ 'method_data_send_port',
+ 'method_data_send_report_config',
+ 'method_data_send_report_format',
+ 'method_data_smb_credential',
+ 'method_data_smb_file_path',
+ 'method_data_smb_file_path_type',
+ 'method_data_smb_max_protocol',
+ 'method_data_smb_report_config',
+ 'method_data_smb_report_format',
+ 'method_data_smb_share_path',
+ 'method_data_snmp_agent',
+ 'method_data_snmp_community',
+ 'method_data_snmp_message',
+ 'method_data_start_task_task',
+ 'method_data_status',
+ 'method_data_subject',
+ 'method_data_submethod',
+ 'method_data_to_address',
+ 'method_data_tp_sms_credential',
+ 'method_data_tp_sms_hostname',
+ 'method_data_tp_sms_tls_workaround',
+ 'method_data_URL',
+ 'method_data_verinice_server_credential',
+ 'method_data_verinice_server_report_config',
+ 'method_data_verinice_server_report_format',
+ 'method_data_verinice_server_url',
+ 'method_data_vfire_base_url',
+ 'method_data_vfire_call_description',
+ 'method_data_vfire_call_impact_name',
+ 'method_data_vfire_call_partition_name',
+ 'method_data_vfire_call_template_name',
+ 'method_data_vfire_call_type_name',
+ 'method_data_vfire_call_urgency_name',
+ 'method_data_vfire_client_id',
+ 'method_data_vfire_credential',
+ 'method_data_vfire_session_type',
+ 'min_high',
+ 'min_low',
+ 'min_medium',
+ 'min_qod',
+ 'model_type',
+ 'modification_time',
+ 'modify_password',
+ 'native_name',
+ 'new_alert',
+ 'new_family',
+ 'new_port_ranges',
+ 'new_severity',
+ 'new_severity_from_list',
+ 'new_threat',
+ 'new_title',
+ 'next_time',
+ 'no_filter_history',
+ 'noop_convert',
+ 'no_redirect',
+ 'note_list',
+ 'notes_data',
+ 'nvd_id',
+ 'nvt_count',
+ 'nvt_name',
+ 'nvt_preferences',
+ 'obj_url',
+ 'old_login',
+ 'old_name',
+ 'old_password',
+ 'open_dialog',
+ 'open_note',
+ 'open_time',
+ 'openvas_config_id',
+ 'openvas_scan_config_items',
+ 'operating_systems',
+ 'optional_resource_type',
+ 'orig_filter',
+ 'original_severity',
+ 'origin_id',
+ 'origin_type',
+ 'os_array',
+ 'os_count',
+ 'os_cpe',
+ 'os_icon',
+ 'os_txt',
+ 'override_list',
+ 'overrides_data',
+ 'package_format',
+ 'package_unreliable',
+ 'param_item',
+ 'param_name',
+ 'params_using_default',
+ 'param_types',
+ 'parse_collection_counts',
+ 'parse_count',
+ 'parse_counts',
+ 'parse_errors',
+ 'parse_page_count',
+ 'parse_report_report_counts',
+ 'parse_scanner_info',
+ 'password_only_credential_filter',
+ 'period_months',
+ 'permission_group_id',
+ 'permission_list',
+ 'permission_role_id',
+ 'permissions_data',
+ 'permission_type',
+ 'permission_user_id',
+ 'perm_names',
+ 'pkcs12_credential_id',
+ 'plural_name',
+ 'policy_resp',
+ 'policy_resp_all',
+ 'port_count',
+ 'port_list',
+ 'port_list_id',
+ 'port_list_list',
+ 'port_lists',
+ 'port_lists_data',
+ 'port_lists_title',
+ 'port_manual',
+ 'port_range',
+ 'port_range_end',
+ 'port_range_id',
+ 'port_ranges',
+ 'port_range_start',
+ 'ports_array',
+ 'port_type',
+ 'pref_count',
+ 'preference_count',
+ 'privacy_algorithm',
+ 'privacy_password',
+ 'private_key',
+ 'prop_name',
+ 'props_value',
+ 'protocol_type',
+ 'public_key',
+ 'public_url_loader',
+ 'raw_data',
+ 'raw_exploit',
+ 'raw_impact',
+ 'ready_1',
+ 'recipient_credential_id',
+ '_reference_type',
+ 'reference_type',
+ 'Ref_Num',
+ 'remote_active',
+ 'remote_analysis',
+ 'remote_app',
+ 'remote_banner',
+ 'remote_banner_unreliable',
+ 'remote_probe',
+ 'remote_vul',
+ 'render_alerts',
+ 'render_credentials',
+ 'render_filter',
+ 'render_filters',
+ 'render_groups',
+ 'render_notes',
+ 'render_overrides',
+ 'render_permissions',
+ 'render_port_lists',
+ 'render_report_configs',
+ 'render_report_formats',
+ 'render_roles',
+ 'render_scanners',
+ 'render_schedules',
+ 'render_severity',
+ 'render_tags',
+ 'render_targets',
+ 'render_tickets',
+ 'report_config',
+ 'report_config_id',
+ 'report_config_ids',
+ 'report_config_list',
+ 'report_configs',
+ 'report_configs_data',
+ 'report_config_values',
+ 'report_count',
+ 'report_fname',
+ 'report_format',
+ 'report_format_id',
+ 'report_format_ids',
+ 'report_format_list',
+ 'report_formats',
+ 'report_formats_data',
+ 'report_id',
+ 'report_type',
+ 'resource_id',
+ 'resource_ids',
+ 'resources_action',
+ 'resource_type',
+ 'resource_types',
+ 'response_alerts',
+ 'response_all',
+ 'response_configs',
+ 'response_credentials',
+ 'response_filters',
+ 'response_groups',
+ 'response_notes',
+ 'response_overrides',
+ 'response_permissions',
+ 'response_port_lists',
+ 'response_report_configs',
+ 'response_report_formats',
+ 'response_roles',
+ 'response_scanners',
+ 'response_schedules',
+ 'response_tags',
+ 'response_targets',
+ 'response_tasks',
+ 'response_tickets',
+ 'result_count',
+ 'result_counts',
+ 'result_filter_id',
+ 'result_filters',
+ 'result_hosts_only',
+ 'result_id',
+ 'result_name',
+ 'result_severity',
+ 'results_with_cve',
+ 'result_uuid',
+ 'reverse_lookup_only',
+ 'reverse_lookup_unify',
+ 'role_id',
+ 'role_ids',
+ 'role_list',
+ 'roles_data',
+ '_same_source',
+ 'same_source',
+ 'scan_configs',
+ 'scan_end',
+ 'scanner_credentials',
+ 'scanner_host',
+ 'scanner_id',
+ 'scanner_list',
+ 'scanner_name',
+ 'scanner_preferences',
+ 'scanners_data',
+ 'scanner_type',
+ 'scan_nvt_version',
+ 'scan_run_status',
+ 'scan_start',
+ 'schedule_id',
+ 'schedule_items',
+ 'schedule_list',
+ 'schedule_periods',
+ 'schedules_data',
+ 'schedules_only',
+ 'scp_credential',
+ 'scp_credential_id',
+ 'secinfo_filters',
+ 'secinfo_type',
+ 'section_title',
+ 'select_verinice_report_id',
+ 'setting_id',
+ 'setting_value',
+ 'set_url_loader',
+ 'severity_class',
+ 'severity_from_list_items',
+ 'severity_levels',
+ 'sha256_fingerprint',
+ 'simple_duration',
+ 'simple_period',
+ 'slave_id',
+ 'smb_cred',
+ 'smb_credential',
+ 'smb_credential_filter',
+ 'smb_credential_id',
+ 'snmp_agent',
+ 'snmp_cred',
+ 'snmp_credential',
+ 'snmp_credential_filter',
+ 'snmp_credential_id',
+ 'snmp_credentials',
+ 'solution_type',
+ 'source_type',
+ 'ssh_cred',
+ 'ssh_credential',
+ 'ssh_credential_filter',
+ 'ssh_credential_id',
+ 'ssh_credentials',
+ 'ssh_elevate_credential',
+ 'ssh_elevate_credential_id',
+ 'ssh_port',
+ 'ssl_certs',
+ 'start_date',
+ 'start_hour',
+ 'start_minute',
+ 'start_time',
+ 'start_timezone',
+ 'subgroup_column',
+ 'subject_dn',
+ 'subject_type',
+ 'svg_blob',
+ 'svg_data',
+ 'sys_reports',
+ 'sys_response',
+ 'table_props',
+ 'tag_id',
+ 'tag_items',
+ 'tag_list',
+ 'tag_name',
+ 'tags_data',
+ 'tag_value',
+ 'target_elevate',
+ 'target_exclude_source',
+ 'target_hosts',
+ 'target_id',
+ 'target_items',
+ 'target_list',
+ 'target_no_elevate',
+ 'target_no_portlist',
+ 'targets_data',
+ 'target_source',
+ 'target_title',
+ 'task_id',
+ 'task_list',
+ 'task_name',
+ 'tasks_data',
+ 'task_uuid',
+ 'temp_ports',
+ 'text_excerpt',
+ 'ticket_id',
+ 'ticket_list',
+ 'tickets_data',
+ 'ticket_status',
+ 'time_status',
+ 'timezone_abbrev',
+ 'tls_cert',
+ 'tls_certificate',
+ 'tls_certificate_id',
+ 'tls_certificates',
+ 'to_address',
+ 'tp_sms_credential_id',
+ 'up_credentials',
+ 'update_time',
+ 'url_loader',
+ 'usage_type',
+ 'use_default_check',
+ 'use_openvas_scan_config',
+ 'user_id',
+ 'user_tags',
+ '_using_default',
+ 'value_func',
+ 'value_labels',
+ 'value_using_default',
+ 'vendor_version',
+ 'verinice_credential_id',
+ 'verinice_server_credential',
+ 'vFire_credential_filter',
+ 'vfire_credential_id',
+ 'which_cert',
+ 'xml_file',
+ 'yes_no_props',
+ 'zh_TW',
+];
From 72130411fb169a4df165253f79cc64c920b996e9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?=
Date: Thu, 13 Jun 2024 15:55:53 +0200
Subject: [PATCH 031/130] Add: Add new hook to determine the loading interval
for entities pages
Add a useEntitiesReloadInterval hook to replace in conjunction with the
useReload hook the Reload component. useEntitiesReloadInterval
calculates the timeout for the next reload and useReload actually calls
a function after this timeout to allow reloading data.
---
.../__tests__/useEntitiesReloadInterval.jsx | 98 +++++++++++++++++++
src/web/entities/useEntitiesReloadInterval.js | 52 ++++++++++
2 files changed, 150 insertions(+)
create mode 100644 src/web/entities/__tests__/useEntitiesReloadInterval.jsx
create mode 100644 src/web/entities/useEntitiesReloadInterval.js
diff --git a/src/web/entities/__tests__/useEntitiesReloadInterval.jsx b/src/web/entities/__tests__/useEntitiesReloadInterval.jsx
new file mode 100644
index 0000000000..63f02af807
--- /dev/null
+++ b/src/web/entities/__tests__/useEntitiesReloadInterval.jsx
@@ -0,0 +1,98 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+/* eslint-disable react/prop-types */
+
+import {describe, test, expect} from '@gsa/testing';
+
+import {screen, rendererWith} from 'web/utils/testing';
+
+import useEntitiesReloadInterval from '../useEntitiesReloadInterval';
+
+const TestComponent = ({entities, useActive, isVisible = true}) => {
+ const timeoutFunc = useEntitiesReloadInterval(entities, {useActive});
+ return {timeoutFunc({isVisible})} ;
+};
+
+describe('useEntitiesReloadInterval', () => {
+ test('should return the reload interval', () => {
+ const entities = [{isActive: () => true}];
+ const gmp = {settings: {reloadInterval: 60000}};
+ const {render} = rendererWith({gmp});
+
+ render( );
+
+ expect(screen.getByTestId('timeout')).toHaveTextContent('60000');
+ });
+
+ test('should return the active reload interval', () => {
+ const entities = [{isActive: () => true}];
+ const gmp = {
+ settings: {reloadInterval: 60000, reloadIntervalActive: 30000},
+ };
+ const {render} = rendererWith({gmp});
+
+ render( );
+
+ expect(screen.getByTestId('timeout')).toHaveTextContent('30000');
+ });
+
+ test('should return the reload interval when all entities are inactive', () => {
+ const entities = [{isActive: () => false}];
+ const gmp = {
+ settings: {reloadInterval: 60000, reloadIntervalActive: 30000},
+ };
+ const {render} = rendererWith({gmp});
+
+ render( );
+
+ expect(screen.getByTestId('timeout')).toHaveTextContent('60000');
+ });
+
+ test('should return the active reload interval if at least one entity is active', () => {
+ const entities = [{isActive: () => false}, {isActive: () => true}];
+ const gmp = {
+ settings: {reloadInterval: 60000, reloadIntervalActive: 30000},
+ };
+ const {render} = rendererWith({gmp});
+
+ render( );
+
+ expect(screen.getByTestId('timeout')).toHaveTextContent('30000');
+ });
+
+ test('should return the reload interval if not entity is available', () => {
+ const entities = [];
+ const gmp = {
+ settings: {
+ reloadInterval: 60000,
+ reloadIntervalActive: 30000,
+ },
+ };
+ const {render} = rendererWith({gmp});
+
+ render( );
+
+ expect(screen.getByTestId('timeout')).toHaveTextContent('60000');
+ });
+
+ test('should return the inactive reload interval if not visible', () => {
+ const entities = [{isActive: () => false}, {isActive: () => true}];
+ const gmp = {
+ settings: {
+ reloadInterval: 60000,
+ reloadIntervalActive: 30000,
+ reloadIntervalInactive: 40000,
+ },
+ };
+ const {render} = rendererWith({gmp});
+
+ render(
+ ,
+ );
+
+ expect(screen.getByTestId('timeout')).toHaveTextContent('40000');
+ });
+});
diff --git a/src/web/entities/useEntitiesReloadInterval.js b/src/web/entities/useEntitiesReloadInterval.js
new file mode 100644
index 0000000000..d834d536d3
--- /dev/null
+++ b/src/web/entities/useEntitiesReloadInterval.js
@@ -0,0 +1,52 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {useCallback} from 'react';
+
+import {isDefined} from 'gmp/utils/identity';
+
+import useGmp from 'web/utils/useGmp';
+
+/**
+ * Hook to get the reload interval for entities
+ *
+ * Can be best used in conjunction with useReload
+ *
+ * @example
+ * const entities = [entity1, entity2];
+ * const timeoutFunc = useEntitiesReloadInterval(entities);
+ * const [startTimer, clearTimer, isRunning] = useReload(reloadFunc, timeoutFunc);
+ *
+ * @param {Array} entities Optional array of entities to consider
+ * @param {Object} options Set useActive to true to consider the active state
+ * of the entities for the reload interval. If at least one entity is active
+ * the reload interval will be the active interval (shorter). If no entity is
+ * active the normal interval will be used. Default is false.
+ * @returns Function A timeout function that calculates the reload interval
+ */
+const useEntitiesReloadInterval = (entities, {useActive = false} = {}) => {
+ const gmp = useGmp();
+ const gmpSettings = gmp.settings;
+ const timeoutFunc = useCallback(
+ ({isVisible}) => {
+ if (!isVisible) {
+ return gmpSettings.reloadIntervalInactive;
+ }
+ if (
+ useActive &&
+ isDefined(entities) &&
+ entities.some(entity => entity.isActive())
+ ) {
+ return gmpSettings.reloadIntervalActive;
+ }
+ return gmpSettings.reloadInterval;
+ },
+ [entities, gmpSettings, useActive],
+ );
+
+ return timeoutFunc;
+};
+
+export default useEntitiesReloadInterval;
From c125bc9965fe9829b9292e15c8426fbb513a7c39 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?=
Date: Mon, 17 Jun 2024 13:32:41 +0200
Subject: [PATCH 032/130] Add: Add a BulkTags component for handling tagging of
entities
The BulkTags component provides dialogs and functions for tagging several
entities with an existing or new tag.
---
src/web/entities/BulkTags.jsx | 236 ++++++++++++++++++++++++
src/web/entities/__tests__/BulkTags.jsx | 192 +++++++++++++++++++
2 files changed, 428 insertions(+)
create mode 100644 src/web/entities/BulkTags.jsx
create mode 100644 src/web/entities/__tests__/BulkTags.jsx
diff --git a/src/web/entities/BulkTags.jsx b/src/web/entities/BulkTags.jsx
new file mode 100644
index 0000000000..42e406d7da
--- /dev/null
+++ b/src/web/entities/BulkTags.jsx
@@ -0,0 +1,236 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import React, {useCallback, useEffect, useState} from 'react';
+
+import _ from 'gmp/locale';
+import {YES_VALUE} from 'gmp/parser';
+import {isDefined} from 'gmp/utils/identity';
+import {apiType, getEntityType, typeName} from 'gmp/utils/entitytype';
+
+import PropTypes from 'web/utils/proptypes';
+import SelectionType from 'web/utils/selectiontype';
+
+import useGmp from 'web/utils/useGmp';
+import useUserSessionTimeout from 'web/utils/useUserSessionTimeout';
+
+import TagDialog from 'web/pages/tags/dialog';
+
+import TagsDialog from './tagsdialog';
+
+const getEntityIds = (entityArray = []) => entityArray.map(entity => entity.id);
+
+const getMultiTagEntitiesCount = (
+ pageEntities,
+ counts,
+ selectedEntities,
+ selectionType,
+) => {
+ if (selectionType === SelectionType.SELECTION_USER) {
+ // support set and array
+ return isDefined(selectedEntities?.size)
+ ? selectedEntities.size
+ : selectedEntities.length;
+ }
+
+ if (selectionType === SelectionType.SELECTION_PAGE_CONTENTS) {
+ return pageEntities.length;
+ }
+
+ return counts.filtered;
+};
+
+const BulkTags = ({
+ entities,
+ selectedEntities,
+ filter,
+ selectionType,
+ entitiesCounts,
+ onClose,
+}) => {
+ const gmp = useGmp();
+ const [, renewSession] = useUserSessionTimeout();
+ const [tag, setTag] = useState({});
+ const [tagDialogVisible, setTagDialogVisible] = useState(false);
+ const [tags, setTags] = useState([]);
+ const [error, setError] = useState();
+
+ const entitiesType = getEntityType(entities[0]);
+ // if there are no entities, BulkTagComponent is not rendered.
+
+ const getTagsByType = useCallback(() => {
+ const tagFilter = `resource_type=${apiType(entitiesType)}`;
+
+ return gmp.tags
+ .getAll({filter: tagFilter})
+ .then(resp => {
+ setTags(resp.data);
+ })
+ .catch(setError);
+ }, [gmp.tags, entitiesType]);
+
+ useEffect(() => {
+ getTagsByType();
+ }, [getTagsByType]);
+
+ const multiTagEntitiesCount = getMultiTagEntitiesCount(
+ entities,
+ entitiesCounts,
+ selectedEntities,
+ selectionType,
+ );
+
+ const closeTagDialog = useCallback(() => {
+ setTagDialogVisible(false);
+ }, []);
+
+ const openTagDialog = useCallback(() => {
+ renewSession();
+ setTagDialogVisible(true);
+ }, [renewSession]);
+
+ const handleCreateTag = useCallback(
+ data => {
+ renewSession();
+
+ return gmp.tag
+ .create(data)
+ .then(response => gmp.tag.get(response.data))
+ .then(response => {
+ const newTags = [...tags, response.data];
+ setTags(newTags);
+ setTag(response.data);
+ })
+ .then(closeTagDialog)
+ .catch(setError);
+ },
+ [closeTagDialog, gmp.tag, renewSession, tags],
+ );
+
+ const handleCloseTagDialog = useCallback(() => {
+ closeTagDialog();
+ renewSession();
+ }, [closeTagDialog, renewSession]);
+
+ const handleTagChange = useCallback(
+ id => {
+ renewSession();
+ return gmp.tag
+ .get({id})
+ .then(resp => {
+ setTag(resp.data);
+ })
+ .catch(setError);
+ },
+ [renewSession, gmp.tag],
+ );
+
+ const handleCloseTagsDialog = useCallback(() => {
+ onClose();
+ }, [onClose]);
+
+ const handleErrorClose = useCallback(() => {
+ setError();
+ }, []);
+
+ const handleAddMultiTag = useCallback(
+ ({comment, id, name, value = ''}) => {
+ let tagEntitiesIds;
+ let loadedFilter;
+
+ if (selectionType === SelectionType.SELECTION_USER) {
+ tagEntitiesIds = getEntityIds(selectedEntities);
+ loadedFilter = null;
+ } else if (selectionType === SelectionType.SELECTION_PAGE_CONTENTS) {
+ tagEntitiesIds = getEntityIds(entities);
+ loadedFilter = null;
+ } else {
+ loadedFilter = filter.all().toFilterString();
+ tagEntitiesIds = null;
+ }
+
+ return gmp.tag
+ .save({
+ active: YES_VALUE,
+ comment,
+ filter: loadedFilter,
+ id,
+ name,
+ resource_ids: tagEntitiesIds,
+ resource_type: entitiesType,
+ resources_action: 'add',
+ value,
+ })
+ .then(onClose)
+ .catch(setError);
+ },
+ [
+ entities,
+ entitiesType,
+ filter,
+ gmp.tag,
+ onClose,
+ selectedEntities,
+ selectionType,
+ ],
+ );
+
+ const resourceTypes = [[entitiesType, typeName(entitiesType)]];
+
+ let title;
+ if (selectionType === SelectionType.SELECTION_USER) {
+ title = _('Add Tag to Selection');
+ } else if (selectionType === SelectionType.SELECTION_PAGE_CONTENTS) {
+ title = _('Add Tag to Page Contents');
+ } else {
+ title = _('Add Tag to All Filtered');
+ }
+
+ return (
+ <>
+
+ {tagDialogVisible && (
+
+ )}
+ >
+ );
+};
+
+BulkTags.propTypes = {
+ entities: PropTypes.arrayOf(PropTypes.model).isRequired,
+ entitiesCounts: PropTypes.counts.isRequired,
+ filter: PropTypes.filter.isRequired,
+ selectedEntities: PropTypes.arrayOf(PropTypes.model).isRequired,
+ selectionType: PropTypes.oneOf([
+ SelectionType.SELECTION_PAGE_CONTENTS,
+ SelectionType.SELECTION_USER,
+ SelectionType.SELECTION_FILTER,
+ ]).isRequired,
+ onClose: PropTypes.func.isRequired,
+};
+
+export default BulkTags;
diff --git a/src/web/entities/__tests__/BulkTags.jsx b/src/web/entities/__tests__/BulkTags.jsx
new file mode 100644
index 0000000000..4aec9f2ddd
--- /dev/null
+++ b/src/web/entities/__tests__/BulkTags.jsx
@@ -0,0 +1,192 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {describe, test, expect, testing} from '@gsa/testing';
+
+import {
+ screen,
+ rendererWith,
+ getByTestId,
+ fireEvent,
+ getAllByTitle,
+ wait,
+} from 'web/utils/testing';
+
+import {setSessionTimeout} from 'web/store/usersettings/actions';
+
+import {isDefined} from 'gmp/utils/identity';
+
+import date from 'gmp/models/date';
+import Filter from 'gmp/models/filter';
+import Tag from 'gmp/models/tag';
+import Task from 'gmp/models/task';
+
+import SelectionType from 'web/utils/selectiontype';
+
+import BulkTags from '../BulkTags';
+
+const getDialog = () => {
+ return screen.getByRole('dialog');
+};
+
+const getDialogTitle = dialog => {
+ dialog = isDefined(dialog) ? dialog : getDialog();
+ return getByTestId(dialog, 'dialog-title-bar');
+};
+
+const getDialogSaveButton = dialog => {
+ dialog = isDefined(dialog) ? dialog : getDialog();
+ return getByTestId(dialog, 'dialog-save-button');
+};
+
+describe('BulkTags', () => {
+ test('should render the BulkTags component', () => {
+ const entities = [Task.fromElement({id: 1}), Task.fromElement({id: 2})];
+ const entitiesCounts = {filtered: 2, all: 2};
+ const filter = Filter.fromString('');
+ const selectedEntities = [];
+ const onClose = testing.fn();
+ const getAllTags = testing
+ .fn()
+ .mockResolvedValue({data: [Tag.fromElement({id: 1})]});
+ const gmp = {tags: {getAll: getAllTags}};
+ const timeout = date('2019-10-10');
+
+ const {render, store} = rendererWith({gmp, store: true});
+
+ store.dispatch(setSessionTimeout(timeout));
+
+ render(
+ ,
+ );
+ const dialog = getDialog();
+ expect(dialog).toBeInTheDocument();
+ });
+
+ test('should allow to tag all filtered entities', () => {
+ const entities = [Task.fromElement({id: 1}), Task.fromElement({id: 2})];
+ const entitiesCounts = {filtered: 2, all: 2};
+ const filter = Filter.fromString('');
+ const selectedEntities = [];
+ const onClose = testing.fn();
+ const getAllTags = testing
+ .fn()
+ .mockResolvedValue({data: [Tag.fromElement({id: 1})]});
+ const gmp = {tags: {getAll: getAllTags}};
+ const timeout = date('2019-10-10');
+
+ const {render, store} = rendererWith({gmp, store: true});
+
+ store.dispatch(setSessionTimeout(timeout));
+
+ render(
+ ,
+ );
+ const title = getDialogTitle();
+ expect(title).toHaveTextContent('Add Tag to All Filtered');
+ });
+
+ test('should allow to tag tasks with a new tag', async () => {
+ const entities = [Task.fromElement({id: '1'}), Task.fromElement({id: '2'})];
+ const entitiesCounts = {filtered: 2, all: 2};
+ const filter = Filter.fromString('');
+ const selectedEntities = [];
+ const onClose = testing.fn();
+ const createTag = testing.fn().mockResolvedValue({data: {id: '2'}});
+ const getTag = testing
+ .fn()
+ .mockResolvedValue({data: Tag.fromElement({id: '2'})});
+ const getAllTags = testing
+ .fn()
+ .mockResolvedValue({data: [Tag.fromElement({id: '1'})]});
+ const getAllResourceNames = testing.fn().mockResolvedValue({data: []});
+ const saveTag = testing.fn().mockResolvedValue({data: {id: '2'}});
+ const gmp = {
+ tags: {getAll: getAllTags},
+ resourcenames: {getAll: getAllResourceNames},
+ tag: {
+ create: createTag,
+ get: getTag,
+ save: saveTag,
+ },
+ };
+ const timeout = date('2019-10-10');
+
+ const {render, store} = rendererWith({gmp, store: true});
+
+ store.dispatch(setSessionTimeout(timeout));
+
+ render(
+ ,
+ );
+
+ const dialog = getDialog();
+ const newTag = getAllByTitle(dialog, 'Create a new Tag')[0];
+
+ fireEvent.click(newTag);
+ expect(getAllResourceNames).toHaveBeenCalledWith({
+ resource_type: 'task',
+ });
+
+ const dialogs = screen.queryAllByRole('dialog');
+ expect(dialogs.length).toEqual(2);
+
+ const tagsDialog = dialog[0];
+ const tagDialog = dialogs[1];
+ const saveTagButton = getDialogSaveButton(tagDialog);
+
+ fireEvent.click(saveTagButton);
+
+ await wait();
+
+ expect(createTag).toHaveBeenCalledWith({
+ active: 1,
+ comment: '',
+ name: 'default:unnamed',
+ resource_ids: [],
+ resource_type: 'task',
+ resources: [],
+ value: '',
+ });
+ expect(getTag).toHaveBeenCalledWith({id: '2'});
+
+ const saveTagsButton = getDialogSaveButton(tagsDialog);
+
+ fireEvent.click(saveTagsButton);
+
+ expect(saveTag).toHaveBeenCalledWith({
+ active: 1,
+ comment: '',
+ filter: null,
+ id: '2',
+ name: undefined,
+ resource_ids: ['1', '2'],
+ resource_type: 'task',
+ resources_action: 'add',
+ value: '',
+ });
+ });
+});
From 5c7b19cf41d47e0b744c9bd63814002b139e6f48 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?=
Date: Mon, 17 Jun 2024 13:43:39 +0200
Subject: [PATCH 033/130] Fix: Don't pass gmp object to TagDialog onSave handle
The gmp object is not part of saving a tag. Therefore it shouldn't be
put into the state of the TagDialog and passed to the onSave handler.
---
src/web/pages/tags/dialog.jsx | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/web/pages/tags/dialog.jsx b/src/web/pages/tags/dialog.jsx
index 1606fad4be..7499f94073 100644
--- a/src/web/pages/tags/dialog.jsx
+++ b/src/web/pages/tags/dialog.jsx
@@ -193,6 +193,7 @@ class TagDialog extends React.Component {
resource_types = [],
title = _('New Tag'),
value = '',
+ gmp,
onClose,
onSave,
...options
From 0ed5685968186b8d02e88dbaf377773b599a2e22 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?=
Date: Mon, 17 Jun 2024 14:21:54 +0200
Subject: [PATCH 034/130] Change: Allow to show errors in the TagsDialog
Allow to show errors in the TagsDialog. This may be necessary for
example if a new tag can't be created.
---
src/web/entities/tagsdialog.jsx | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/web/entities/tagsdialog.jsx b/src/web/entities/tagsdialog.jsx
index e951eb0181..73a0cec0d6 100644
--- a/src/web/entities/tagsdialog.jsx
+++ b/src/web/entities/tagsdialog.jsx
@@ -32,18 +32,21 @@ const Notification = styled(Layout)`
const TagsDialog = ({
comment = '',
entitiesCount,
+ error,
tagId: id,
name,
tags,
title = _('Add Tag'),
value = '',
onClose,
+ onErrorClose,
onNewTagClick,
onTagChanged,
onSave,
}) => (
{() => (
@@ -97,6 +101,7 @@ const TagsDialog = ({
TagsDialog.propTypes = {
comment: PropTypes.string,
entitiesCount: PropTypes.number.isRequired,
+ error: PropTypes.string,
filter: PropTypes.filter,
name: PropTypes.string,
tagId: PropTypes.id,
@@ -104,6 +109,7 @@ TagsDialog.propTypes = {
title: PropTypes.string,
value: PropTypes.string,
onClose: PropTypes.func.isRequired,
+ onErrorClose: PropTypes.func,
onNewTagClick: PropTypes.func.isRequired,
onSave: PropTypes.func.isRequired,
onTagChanged: PropTypes.func.isRequired,
From 24871a00d771db170c2578dc7f1a38909134ed1a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?=
Date: Tue, 16 Apr 2024 11:32:03 +0200
Subject: [PATCH 035/130] Add: Add a useDownload hook
The useDownload hook in conjunction with the Download component should
replace the withDownload HOC in future.
---
src/web/components/form/useDownload.jsx | 37 +++++++++++++++++++++++++
1 file changed, 37 insertions(+)
create mode 100644 src/web/components/form/useDownload.jsx
diff --git a/src/web/components/form/useDownload.jsx b/src/web/components/form/useDownload.jsx
new file mode 100644
index 0000000000..160b586535
--- /dev/null
+++ b/src/web/components/form/useDownload.jsx
@@ -0,0 +1,37 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {useRef, useCallback} from 'react';
+
+import logger from 'gmp/log';
+
+import {hasValue} from 'gmp/utils/identity';
+
+const log = logger.getLogger('web.components.form.useDownload');
+
+/**
+ * Hook to download a file
+ *
+ * Should be used in combination with the Download component
+ *
+ * @returns Array of downloadRef and download function
+ */
+const useDownload = () => {
+ const downloadRef = useRef(null);
+
+ const download = useCallback(({filename, data, mimetype}) => {
+ if (!hasValue(downloadRef.current)) {
+ log.warn('Download ref not set.');
+ return;
+ }
+
+ downloadRef.current.setFilename(filename);
+ downloadRef.current.setData(data, mimetype);
+ downloadRef.current.download();
+ }, []);
+ return [downloadRef, download];
+};
+
+export default useDownload;
From 97fcfeba4e418a829a5742980fba3527b8f879d2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?=
Date: Mon, 17 Jun 2024 11:32:07 +0200
Subject: [PATCH 036/130] Add a simple test for useDownload hook
Combine Download with useDownload in a simple test.
---
.../components/form/__tests__/useDownload.jsx | 40 +++++++++++++++++++
1 file changed, 40 insertions(+)
create mode 100644 src/web/components/form/__tests__/useDownload.jsx
diff --git a/src/web/components/form/__tests__/useDownload.jsx b/src/web/components/form/__tests__/useDownload.jsx
new file mode 100644
index 0000000000..53ade8a4f0
--- /dev/null
+++ b/src/web/components/form/__tests__/useDownload.jsx
@@ -0,0 +1,40 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+/* eslint-disable react/prop-types */
+
+import {describe, test, expect, testing} from '@gsa/testing';
+
+import {fireEvent, render, screen} from 'web/utils/testing';
+
+import useDownload from '../useDownload';
+import Download from '../download';
+
+const TestComponent = () => {
+ const [ref, download] = useDownload();
+ return (
+ <>
+
+ download({filename: 'foo', data: 'bar'})}
+ />
+ >
+ );
+};
+
+describe('useDownload', () => {
+ test('should download a file', () => {
+ const createObjectURL = testing.fn().mockReturnValue('foo://bar');
+ window.URL.createObjectURL = createObjectURL;
+ window.URL.revokeObjectURL = testing.fn();
+
+ render( );
+
+ fireEvent.click(screen.getByTestId('download'));
+
+ expect(createObjectURL).toHaveBeenCalled();
+ });
+});
From 791f36db0773b22727131dfaa16f3d58eea3318a Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 18 Jun 2024 07:54:03 +0000
Subject: [PATCH 037/130] Bump ws from 8.16.0 to 8.17.1
Bumps [ws](https://github.com/websockets/ws) from 8.16.0 to 8.17.1.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/8.16.0...8.17.1)
---
updated-dependencies:
- dependency-name: ws
dependency-type: indirect
...
Signed-off-by: dependabot[bot]
---
package-lock.json | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index b1f8ff611c..1d93bd048f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -14048,9 +14048,9 @@
}
},
"node_modules/ws": {
- "version": "8.16.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz",
- "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==",
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
+ "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
"dev": true,
"optional": true,
"peer": true,
From a0042e4e79e66cdc3e75b965f64e81f92a7b7fe8 Mon Sep 17 00:00:00 2001
From: Timo Pollmeier
Date: Wed, 5 Jun 2024 08:47:26 +0200
Subject: [PATCH 038/130] Add: Toggle to enable EPSS fields
The EPSS fields for CVEs and VTs can now be toggled with an option in
the config.js file.
This is done because no EPSS feed is provided yet, so the new fields
should only be enabled for testing.
---
src/gmp/gmpsettings.js | 2 +
src/web/pages/cves/__tests__/detailspage.jsx | 5 +-
src/web/pages/cves/__tests__/listpage.jsx | 2 +-
src/web/pages/cves/details.jsx | 5 +-
src/web/pages/cves/row.jsx | 71 +++++++++++---------
src/web/pages/cves/table.jsx | 51 ++++++++------
src/web/pages/nvts/__tests__/detailspage.jsx | 10 +--
src/web/pages/nvts/__tests__/listpage.jsx | 4 +-
src/web/pages/nvts/details.jsx | 6 +-
src/web/pages/nvts/row.jsx | 23 ++++---
src/web/pages/nvts/table.jsx | 56 +++++++++------
11 files changed, 139 insertions(+), 96 deletions(-)
diff --git a/src/gmp/gmpsettings.js b/src/gmp/gmpsettings.js
index 2c23758a6c..f09f252799 100644
--- a/src/gmp/gmpsettings.js
+++ b/src/gmp/gmpsettings.js
@@ -44,6 +44,7 @@ const warnDeprecatedSetting = (oldName, newName) => {
class GmpSettings {
constructor(storage = global.localStorage, options = {}) {
const {
+ enableEPSS = false,
enableGreenboneSensor = false,
disableLoginForm = false,
enableStoreDebugLog,
@@ -109,6 +110,7 @@ class GmpSettings {
setAndFreeze(this, 'apiProtocol', apiProtocol);
setAndFreeze(this, 'apiServer', apiServer);
setAndFreeze(this, 'disableLoginForm', disableLoginForm);
+ setAndFreeze(this, 'enableEPSS', enableEPSS);
setAndFreeze(this, 'enableGreenboneSensor', enableGreenboneSensor);
setAndFreeze(this, 'guestUsername', guestUsername);
setAndFreeze(this, 'guestPassword', guestPassword);
diff --git a/src/web/pages/cves/__tests__/detailspage.jsx b/src/web/pages/cves/__tests__/detailspage.jsx
index bdb1573e59..3a4e2fa026 100644
--- a/src/web/pages/cves/__tests__/detailspage.jsx
+++ b/src/web/pages/cves/__tests__/detailspage.jsx
@@ -139,7 +139,10 @@ describe('CVE Detailspage tests', () => {
get: getCve,
},
reloadInterval,
- settings: {manualUrl},
+ settings: {
+ manualUrl,
+ enableEPSS: true,
+ },
user: {
currentSettings,
renewSession,
diff --git a/src/web/pages/cves/__tests__/listpage.jsx b/src/web/pages/cves/__tests__/listpage.jsx
index 4e83cb7375..1760c79a23 100644
--- a/src/web/pages/cves/__tests__/listpage.jsx
+++ b/src/web/pages/cves/__tests__/listpage.jsx
@@ -109,7 +109,7 @@ describe('CvesPage tests', () => {
filters: {
get: getFilters,
},
- settings: {manualUrl, reloadInterval},
+ settings: {manualUrl, reloadInterval, enableEPSS: true},
user: {currentSettings, getSetting},
};
diff --git a/src/web/pages/cves/details.jsx b/src/web/pages/cves/details.jsx
index cf73b183a1..6cbe4cddd6 100644
--- a/src/web/pages/cves/details.jsx
+++ b/src/web/pages/cves/details.jsx
@@ -25,6 +25,7 @@ import TableData from 'web/components/table/data';
import TableRow from 'web/components/table/row';
import PropTypes from 'web/utils/proptypes';
+import useGmp from "web/utils/useGmp.jsx";
const CVSS_PROPS = {
cvssAccessVector: _l('Access Vector'),
@@ -49,7 +50,7 @@ const CVSS_PROPS = {
const CveDetails = ({entity}) => {
const {cvssBaseVector, description, references = [], severity, epss} = entity;
-
+ const gmp = useGmp();
return (
{isDefined(description) && (
@@ -92,7 +93,7 @@ const CveDetails = ({entity}) => {
- {isDefined(epss) && (
+ {gmp.settings.enableEPSS && isDefined(epss) && (
diff --git a/src/web/pages/cves/row.jsx b/src/web/pages/cves/row.jsx
index 7d9bdfc183..db9b5b551e 100644
--- a/src/web/pages/cves/row.jsx
+++ b/src/web/pages/cves/row.jsx
@@ -26,6 +26,7 @@ import {RowDetailsToggle} from 'web/entities/row';
import PropTypes from 'web/utils/proptypes';
import {isNumber} from "gmp/utils/identity";
+import useGmp from "web/utils/useGmp.jsx";
const Row = ({
actionsComponent: ActionsComponent = EntitiesActions,
@@ -33,37 +34,45 @@ const Row = ({
links = true,
onToggleDetailsClick,
...props
-}) => (
-
-
-
-
- {entity.name}
-
-
-
-
- {shorten(entity.description, 160)}
-
-
-
-
-
- {entity.cvssBaseVector}
-
-
-
-
-
-
- {isNumber(entity?.epss?.score) ? entity.epss?.score.toFixed(5) : _("N/A")}
-
-
- {isNumber(entity?.epss?.percentile) ? entity.epss?.percentile.toFixed(5) : _("N/A")}
-
-
-
-);
+}) => {
+ const gmp = useGmp();
+ return (
+
+
+
+
+ {entity.name}
+
+
+
+
+ {shorten(entity.description, 160)}
+
+
+
+
+
+ {entity.cvssBaseVector}
+
+
+
+
+
+ {
+ gmp.settings.enableEPSS &&
+ <>
+
+ {isNumber(entity?.epss?.score) ? entity.epss?.score.toFixed(5) : _("N/A")}
+
+
+ {isNumber(entity?.epss?.percentile) ? entity.epss?.percentile.toFixed(5) : _("N/A")}
+
+ >
+ }
+
+
+ )
+};
Row.propTypes = {
actionsComponent: PropTypes.component,
diff --git a/src/web/pages/cves/table.jsx b/src/web/pages/cves/table.jsx
index bdc87d581f..9b649b8e68 100644
--- a/src/web/pages/cves/table.jsx
+++ b/src/web/pages/cves/table.jsx
@@ -21,6 +21,7 @@ import TableRow from 'web/components/table/row';
import CveDetails from './details';
import CveRow from './row';
import {isDefined} from "gmp/utils/identity.js";
+import useGmp from "web/utils/useGmp.jsx";
const Header = ({
actionsColumn,
@@ -30,6 +31,7 @@ const Header = ({
currentSortDir,
onSortChange,
}) => {
+ const gmp = useGmp();
return (
@@ -44,7 +46,7 @@ const Header = ({
/>
-
- {_("EPSS")}
-
+ {gmp.settings.enableEPSS &&
+
+ {_("EPSS")}
+
+ }
{isDefined(actionsColumn) ? (
actionsColumn
) : (
@@ -89,24 +93,27 @@ const Header = ({
)}
-
-
-
-
+ {
+ gmp.settings.enableEPSS &&
+
+
+
+
+ }
);
};
diff --git a/src/web/pages/nvts/__tests__/detailspage.jsx b/src/web/pages/nvts/__tests__/detailspage.jsx
index 1f2397b105..1877e5d1e2 100644
--- a/src/web/pages/nvts/__tests__/detailspage.jsx
+++ b/src/web/pages/nvts/__tests__/detailspage.jsx
@@ -253,7 +253,7 @@ describe('Nvt Detailspage tests', () => {
nvt: {
get: getNvt,
},
- settings: {manualUrl, reloadInterval},
+ settings: {manualUrl, reloadInterval, enableEPSS: true},
user: {
currentSettings,
},
@@ -375,7 +375,7 @@ describe('Nvt Detailspage tests', () => {
overrides: {
get: getEntities,
},
- settings: {manualUrl, reloadInterval},
+ settings: {manualUrl, reloadInterval, enableEPSS: true},
user: {
currentSettings,
renewSession,
@@ -419,7 +419,7 @@ describe('Nvt Detailspage tests', () => {
overrides: {
get: getEntities,
},
- settings: {manualUrl, reloadInterval},
+ settings: {manualUrl, reloadInterval, enableEPSS: true},
user: {
currentSettings,
renewSession,
@@ -455,7 +455,7 @@ describe('Nvt ToolBarIcons tests', () => {
const handleOnNoteCreateClick = testing.fn();
const handleOnOverrideCreateClick = testing.fn();
- const gmp = {settings: {manualUrl}};
+ const gmp = {settings: {manualUrl, enableEPSS: true}};
const {render} = rendererWith({
gmp,
@@ -502,7 +502,7 @@ describe('Nvt ToolBarIcons tests', () => {
const handleOnNoteCreateClick = testing.fn();
const handleOnOverrideCreateClick = testing.fn();
- const gmp = {settings: {manualUrl}};
+ const gmp = {settings: {manualUrl, enableEPSS: true}};
const {render} = rendererWith({
gmp,
diff --git a/src/web/pages/nvts/__tests__/listpage.jsx b/src/web/pages/nvts/__tests__/listpage.jsx
index 99b42831f2..affd0beffe 100644
--- a/src/web/pages/nvts/__tests__/listpage.jsx
+++ b/src/web/pages/nvts/__tests__/listpage.jsx
@@ -122,7 +122,7 @@ describe('NvtsPage tests', () => {
filters: {
get: getFilters,
},
- settings: {manualUrl, reloadInterval},
+ settings: {manualUrl, reloadInterval, enableEPSS: true},
user: {currentSettings, getSetting},
};
@@ -238,7 +238,7 @@ describe('NvtsPage tests', () => {
filters: {
get: getFilters,
},
- settings: {manualUrl, reloadInterval},
+ settings: {manualUrl, reloadInterval, enableEPSS: true},
user: {renewSession, currentSettings, getSetting: getSetting},
};
diff --git a/src/web/pages/nvts/details.jsx b/src/web/pages/nvts/details.jsx
index 719b3ab998..5b669480a7 100644
--- a/src/web/pages/nvts/details.jsx
+++ b/src/web/pages/nvts/details.jsx
@@ -12,6 +12,7 @@ import {isDefined, isNumber} from 'gmp/utils/identity';
import {TAG_NA} from 'gmp/models/nvt';
import PropTypes from 'web/utils/proptypes';
+import useGmp from "web/utils/useGmp.jsx";
import {na, getTranslatableSeverityOrigin} from 'web/utils/render';
@@ -45,6 +46,7 @@ const NvtDetails = ({entity, links = true}) => {
severityOrigin,
severityDate,
} = entity;
+ const gmp = useGmp();
return (
{entity.isDeprecated() && {_('This NVT is deprecated.')}
}
@@ -97,7 +99,7 @@ const NvtDetails = ({entity, links = true}) => {
)}
- { isDefined(epss?.max_severity) &&
+ { gmp.settings.enableEPSS && isDefined(epss?.max_severity) &&
<>
{_('EPSS (CVE with highest severity)')}
@@ -133,7 +135,7 @@ const NvtDetails = ({entity, links = true}) => {
>
}
- { isDefined(epss?.max_epss) &&
+ { gmp.settings.enableEPSS && isDefined(epss?.max_epss) &&
<>
{_('EPSS (highest EPSS score)')}
diff --git a/src/web/pages/nvts/row.jsx b/src/web/pages/nvts/row.jsx
index 3f5e3e5c34..ce30bde3db 100644
--- a/src/web/pages/nvts/row.jsx
+++ b/src/web/pages/nvts/row.jsx
@@ -30,6 +30,7 @@ import EntitiesActions from 'web/entities/actions';
import {RowDetailsToggle} from 'web/entities/row';
import PropTypes from 'web/utils/proptypes';
+import useGmp from "web/utils/useGmp.jsx";
import {_} from "gmp/locale/lang.js";
const Row = ({
@@ -40,6 +41,7 @@ const Row = ({
onToggleDetailsClick,
...props
}) => {
+ const gmp = useGmp();
const handleFilterChanged = () => {
const filter = Filter.fromString('family="' + entity.family + '"');
onFilterChanged(filter);
@@ -90,14 +92,19 @@ const Row = ({
{entity.qod && }
-
- {isNumber(entity?.epss?.max_severity?.score)
- ? entity.epss?.max_severity?.score.toFixed(5) : _("N/A")}
-
-
- {isNumber(entity?.epss?.max_severity?.percentile)
- ? entity.epss?.max_severity?.percentile.toFixed(5) : _("N/A")}
-
+ {
+ gmp.settings.enableEPSS &&
+ <>
+
+ {isNumber(entity?.epss?.max_severity?.score)
+ ? entity.epss?.max_severity?.score.toFixed(5) : _("N/A")}
+
+
+ {isNumber(entity?.epss?.max_severity?.percentile)
+ ? entity.epss?.max_severity?.percentile.toFixed(5) : _("N/A")}
+
+ >
+ }
);
diff --git a/src/web/pages/nvts/table.jsx b/src/web/pages/nvts/table.jsx
index c8e5de6133..9cd3033d3f 100644
--- a/src/web/pages/nvts/table.jsx
+++ b/src/web/pages/nvts/table.jsx
@@ -27,6 +27,8 @@ import TableRow from 'web/components/table/row';
import NvtDetails from './details';
import NvtRow from './row';
+import useGmp from "web/utils/useGmp.jsx";
+
const Header = ({
actionsColumn,
links = true,
@@ -35,12 +37,13 @@ const Header = ({
currentSortDir,
onSortChange,
}) => {
+ const gmp = useGmp();
return (
-
- {_("EPSS")}
-
+ {
+ gmp.settings.enableEPSS &&
+
+ {_("EPSS")}
+
+ }
{actionsColumn}
-
-
-
-
+ {
+ gmp.settings.enableEPSS &&
+ <>
+
+
+
+
+ >
+ }
+
);
};
From d79623d5fa0a5c94fc950fb50a0a7662c57b0c0f Mon Sep 17 00:00:00 2001
From: Timo Pollmeier
Date: Tue, 11 Jun 2024 15:22:01 +0200
Subject: [PATCH 039/130] Clean up EPSS on CVE and NVT pages
A superfluous fragment has been removed and consts are used for
the EPSS scores and percentiles in tables for better readability.
---
src/web/pages/cves/row.jsx | 6 ++++--
src/web/pages/nvts/row.jsx | 8 ++++----
src/web/pages/nvts/table.jsx | 38 +++++++++++++++++-------------------
3 files changed, 26 insertions(+), 26 deletions(-)
diff --git a/src/web/pages/cves/row.jsx b/src/web/pages/cves/row.jsx
index db9b5b551e..90f23f09f0 100644
--- a/src/web/pages/cves/row.jsx
+++ b/src/web/pages/cves/row.jsx
@@ -36,6 +36,8 @@ const Row = ({
...props
}) => {
const gmp = useGmp();
+ const epss_score = entity?.epss?.score
+ const epss_percentile = entity?.epss?.percentile
return (
@@ -62,10 +64,10 @@ const Row = ({
gmp.settings.enableEPSS &&
<>
- {isNumber(entity?.epss?.score) ? entity.epss?.score.toFixed(5) : _("N/A")}
+ {isNumber(epss_score) ? epss_score.toFixed(5) : _("N/A")}
- {isNumber(entity?.epss?.percentile) ? entity.epss?.percentile.toFixed(5) : _("N/A")}
+ {isNumber(epss_percentile) ? epss_percentile.toFixed(5) : _("N/A")}
>
}
diff --git a/src/web/pages/nvts/row.jsx b/src/web/pages/nvts/row.jsx
index ce30bde3db..0efdfb6d03 100644
--- a/src/web/pages/nvts/row.jsx
+++ b/src/web/pages/nvts/row.jsx
@@ -46,6 +46,8 @@ const Row = ({
const filter = Filter.fromString('family="' + entity.family + '"');
onFilterChanged(filter);
};
+ const epss_score = entity?.epss?.max_severity?.score
+ const epss_percentile = entity?.epss?.max_severity?.percentile
return (
@@ -96,12 +98,10 @@ const Row = ({
gmp.settings.enableEPSS &&
<>
- {isNumber(entity?.epss?.max_severity?.score)
- ? entity.epss?.max_severity?.score.toFixed(5) : _("N/A")}
+ {isNumber(epss_score) ? epss_score.toFixed(5) : _("N/A")}
- {isNumber(entity?.epss?.max_severity?.percentile)
- ? entity.epss?.max_severity?.percentile.toFixed(5) : _("N/A")}
+ {isNumber(epss_percentile) ? epss_percentile.toFixed(5) : _("N/A")}
>
}
diff --git a/src/web/pages/nvts/table.jsx b/src/web/pages/nvts/table.jsx
index 9cd3033d3f..65117a6f17 100644
--- a/src/web/pages/nvts/table.jsx
+++ b/src/web/pages/nvts/table.jsx
@@ -125,26 +125,24 @@ const Header = ({
{
gmp.settings.enableEPSS &&
- <>
-
-
-
-
- >
+
+
+
+
}
From 655a2a40817f4bf07c17c58ac3f37819cba43696 Mon Sep 17 00:00:00 2001
From: Timo Pollmeier
Date: Tue, 11 Jun 2024 15:47:34 +0200
Subject: [PATCH 040/130] Remove .jsx suffix from useGmp and cvelink imports
---
src/web/pages/cves/details.jsx | 2 +-
src/web/pages/cves/row.jsx | 2 +-
src/web/pages/cves/table.jsx | 2 +-
src/web/pages/nvts/details.jsx | 4 ++--
src/web/pages/nvts/row.jsx | 2 +-
src/web/pages/nvts/table.jsx | 2 +-
6 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/src/web/pages/cves/details.jsx b/src/web/pages/cves/details.jsx
index 6cbe4cddd6..df0d48f31d 100644
--- a/src/web/pages/cves/details.jsx
+++ b/src/web/pages/cves/details.jsx
@@ -25,7 +25,7 @@ import TableData from 'web/components/table/data';
import TableRow from 'web/components/table/row';
import PropTypes from 'web/utils/proptypes';
-import useGmp from "web/utils/useGmp.jsx";
+import useGmp from "web/utils/useGmp";
const CVSS_PROPS = {
cvssAccessVector: _l('Access Vector'),
diff --git a/src/web/pages/cves/row.jsx b/src/web/pages/cves/row.jsx
index 90f23f09f0..9117d39e0c 100644
--- a/src/web/pages/cves/row.jsx
+++ b/src/web/pages/cves/row.jsx
@@ -26,7 +26,7 @@ import {RowDetailsToggle} from 'web/entities/row';
import PropTypes from 'web/utils/proptypes';
import {isNumber} from "gmp/utils/identity";
-import useGmp from "web/utils/useGmp.jsx";
+import useGmp from "web/utils/useGmp";
const Row = ({
actionsComponent: ActionsComponent = EntitiesActions,
diff --git a/src/web/pages/cves/table.jsx b/src/web/pages/cves/table.jsx
index 9b649b8e68..95e8306cc6 100644
--- a/src/web/pages/cves/table.jsx
+++ b/src/web/pages/cves/table.jsx
@@ -21,7 +21,7 @@ import TableRow from 'web/components/table/row';
import CveDetails from './details';
import CveRow from './row';
import {isDefined} from "gmp/utils/identity.js";
-import useGmp from "web/utils/useGmp.jsx";
+import useGmp from "web/utils/useGmp";
const Header = ({
actionsColumn,
diff --git a/src/web/pages/nvts/details.jsx b/src/web/pages/nvts/details.jsx
index 5b669480a7..5f7e80511d 100644
--- a/src/web/pages/nvts/details.jsx
+++ b/src/web/pages/nvts/details.jsx
@@ -12,7 +12,7 @@ import {isDefined, isNumber} from 'gmp/utils/identity';
import {TAG_NA} from 'gmp/models/nvt';
import PropTypes from 'web/utils/proptypes';
-import useGmp from "web/utils/useGmp.jsx";
+import useGmp from "web/utils/useGmp";
import {na, getTranslatableSeverityOrigin} from 'web/utils/render';
@@ -33,7 +33,7 @@ import TableRow from 'web/components/table/row';
import References from './references';
import Solution from './solution';
import Pre from './preformatted';
-import CveLink from "web/components/link/cvelink.jsx";
+import CveLink from "web/components/link/cvelink";
const NvtDetails = ({entity, links = true}) => {
const {
diff --git a/src/web/pages/nvts/row.jsx b/src/web/pages/nvts/row.jsx
index 0efdfb6d03..629ce05d57 100644
--- a/src/web/pages/nvts/row.jsx
+++ b/src/web/pages/nvts/row.jsx
@@ -30,7 +30,7 @@ import EntitiesActions from 'web/entities/actions';
import {RowDetailsToggle} from 'web/entities/row';
import PropTypes from 'web/utils/proptypes';
-import useGmp from "web/utils/useGmp.jsx";
+import useGmp from "web/utils/useGmp";
import {_} from "gmp/locale/lang.js";
const Row = ({
diff --git a/src/web/pages/nvts/table.jsx b/src/web/pages/nvts/table.jsx
index 65117a6f17..e343e10bca 100644
--- a/src/web/pages/nvts/table.jsx
+++ b/src/web/pages/nvts/table.jsx
@@ -27,7 +27,7 @@ import TableRow from 'web/components/table/row';
import NvtDetails from './details';
import NvtRow from './row';
-import useGmp from "web/utils/useGmp.jsx";
+import useGmp from "web/utils/useGmp";
const Header = ({
actionsColumn,
From d87d2a576f812b854f3844e02407e57c8f4989b6 Mon Sep 17 00:00:00 2001
From: Timo Pollmeier
Date: Tue, 11 Jun 2024 15:59:14 +0200
Subject: [PATCH 041/130] Add enableEPSS to readme
---
README.md | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 4aaec73d86..31b2b60f6f 100644
--- a/README.md
+++ b/README.md
@@ -24,6 +24,7 @@ written in [React](https://reactjs.org/).
- [vendorLabel](#vendorlabel)
- [guestUsername and guestPassword](#guestusername-and-guestpassword)
- [disableLoginForm](#disableloginform)
+ - [enableEPSS](#enableepss)
- [enableStoreDebugLog](#enablestoredebuglog)
- [logLevel](#loglevel)
- [timeout](#timeout)
@@ -235,11 +236,12 @@ instantiated once for the [GSA application](./src/web/app.js#L53)
### Config Variables
| Name | Type | Default | Changeable during runtime | Persistent after reload |
-| ------------------------------------------------- | -------------------------- | -------------------------------------------------------------------------------- | ------------------------- | ----------------------- |
+|---------------------------------------------------|----------------------------|----------------------------------------------------------------------------------|---------------------------|-------------------------|
| [apiProtocol](#apiprotocol) | String ('http' or 'https') | `global.location.protocol` | - | x |
| [apiServer](#apiserver) | String | `global.location.host` | - | x |
| enableGreenboneSensor | Boolean | false | - | x |
| [disableLoginForm](#disableloginform) | Boolean | false | - | x |
+| [enableEPSS](#enableepss) | Boolean | false | x | x |
| [enableStoreDebugLog](#enablestoredebuglog) | Boolean | false | x | x |
| [guestUsername](#guestusername-and-guestpassword) | String | undefined | - | x |
| [guestPassword](#guestusername-and-guestpassword) | String | undefined | - | x |
@@ -279,6 +281,12 @@ will be shown.
This setting allows to deactivate the username password form at the Login page.
It can be used to deactivate login for *normal* users.
+#### enableEPSS
+
+Enables the display of EPSS scores and percentiles in CVEs and NVTs.
+
+The data required for this is not available in the feed yet, so this is disabled by default.
+
#### enableStoreDebugLog
Changes to this settings are persistent during browser reload. If the value has
From f955c28ab1c4221457f0ad8d0879c2325d3a7353 Mon Sep 17 00:00:00 2001
From: Timo Pollmeier
Date: Tue, 18 Jun 2024 15:13:40 +0200
Subject: [PATCH 042/130] Use camelCase for EPSS local variables
---
src/web/pages/cves/row.jsx | 8 ++++----
src/web/pages/nvts/row.jsx | 8 ++++----
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/src/web/pages/cves/row.jsx b/src/web/pages/cves/row.jsx
index 9117d39e0c..0305ed6d68 100644
--- a/src/web/pages/cves/row.jsx
+++ b/src/web/pages/cves/row.jsx
@@ -36,8 +36,8 @@ const Row = ({
...props
}) => {
const gmp = useGmp();
- const epss_score = entity?.epss?.score
- const epss_percentile = entity?.epss?.percentile
+ const epssScore = entity?.epss?.score
+ const epssPercentile = entity?.epss?.percentile
return (
@@ -64,10 +64,10 @@ const Row = ({
gmp.settings.enableEPSS &&
<>
- {isNumber(epss_score) ? epss_score.toFixed(5) : _("N/A")}
+ {isNumber(epssScore) ? epssScore.toFixed(5) : _("N/A")}
- {isNumber(epss_percentile) ? epss_percentile.toFixed(5) : _("N/A")}
+ {isNumber(epssPercentile) ? epssPercentile.toFixed(5) : _("N/A")}
>
}
diff --git a/src/web/pages/nvts/row.jsx b/src/web/pages/nvts/row.jsx
index 629ce05d57..13fb41c812 100644
--- a/src/web/pages/nvts/row.jsx
+++ b/src/web/pages/nvts/row.jsx
@@ -46,8 +46,8 @@ const Row = ({
const filter = Filter.fromString('family="' + entity.family + '"');
onFilterChanged(filter);
};
- const epss_score = entity?.epss?.max_severity?.score
- const epss_percentile = entity?.epss?.max_severity?.percentile
+ const epssScore = entity?.epss?.max_severity?.score
+ const epssPercentile = entity?.epss?.max_severity?.percentile
return (
@@ -98,10 +98,10 @@ const Row = ({
gmp.settings.enableEPSS &&
<>
- {isNumber(epss_score) ? epss_score.toFixed(5) : _("N/A")}
+ {isNumber(epssScore) ? epssScore.toFixed(5) : _("N/A")}
- {isNumber(epss_percentile) ? epss_percentile.toFixed(5) : _("N/A")}
+ {isNumber(epssPercentile) ? epssPercentile.toFixed(5) : _("N/A")}
>
}
From 51d03370162fa51872a741d153671101cc165b29 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?=
Date: Tue, 18 Jun 2024 10:44:29 +0200
Subject: [PATCH 043/130] Change: Use `.js` as file suffix for hooks
Hooks usually don't contain JSX and therefore should use `.js` for the
file suffix. Currently this is mixed up between `.jsx` and `.js`.
---
src/web/components/form/{useDownload.jsx => useDownload.js} | 0
src/web/components/form/{useFormValues.jsx => useFormValues.js} | 1 -
src/web/hooks/{useLocale.jsx => useLocale.js} | 0
src/web/hooks/{useTranslation.jsx => useTranslation.js} | 0
src/web/utils/{useCapabilities.jsx => useCapabilities.js} | 0
src/web/utils/{useGmp.jsx => useGmp.js} | 0
src/web/utils/{useLicense.jsx => useLicense.js} | 0
src/web/utils/{useUserIsLoggedIn.jsx => useUserIsLoggedIn.js} | 0
src/web/utils/{useUserName.jsx => useUserName.js} | 0
.../{useUserSessionTimeout.jsx => useUserSessionTimeout.js} | 0
src/web/utils/{useUserTimezone.jsx => useUserTimezone.js} | 0
11 files changed, 1 deletion(-)
rename src/web/components/form/{useDownload.jsx => useDownload.js} (100%)
rename src/web/components/form/{useFormValues.jsx => useFormValues.js} (99%)
rename src/web/hooks/{useLocale.jsx => useLocale.js} (100%)
rename src/web/hooks/{useTranslation.jsx => useTranslation.js} (100%)
rename src/web/utils/{useCapabilities.jsx => useCapabilities.js} (100%)
rename src/web/utils/{useGmp.jsx => useGmp.js} (100%)
rename src/web/utils/{useLicense.jsx => useLicense.js} (100%)
rename src/web/utils/{useUserIsLoggedIn.jsx => useUserIsLoggedIn.js} (100%)
rename src/web/utils/{useUserName.jsx => useUserName.js} (100%)
rename src/web/utils/{useUserSessionTimeout.jsx => useUserSessionTimeout.js} (100%)
rename src/web/utils/{useUserTimezone.jsx => useUserTimezone.js} (100%)
diff --git a/src/web/components/form/useDownload.jsx b/src/web/components/form/useDownload.js
similarity index 100%
rename from src/web/components/form/useDownload.jsx
rename to src/web/components/form/useDownload.js
diff --git a/src/web/components/form/useFormValues.jsx b/src/web/components/form/useFormValues.js
similarity index 99%
rename from src/web/components/form/useFormValues.jsx
rename to src/web/components/form/useFormValues.js
index be67074002..816dcab442 100644
--- a/src/web/components/form/useFormValues.jsx
+++ b/src/web/components/form/useFormValues.js
@@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import {useCallback, useState} from 'react';
const useFormValues = (initialValues = {}) => {
diff --git a/src/web/hooks/useLocale.jsx b/src/web/hooks/useLocale.js
similarity index 100%
rename from src/web/hooks/useLocale.jsx
rename to src/web/hooks/useLocale.js
diff --git a/src/web/hooks/useTranslation.jsx b/src/web/hooks/useTranslation.js
similarity index 100%
rename from src/web/hooks/useTranslation.jsx
rename to src/web/hooks/useTranslation.js
diff --git a/src/web/utils/useCapabilities.jsx b/src/web/utils/useCapabilities.js
similarity index 100%
rename from src/web/utils/useCapabilities.jsx
rename to src/web/utils/useCapabilities.js
diff --git a/src/web/utils/useGmp.jsx b/src/web/utils/useGmp.js
similarity index 100%
rename from src/web/utils/useGmp.jsx
rename to src/web/utils/useGmp.js
diff --git a/src/web/utils/useLicense.jsx b/src/web/utils/useLicense.js
similarity index 100%
rename from src/web/utils/useLicense.jsx
rename to src/web/utils/useLicense.js
diff --git a/src/web/utils/useUserIsLoggedIn.jsx b/src/web/utils/useUserIsLoggedIn.js
similarity index 100%
rename from src/web/utils/useUserIsLoggedIn.jsx
rename to src/web/utils/useUserIsLoggedIn.js
diff --git a/src/web/utils/useUserName.jsx b/src/web/utils/useUserName.js
similarity index 100%
rename from src/web/utils/useUserName.jsx
rename to src/web/utils/useUserName.js
diff --git a/src/web/utils/useUserSessionTimeout.jsx b/src/web/utils/useUserSessionTimeout.js
similarity index 100%
rename from src/web/utils/useUserSessionTimeout.jsx
rename to src/web/utils/useUserSessionTimeout.js
diff --git a/src/web/utils/useUserTimezone.jsx b/src/web/utils/useUserTimezone.js
similarity index 100%
rename from src/web/utils/useUserTimezone.jsx
rename to src/web/utils/useUserTimezone.js
From 9dbee641a616db81a1493793c7fca94471f5d3fe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?=
Date: Tue, 18 Jun 2024 10:54:44 +0200
Subject: [PATCH 044/130] Change: Extract ErrorMarker from useFormValidation
hook module
Hooks should not contain JSX code and should be plain JS only. Therefore
extract the ErrorMarker component from the useFormValidation module and
use `js` file suffix for the module.
---
src/web/components/form/ErrorMarker.jsx | 29 +++++++++++++++++++
src/web/components/form/multiselect.jsx | 5 ++--
src/web/components/form/select.jsx | 5 ++--
src/web/components/form/textarea.jsx | 5 ++--
src/web/components/form/textfield.jsx | 5 ++--
...ormValidation.jsx => useFormValidation.js} | 24 +--------------
6 files changed, 38 insertions(+), 35 deletions(-)
create mode 100644 src/web/components/form/ErrorMarker.jsx
rename src/web/components/form/{useFormValidation.jsx => useFormValidation.js} (82%)
diff --git a/src/web/components/form/ErrorMarker.jsx b/src/web/components/form/ErrorMarker.jsx
new file mode 100644
index 0000000000..9b081635ee
--- /dev/null
+++ b/src/web/components/form/ErrorMarker.jsx
@@ -0,0 +1,29 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import React from 'react';
+
+import styled from 'styled-components';
+
+import {styledExcludeProps} from 'web/utils/styledConfig';
+import Theme from 'web/utils/theme';
+
+const StyledMarker = styledExcludeProps(styled.div, ['isVisible'])`
+ color: ${Theme.darkRed};
+ color: ${props => props.color};
+ font-weight: bold;
+ font-size: 19px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ display: ${props => (props.isVisible ? 'inline' : 'none')};
+`;
+
+const ErrorMarker = props => (
+
+ ×
+
+);
+
+export default ErrorMarker;
diff --git a/src/web/components/form/multiselect.jsx b/src/web/components/form/multiselect.jsx
index 0680d3183c..6ce998155c 100644
--- a/src/web/components/form/multiselect.jsx
+++ b/src/web/components/form/multiselect.jsx
@@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
import styled from 'styled-components';
@@ -33,7 +32,7 @@ import {
SelectedValue,
} from './selectelements';
-import {Marker} from './useFormValidation';
+import ErrorMarker from './ErrorMarker';
const DEFAULT_WIDTH = '250px';
@@ -278,7 +277,7 @@ class MultiSelect extends React.Component {
)}
- ×
+ ×
);
}}
diff --git a/src/web/components/form/select.jsx b/src/web/components/form/select.jsx
index 77b3d8c7e7..ecb413f6d7 100644
--- a/src/web/components/form/select.jsx
+++ b/src/web/components/form/select.jsx
@@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
import Downshift from 'downshift';
@@ -31,7 +30,7 @@ import {
SelectedValue,
} from './selectelements';
-import {Marker} from './useFormValidation';
+import ErrorMarker from './ErrorMarker';
import {styledExcludeProps} from 'web/utils/styledConfig';
const SingleSelectedValue = styled(SelectedValue)`
@@ -279,7 +278,7 @@ class Select extends React.Component {
)}
-
×
+
×
);
}}
diff --git a/src/web/components/form/textarea.jsx b/src/web/components/form/textarea.jsx
index 89cc9ee260..111c4cf4b5 100644
--- a/src/web/components/form/textarea.jsx
+++ b/src/web/components/form/textarea.jsx
@@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React, {useCallback} from 'react';
import {isDefined} from 'gmp/utils/identity';
import PropTypes from 'web/utils/proptypes';
@@ -15,7 +14,7 @@ import Theme from 'web/utils/theme';
import withLayout from 'web/components/layout/withLayout';
import {DISABLED_OPACITY} from './field';
-import {Marker} from './useFormValidation';
+import ErrorMarker from './ErrorMarker';
import {styledExcludeProps} from 'web/utils/styledConfig';
const StyledTextArea = styledExcludeProps(styled.textarea, [
@@ -80,7 +79,7 @@ const TextArea = ({
value={value}
onChange={handleChange}
/>
-
×
+
×
);
};
diff --git a/src/web/components/form/textfield.jsx b/src/web/components/form/textfield.jsx
index f0f9f44c16..37e31dc8e0 100644
--- a/src/web/components/form/textfield.jsx
+++ b/src/web/components/form/textfield.jsx
@@ -3,13 +3,12 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
import PropTypes from 'web/utils/proptypes';
import Field from './field';
-import {Marker} from './useFormValidation';
+import ErrorMarker from './ErrorMarker';
const TextField = ({hasError = false, errorContent, title, ...props}) => {
return (
@@ -20,7 +19,7 @@ const TextField = ({hasError = false, errorContent, title, ...props}) => {
title={hasError ? `${errorContent}` : title}
type="text"
/>
-
×
+
×
);
};
diff --git a/src/web/components/form/useFormValidation.jsx b/src/web/components/form/useFormValidation.js
similarity index 82%
rename from src/web/components/form/useFormValidation.jsx
rename to src/web/components/form/useFormValidation.js
index 55d074619c..5b252ee0fe 100644
--- a/src/web/components/form/useFormValidation.jsx
+++ b/src/web/components/form/useFormValidation.js
@@ -3,34 +3,12 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
-import React, {useState, useEffect, useCallback} from 'react';
-
-import styled from 'styled-components';
+import {useState, useEffect, useCallback} from 'react';
import {_, _l} from 'gmp/locale/lang';
import {hasValue, isDefined, isFunction} from 'gmp/utils/identity';
-import {styledExcludeProps} from 'web/utils/styledConfig';
-import Theme from 'web/utils/theme';
-
-const StyledMarker = styledExcludeProps(styled.div, ['isVisible'])`
- color: ${Theme.darkRed};
- color: ${props => props.color};
- font-weight: bold;
- font-size: 19px;
- padding-bottom: 1px;
- padding-left: 4px;
- display: ${props => (props.isVisible ? 'inline' : 'none')};
-`;
-
-export const Marker = props => (
-
- ×
-
-);
-
const useFormValidation = (
validationRules,
values,
From 03477107cf967303c0aff6a035e8176d743ab61c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?=
Date: Tue, 18 Jun 2024 12:22:19 +0200
Subject: [PATCH 045/130] Simplify ErrorMarker component
Just support the actual prop in use (`isVisible`) and drop passing a
child.
---
src/web/components/form/ErrorMarker.jsx | 15 +++++++++------
src/web/components/form/multiselect.jsx | 2 +-
src/web/components/form/select.jsx | 2 +-
src/web/components/form/textarea.jsx | 2 +-
src/web/components/form/textfield.jsx | 2 +-
5 files changed, 13 insertions(+), 10 deletions(-)
diff --git a/src/web/components/form/ErrorMarker.jsx b/src/web/components/form/ErrorMarker.jsx
index 9b081635ee..641349f2d0 100644
--- a/src/web/components/form/ErrorMarker.jsx
+++ b/src/web/components/form/ErrorMarker.jsx
@@ -7,23 +7,26 @@ import React from 'react';
import styled from 'styled-components';
-import {styledExcludeProps} from 'web/utils/styledConfig';
import Theme from 'web/utils/theme';
+import PropTypes from 'web/utils/proptypes';
-const StyledMarker = styledExcludeProps(styled.div, ['isVisible'])`
+const StyledMarker = styled.div`
color: ${Theme.darkRed};
- color: ${props => props.color};
font-weight: bold;
font-size: 19px;
padding-bottom: 1px;
padding-left: 4px;
- display: ${props => (props.isVisible ? 'inline' : 'none')};
+ display: ${props => (props.$isVisible ? 'inline' : 'none')};
`;
-const ErrorMarker = props => (
-
+const ErrorMarker = ({isVisible}) => (
+
×
);
+ErrorMarker.propTypes = {
+ isVisible: PropTypes.bool,
+};
+
export default ErrorMarker;
diff --git a/src/web/components/form/multiselect.jsx b/src/web/components/form/multiselect.jsx
index 6ce998155c..fb6d5b6166 100644
--- a/src/web/components/form/multiselect.jsx
+++ b/src/web/components/form/multiselect.jsx
@@ -277,7 +277,7 @@ class MultiSelect extends React.Component {
)}
- ×
+
);
}}
diff --git a/src/web/components/form/select.jsx b/src/web/components/form/select.jsx
index ecb413f6d7..fb79cc85a7 100644
--- a/src/web/components/form/select.jsx
+++ b/src/web/components/form/select.jsx
@@ -278,7 +278,7 @@ class Select extends React.Component {
)}
- ×
+
);
}}
diff --git a/src/web/components/form/textarea.jsx b/src/web/components/form/textarea.jsx
index 111c4cf4b5..9bc7f71865 100644
--- a/src/web/components/form/textarea.jsx
+++ b/src/web/components/form/textarea.jsx
@@ -79,7 +79,7 @@ const TextArea = ({
value={value}
onChange={handleChange}
/>
- ×
+
);
};
diff --git a/src/web/components/form/textfield.jsx b/src/web/components/form/textfield.jsx
index 37e31dc8e0..595c669bc6 100644
--- a/src/web/components/form/textfield.jsx
+++ b/src/web/components/form/textfield.jsx
@@ -19,7 +19,7 @@ const TextField = ({hasError = false, errorContent, title, ...props}) => {
title={hasError ? `${errorContent}` : title}
type="text"
/>
- ×
+
);
};
From 5d09434bfc56bc97aa03f22a2c585361ca99c858 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?=
Date: Tue, 18 Jun 2024 11:00:38 +0200
Subject: [PATCH 046/130] Change: Refactor PortLists page to a HOC less
entities page
Use the PortLists page as an example on howto refactor an entities page
to use the new hooks instead of the withEntitiesContainer HOC. Despite
having some more lines of code it should be easier to understand then
before.
---
src/web/pages/portlists/listpage.jsx | 387 +++++++++++++++++++++------
1 file changed, 304 insertions(+), 83 deletions(-)
diff --git a/src/web/pages/portlists/listpage.jsx b/src/web/pages/portlists/listpage.jsx
index c55a96641c..e8d0479d5e 100644
--- a/src/web/pages/portlists/listpage.jsx
+++ b/src/web/pages/portlists/listpage.jsx
@@ -3,37 +3,59 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-import React from 'react';
+import React, {useCallback, useEffect, useState} from 'react';
-import _ from 'gmp/locale';
+import {useDispatch} from 'react-redux';
import {PORTLISTS_FILTER_FILTER} from 'gmp/models/filter';
-import IconDivider from 'web/components/layout/icondivider';
-import PageTitle from 'web/components/layout/pagetitle';
+import {isDefined, hasValue} from 'gmp/utils/identity';
+
+import useCapabilities from 'web/utils/useCapabilities';
+import useUserSessionTimeout from 'web/utils/useUserSessionTimeout';
+
+import useGmp from 'web/utils/useGmp';
+import usePageFilter from 'web/hooks/usePageFilter';
+import useShallowEqualSelector from 'web/hooks/useShallowEqualSelector';
+import useReload from 'web/hooks/useReload';
+import useSelection from 'web/hooks/useSelection';
+import useFilterSortBy from 'web/hooks/useFilterSortBy';
+import usePreviousValue from 'web/hooks/usePreviousValue';
+import usePagination from 'web/hooks/usePagination';
+import useTranslation from 'web/hooks/useTranslation';
import PropTypes from 'web/utils/proptypes';
-import withCapabilities from 'web/utils/withCapabilities';
+import SelectionType from 'web/utils/selectiontype';
+import {generateFilename} from 'web/utils/render';
+
+import {loadEntities, selector} from 'web/store/entities/portlists';
+import {getUserSettingsDefaults} from 'web/store/usersettings/defaults/selectors';
+import useEntitiesReloadInterval from 'web/entities/useEntitiesReloadInterval';
+import BulkTags from 'web/entities/BulkTags';
import EntitiesPage from 'web/entities/page';
-import withEntitiesContainer from 'web/entities/withEntitiesContainer';
+import DialogNotification from 'web/components/notification/dialognotification';
+import useDialogNotification from 'web/components/notification/useDialogNotification';
+
+import PageTitle from 'web/components/layout/pagetitle';
+import Download from 'web/components/form/download';
+import PortListIcon from 'web/components/icon/portlisticon';
+import IconDivider from 'web/components/layout/icondivider';
import ManualIcon from 'web/components/icon/manualicon';
-import UploadIcon from 'web/components/icon/uploadicon';
import NewIcon from 'web/components/icon/newicon';
-import PortListIcon from 'web/components/icon/portlisticon';
+import UploadIcon from 'web/components/icon/uploadicon';
-import {
- loadEntities,
- selector as entitiesSelector,
-} from 'web/store/entities/portlists';
+import useDownload from 'web/components/form/useDownload';
import PortListComponent from './component';
-import PortListsFilterDialog from './filterdialog';
import PortListsTable from './table';
+import PortListsFilterDialog from './filterdialog';
-const ToolBarIcons = withCapabilities(
- ({capabilities, onPortListCreateClick, onPortListImportClick}) => (
+const ToolBarIcons = ({onPortListCreateClick, onPortListImportClick}) => {
+ const capabilities = useCapabilities();
+ const [_] = useTranslation();
+ return (
- ),
-);
+ );
+};
ToolBarIcons.propTypes = {
onPortListCreateClick: PropTypes.func.isRequired,
onPortListImportClick: PropTypes.func.isRequired,
};
-const PortListsPage = ({
- onChanged,
- onDownloaded,
- onError,
- onInteraction,
- ...props
-}) => (
-
- {({
- clone,
- create,
- delete: delete_func,
- download,
- edit,
- save,
- import: import_func,
- }) => (
-
-
- }
- table={PortListsTable}
- title={_('Portlists')}
- toolBarIcons={ToolBarIcons}
- onChanged={onChanged}
- onDownloaded={onDownloaded}
- onError={onError}
- onInteraction={onInteraction}
- onPortListCloneClick={clone}
- onPortListCreateClick={create}
- onPortListDeleteClick={delete_func}
- onPortListDownloadClick={download}
- onPortListEditClick={edit}
- onPortListSaveClick={save}
- onPortListImportClick={import_func}
- />
-
- )}
-
-);
-
-PortListsPage.propTypes = {
- onChanged: PropTypes.func.isRequired,
- onDownloaded: PropTypes.func.isRequired,
- onError: PropTypes.func.isRequired,
- onInteraction: PropTypes.func.isRequired,
+const getData = (filter, eSelector) => {
+ const entities = eSelector.getEntities(filter);
+ return {
+ entities,
+ entitiesCounts: eSelector.getEntitiesCounts(filter),
+ entitiesError: eSelector.getEntitiesError(filter),
+ filter,
+ isLoading: eSelector.isLoadingEntities(filter),
+ loadedFilter: eSelector.getLoadedFilter(filter),
+ };
};
-export default withEntitiesContainer('portlist', {
- entitiesSelector,
- loadEntities,
-})(PortListsPage);
+const PortListsPage = () => {
+ const [_] = useTranslation();
+ const gmp = useGmp();
+ const dispatch = useDispatch();
+ const [isTagsDialogVisible, setIsTagsDialogVisible] = useState(false);
+ const [downloadRef, handleDownload] = useDownload();
+ const [, renewSession] = useUserSessionTimeout();
+ const [filter, isLoadingFilter, changeFilter, resetFilter, removeFilter] =
+ usePageFilter('portlist');
+ const previousFilter = usePreviousValue(filter);
+ const portListsSelector = useShallowEqualSelector(selector);
+ const listExportFileName = useShallowEqualSelector(state =>
+ getUserSettingsDefaults(state).getValueByName('listexportfilename'),
+ );
+ const {
+ selectionType,
+ selected: selectedEntities = [],
+ changeSelectionType,
+ select,
+ deselect,
+ } = useSelection();
+ const [sortBy, sortDir, handleSortChange] = useFilterSortBy(
+ filter,
+ changeFilter,
+ );
+ const {
+ dialogState: notificationDialogState,
+ closeDialog: closeNotificationDialog,
+ showError,
+ } = useDialogNotification();
+
+ // fetch port lists
+ const fetch = useCallback(
+ withFilter => {
+ dispatch(loadEntities(gmp)(withFilter));
+ },
+ [dispatch, gmp],
+ );
+
+ // refetch port lists with the current filter
+ const refetch = useCallback(() => {
+ fetch(filter);
+ }, [filter, fetch]);
+
+ const {entities, entitiesCounts, isLoading} = getData(
+ filter,
+ portListsSelector,
+ );
+
+ const paginationChanged = useCallback(
+ newFilter => {
+ fetch(newFilter);
+ changeFilter(newFilter);
+ },
+ [changeFilter, fetch],
+ );
+
+ const [getFirst, getLast, getNext, getPrevious] = usePagination(
+ filter,
+ entitiesCounts,
+ paginationChanged,
+ );
+ const timeoutFunc = useEntitiesReloadInterval(entities);
+ const [startReload, stopReload, hasRunningTimer] = useReload(
+ refetch,
+ timeoutFunc,
+ );
+
+ useEffect(() => {
+ // load initial data
+ if (isDefined(filter) && !isLoadingFilter) {
+ fetch(filter);
+ }
+ }, [filter, isLoadingFilter, fetch]);
+
+ useEffect(() => {
+ // reload if filter has changed
+ if (!filter.equals(previousFilter)) {
+ fetch(filter);
+ }
+ }, [filter, previousFilter, fetch]);
+
+ useEffect(() => {
+ // start reloading if tasks are available and no timer is running yet
+ if (hasValue(entities) && !hasRunningTimer) {
+ startReload();
+ }
+ }, [entities, startReload]); // eslint-disable-line react-hooks/exhaustive-deps
+
+ // stop reload on unmount
+ useEffect(() => stopReload, [stopReload]);
+
+ const closeTagsDialog = useCallback(() => {
+ renewSession();
+ setIsTagsDialogVisible(false);
+ }, [renewSession, setIsTagsDialogVisible]);
+
+ const openTagsDialog = useCallback(() => {
+ renewSession();
+ setIsTagsDialogVisible(true);
+ }, [renewSession, setIsTagsDialogVisible]);
+
+ const handleBulkDelete = useCallback(async () => {
+ const entitiesCommand = gmp.portlists;
+ let promise;
+ if (selectionType === SelectionType.SELECTION_USER) {
+ promise = entitiesCommand.delete(selectedEntities);
+ } else if (selectionType === SelectionType.SELECTION_PAGE_CONTENTS) {
+ promise = entitiesCommand.deleteByFilter(filter);
+ } else {
+ promise = entitiesCommand.deleteByFilter(filter.all());
+ }
+
+ renewSession();
+
+ try {
+ await promise;
+ refetch();
+ } catch (error) {
+ showError(error);
+ }
+ }, [
+ selectionType,
+ filter,
+ selectedEntities,
+ showError,
+ gmp.portlists,
+ refetch,
+ renewSession,
+ ]);
+
+ const handleBulkDownload = useCallback(async () => {
+ const entitiesCommand = gmp.portlists;
+ let promise;
+ if (selectionType === SelectionType.SELECTION_USER) {
+ promise = entitiesCommand.export(selectedEntities);
+ } else if (selectionType === SelectionType.SELECTION_PAGE_CONTENTS) {
+ promise = entitiesCommand.exportByFilter(filter);
+ } else {
+ promise = entitiesCommand.exportByFilter(filter.all());
+ }
+
+ renewSession();
+
+ try {
+ const response = await promise;
+ const filename = generateFilename({
+ fileNameFormat: listExportFileName,
+ resourceType: 'portlists',
+ });
+ const {data: downloadData} = response;
+ handleDownload({filename, data: downloadData});
+ } catch (error) {
+ showError(error);
+ }
+ }, [
+ renewSession,
+ handleDownload,
+ showError,
+ gmp.portlists,
+ filter,
+ selectedEntities,
+ selectionType,
+ listExportFileName,
+ ]);
+
+ return (
+
+ {({
+ clone,
+ create,
+ delete: delete_func,
+ download,
+ edit,
+ save,
+ import: import_func,
+ }) => (
+ <>
+
+ }
+ selectionType={selectionType}
+ table={PortListsTable}
+ title={_('Portlists')}
+ toolBarIcons={ToolBarIcons}
+ onDeleteError={showError}
+ onError={showError}
+ onFirstClick={getFirst}
+ onLastClick={getLast}
+ onNextClick={getNext}
+ onPreviousClick={getPrevious}
+ onEntitySelected={select}
+ onEntityDeselected={deselect}
+ onFilterChanged={changeFilter}
+ onFilterCreated={changeFilter}
+ onFilterReset={resetFilter}
+ onFilterRemoved={removeFilter}
+ onInteraction={renewSession}
+ onPortListCloneClick={clone}
+ onPortListCreateClick={create}
+ onPortListDeleteClick={delete_func}
+ onPortListDownloadClick={download}
+ onPortListEditClick={edit}
+ onPortListSaveClick={save}
+ onPortListImportClick={import_func}
+ onSelectionTypeChange={changeSelectionType}
+ onSortChange={handleSortChange}
+ onDeleteBulk={handleBulkDelete}
+ onDownloadBulk={handleBulkDownload}
+ onTagsBulk={openTagsDialog}
+ />
+
+
+ {isTagsDialogVisible && (
+
+ )}
+ >
+ )}
+
+ );
+};
-// vim: set ts=2 sw=2 tw=80:
+export default PortListsPage;
From ec97f7a56269ef6206d3ef175830cd42d6b11086 Mon Sep 17 00:00:00 2001
From: Timo Pollmeier
Date: Thu, 20 Jun 2024 13:20:15 +0200
Subject: [PATCH 047/130] Add: EPSS scoring info to results
Scan results now show EPSS scores, percentiles and CVEs of their VTs if
the enableEPSS option is set to true.
---
src/gmp/models/cve.js | 2 +-
.../pages/results/__tests__/detailspage.jsx | 40 +++++++--
src/web/pages/results/__tests__/row.jsx | 55 ++++++++++++-
src/web/pages/results/detailspage.jsx | 82 ++++++++++++++++++-
src/web/pages/results/filterdialog.jsx | 8 ++
src/web/pages/results/row.jsx | 18 +++-
src/web/pages/results/table.jsx | 31 ++++++-
7 files changed, 224 insertions(+), 12 deletions(-)
diff --git a/src/gmp/models/cve.js b/src/gmp/models/cve.js
index 9ca414eae8..bb0fc32424 100644
--- a/src/gmp/models/cve.js
+++ b/src/gmp/models/cve.js
@@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import {isArray, isDefined} from 'gmp/utils/identity';
import {isEmpty} from 'gmp/utils/string';
import {map} from 'gmp/utils/array';
@@ -27,6 +26,7 @@ class Cve extends Info {
ret.name = element.name;
ret.id = element.name;
+ ret.epss = element.epss;
return ret;
}
diff --git a/src/web/pages/results/__tests__/detailspage.jsx b/src/web/pages/results/__tests__/detailspage.jsx
index e04a93aad9..bff381a894 100644
--- a/src/web/pages/results/__tests__/detailspage.jsx
+++ b/src/web/pages/results/__tests__/detailspage.jsx
@@ -23,6 +23,7 @@ import Detailspage, {ToolBarIcons} from '../detailspage';
const reloadInterval = -1;
const manualUrl = 'test/';
+const enableEPSS = true;
// mock entity
@@ -40,6 +41,24 @@ export const result = Result.fromElement({
type: 'nvt',
name: 'nvt1',
tags: 'cvss_base_vector=AV:N/AC:M/Au:N/C:P/I:N/A:N|summary=This is a mock result|insight=This is just a test|affected=Affects test cases only|impact=No real impact|solution=Keep writing tests|vuldetect=This is the detection method|solution_type=Mitigation',
+ epss: {
+ max_severity: {
+ score: 0.8765,
+ percentile: 0.8,
+ cve: {
+ _id: 'CVE-2019-1234',
+ severity: 5.0,
+ },
+ },
+ max_epss: {
+ score: 0.9876,
+ percentile: 0.9,
+ cve: {
+ _id: 'CVE-2020-5678',
+ severity: 2.0,
+ },
+ },
+ },
refs: {
ref: [
{_type: 'cve', _id: 'CVE-2019-1234'},
@@ -124,7 +143,7 @@ describe('Result Detailspage tests', () => {
permissions: {
get: getPermissions,
},
- settings: {manualUrl, reloadInterval},
+ settings: {manualUrl, reloadInterval, enableEPSS},
user: {currentSettings, renewSession},
};
@@ -189,7 +208,16 @@ describe('Result Detailspage tests', () => {
expect(baseElement).toHaveTextContent('QoD80 %');
expect(baseElement).toHaveTextContent('Host109.876.54.321');
expect(baseElement).toHaveTextContent('Location80/tcp');
-
+ expect(baseElement).toHaveTextContent('EPSS (CVE with highest severity)');
+ expect(baseElement).toHaveTextContent('EPSS Score0.87650');
+ expect(baseElement).toHaveTextContent('EPSS Percentile0.80000');
+ expect(baseElement).toHaveTextContent('CVECVE-2019-1234');
+ expect(baseElement).toHaveTextContent('CVE Severity5.0 (Medium)');
+ expect(baseElement).toHaveTextContent('EPSS (highest EPSS score)');
+ expect(baseElement).toHaveTextContent('EPSS Score0.98760');
+ expect(baseElement).toHaveTextContent('EPSS Percentile0.90000');
+ expect(baseElement).toHaveTextContent('CVECVE-2020-5678');
+ expect(baseElement).toHaveTextContent('CVE Severity2.0 (Low)');
expect(heading[2]).toHaveTextContent('Summary');
expect(baseElement).toHaveTextContent('This is a mock result');
@@ -245,7 +273,7 @@ describe('Result Detailspage tests', () => {
permissions: {
get: getPermissions,
},
- settings: {manualUrl, reloadInterval},
+ settings: {manualUrl, reloadInterval, enableEPSS},
user: {currentSettings, renewSession},
};
@@ -294,7 +322,7 @@ describe('Result Detailspage tests', () => {
users: {
get: getUsers,
},
- settings: {manualUrl, reloadInterval},
+ settings: {manualUrl, reloadInterval, enableEPSS},
user: {currentSettings, renewSession},
};
@@ -339,7 +367,7 @@ describe('Result ToolBarIcons tests', () => {
const handleResultDownloadClick = testing.fn();
const handleTicketCreateClick = testing.fn();
- const gmp = {settings: {manualUrl}};
+ const gmp = {settings: {manualUrl, enableEPSS}};
const {render} = rendererWith({
gmp,
@@ -390,7 +418,7 @@ describe('Result ToolBarIcons tests', () => {
const handleResultDownloadClick = testing.fn();
const handleTicketCreateClick = testing.fn();
- const gmp = {settings: {manualUrl}};
+ const gmp = {settings: {manualUrl, enableEPSS}};
const {render} = rendererWith({
gmp,
diff --git a/src/web/pages/results/__tests__/row.jsx b/src/web/pages/results/__tests__/row.jsx
index e71724102b..e061adf30e 100644
--- a/src/web/pages/results/__tests__/row.jsx
+++ b/src/web/pages/results/__tests__/row.jsx
@@ -11,8 +11,59 @@ import {rendererWith} from 'web/utils/testing';
import Row from '../row';
+const gmp = {settings: {enableEPSS: true}};
+
+describe('Should render EPSS fields', () => {
+ const {render} = rendererWith({gmp, store: true});
+
+ test('should render EPSS columns', () => {
+ const entity = Result.fromElement({
+ _id: '101',
+ name: 'Result 1',
+ host: {__text: '123.456.78.910', hostname: 'foo'},
+ port: '80/tcp',
+ severity: 10.0,
+ qod: {value: 80},
+ notes: [],
+ overrides: [],
+ tickets: [],
+ nvt: {
+ epss: {
+ max_severity: {
+ score: 0.8765,
+ percentile: 0.8,
+ cve: {
+ _id: 'CVE-2019-1234',
+ severity: 5.0,
+ },
+ },
+ max_epss: {
+ score: 0.9876,
+ percentile: 0.9,
+ cve: {
+ _id: 'CVE-2020-5678',
+ severity: 2.0,
+ },
+ },
+ },
+ },
+ });
+
+ const {element} = render(
+ ,
+ );
+
+ expect(element).toHaveTextContent("0.87650");
+ expect(element).toHaveTextContent("0.80000");
+ });
+});
+
describe('Delta reports V2 with changed severity, qod and hostname', () => {
- const {render} = rendererWith();
+ const {render} = rendererWith({gmp, store: true});
test('should render Delta Difference icon', () => {
const entity = Result.fromElement({
@@ -54,7 +105,7 @@ describe('Delta reports V2 with changed severity, qod and hostname', () => {
});
describe('Delta reports V2 with same severity, qod and hostname', () => {
- const {render} = rendererWith();
+ const {render} = rendererWith({gmp, store: true});
test('should not render Delta Difference icon', () => {
const entity = Result.fromElement({
diff --git a/src/web/pages/results/detailspage.jsx b/src/web/pages/results/detailspage.jsx
index b08526539d..18e3286063 100644
--- a/src/web/pages/results/detailspage.jsx
+++ b/src/web/pages/results/detailspage.jsx
@@ -11,7 +11,7 @@ import _ from 'gmp/locale';
import {MANUAL, TASK_SELECTED, RESULT_ANY} from 'gmp/models/override';
-import {isDefined} from 'gmp/utils/identity';
+import {isDefined, isNumber} from 'gmp/utils/identity';
import Badge from 'web/components/badge/badge';
@@ -70,6 +70,7 @@ import compose from 'web/utils/compose';
import {generateFilename} from 'web/utils/render';
import PropTypes from 'web/utils/proptypes';
import useCapabilities from 'web/utils/useCapabilities';
+import useGmp from "web/utils/useGmp";
import NoteComponent from '../notes/component';
@@ -78,6 +79,8 @@ import OverrideComponent from '../overrides/component';
import TicketComponent from '../tickets/component';
import ResultDetails from './details';
+import CveLink from "web/components/link/cvelink.jsx";
+import Severitybar from "web/components/bar/severitybar.jsx";
export const ToolBarIcons = ({
entity,
@@ -177,6 +180,9 @@ const Details = ({entity, ...props}) => {
const {notes, overrides, qod, host, userTags} = entity;
const active_notes = notes.filter(active_filter);
const active_overrides = overrides.filter(active_filter);
+ const epss = entity?.information?.epss
+ const gmp = useGmp()
+
return (
@@ -230,6 +236,80 @@ const Details = ({entity, ...props}) => {
{_('Location')}
{entity.port}
+ { gmp.settings.enableEPSS && isDefined(epss?.max_severity) &&
+ <>
+
+ {_('EPSS (CVE with highest severity)')}
+
+
+ {_('EPSS Score')}
+
+ {isNumber(epss?.max_severity?.score)
+ ? epss?.max_severity?.score.toFixed(5) : _("N/A")}
+
+
+
+ {_('EPSS Percentile')}
+
+ {isNumber(epss?.max_severity?.percentile)
+ ? epss?.max_severity?.percentile.toFixed(5) : _("N/A")}
+
+
+
+ {_('CVE')}
+
+
+ {epss?.max_severity?.cve?._id}
+
+
+
+
+ {_('CVE Severity')}
+
+
+ >
+ }
+ { gmp.settings.enableEPSS && isDefined(epss?.max_epss) &&
+ <>
+
+ {_('EPSS (highest EPSS score)')}
+
+
+ {_('EPSS Score')}
+
+ {isNumber(epss?.max_epss?.score)
+ ? epss?.max_epss?.score.toFixed(5) : _("N/A")}
+
+
+
+ {_('EPSS Percentile')}
+
+ {isNumber(epss?.max_epss?.percentile)
+ ? epss?.max_epss?.percentile.toFixed(5) : _("N/A")}
+
+
+
+ {_('CVE')}
+
+
+ {epss?.max_epss?.cve?._id}
+
+
+
+
+ {_('CVE Severity')}
+
+
+
+
+ >
+ }
diff --git a/src/web/pages/results/filterdialog.jsx b/src/web/pages/results/filterdialog.jsx
index a7ce7cd648..a38cad50ae 100644
--- a/src/web/pages/results/filterdialog.jsx
+++ b/src/web/pages/results/filterdialog.jsx
@@ -67,6 +67,14 @@ const SORT_FIELDS = [
name: 'modified',
displayName: _l('Modified'),
},
+ {
+ name: 'epss_score',
+ displayName: _l('EPSS Score'),
+ },
+ {
+ name: 'epss_percentile',
+ displayName: _l('EPSS Percentile'),
+ },
];
const ResultsFilterDialogComponent = ({
diff --git a/src/web/pages/results/row.jsx b/src/web/pages/results/row.jsx
index 64d72d7333..6b61a0d8c9 100644
--- a/src/web/pages/results/row.jsx
+++ b/src/web/pages/results/row.jsx
@@ -8,7 +8,7 @@ import React from 'react';
import _ from 'gmp/locale';
-import {isDefined} from 'gmp/utils/identity';
+import {isDefined, isNumber} from 'gmp/utils/identity';
import {shorten} from 'gmp/utils/string';
@@ -38,6 +38,7 @@ import EntitiesActions from 'web/entities/actions';
import PropTypes from 'web/utils/proptypes';
import ResultDelta from './delta';
+import useGmp from "web/utils/useGmp";
const Row = ({
actionsComponent: ActionsComponent = EntitiesActions,
@@ -60,6 +61,10 @@ const Row = ({
const deltaSeverity = entity.delta?.result?.severity;
const deltaHostname = entity.delta?.result?.host?.hostname;
const deltaQoD = entity.delta?.result?.qod?.value;
+ const epssScore = entity?.information?.epss?.max_severity?.score
+ const epssPercentile = entity?.information?.epss?.max_severity?.percentile
+ const gmp = useGmp()
+ console.debug(entity?.information)
return (
{delta && (
@@ -140,6 +145,17 @@ const Row = ({
{entity.port}
+ {
+ gmp.settings.enableEPSS &&
+ <>
+
+ {isNumber(epssScore) ? epssScore.toFixed(5) : _("N/A")}
+
+
+ {isNumber(epssPercentile) ? epssPercentile.toFixed(5) : _("N/A")}
+
+ >
+ }
diff --git a/src/web/pages/results/table.jsx b/src/web/pages/results/table.jsx
index ff9a20dcc0..117f26cc98 100644
--- a/src/web/pages/results/table.jsx
+++ b/src/web/pages/results/table.jsx
@@ -26,6 +26,7 @@ import TableRow from 'web/components/table/row';
import ResultsRow from './row';
import ResultDetails from './details';
+import useGmp from "web/utils/useGmp";
const Header = ({
actionsColumn,
@@ -36,6 +37,7 @@ const Header = ({
currentSortDir,
onSortChange,
}) => {
+ const gmp = useGmp();
return (
@@ -100,6 +102,12 @@ const Header = ({
onSortChange={onSortChange}
title={_('Location')}
/>
+ {
+ gmp.settings.enableEPSS &&
+
+ {_("EPSS")}
+
+ }
+ {
+ gmp.settings.enableEPSS &&
+ <>
+
+
+ >
+ }
);
@@ -144,7 +173,7 @@ Header.propTypes = {
export default createEntitiesTable({
emptyTitle: _l('No results available'),
footer: createEntitiesFooter({
- span: 8,
+ span: 10,
download: 'results.xml',
}),
header: withEntitiesHeader(true)(Header),
From a017000ad716bac02b7b41375a2835b1a587fbb3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?=
Date: Wed, 19 Jun 2024 11:43:22 +0200
Subject: [PATCH 048/130] Change: Move useCapabilities hook to hooks directory
---
src/web/components/powerfilter/dialog.jsx | 3 +--
src/web/{utils => hooks}/__tests__/useCapabilities.jsx | 4 ++--
src/web/{utils => hooks}/useCapabilities.js | 0
src/web/pages/extras/trashcanpage.jsx | 2 +-
src/web/pages/portlists/listpage.jsx | 2 +-
src/web/pages/results/detailspage.jsx | 2 +-
6 files changed, 6 insertions(+), 7 deletions(-)
rename src/web/{utils => hooks}/__tests__/useCapabilities.jsx (92%)
rename src/web/{utils => hooks}/useCapabilities.js (100%)
diff --git a/src/web/components/powerfilter/dialog.jsx b/src/web/components/powerfilter/dialog.jsx
index 0dc53614f9..4406115e0e 100644
--- a/src/web/components/powerfilter/dialog.jsx
+++ b/src/web/components/powerfilter/dialog.jsx
@@ -3,13 +3,12 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
import Layout from 'web/components/layout/layout';
import withFilterDialog from 'web/components/powerfilter/withFilterDialog';
-import useCapabilities from 'web/utils/useCapabilities';
+import useCapabilities from 'web/hooks/useCapabilities';
import CreateNamedFilterGroup from './createnamedfiltergroup';
import FilterStringGroup from './filterstringgroup';
diff --git a/src/web/utils/__tests__/useCapabilities.jsx b/src/web/hooks/__tests__/useCapabilities.jsx
similarity index 92%
rename from src/web/utils/__tests__/useCapabilities.jsx
rename to src/web/hooks/__tests__/useCapabilities.jsx
index 429bc13c69..48984f602d 100644
--- a/src/web/utils/__tests__/useCapabilities.jsx
+++ b/src/web/hooks/__tests__/useCapabilities.jsx
@@ -7,7 +7,7 @@ import {describe, test, expect} from '@gsa/testing';
import Capabilities from 'gmp/capabilities/capabilities';
-import {rendererWith} from '../testing';
+import {rendererWith} from 'web/utils/testing';
import useCapabilities from '../useCapabilities';
@@ -19,7 +19,7 @@ const TestUseCapabilities = () => {
return Not allowed to create a task ;
};
-describe('useCapabilties tests', () => {
+describe('useCapabilities tests', () => {
test('should be allowed to create a task', () => {
const capabilities = new Capabilities(['create_task']);
const {render} = rendererWith({capabilities});
diff --git a/src/web/utils/useCapabilities.js b/src/web/hooks/useCapabilities.js
similarity index 100%
rename from src/web/utils/useCapabilities.js
rename to src/web/hooks/useCapabilities.js
diff --git a/src/web/pages/extras/trashcanpage.jsx b/src/web/pages/extras/trashcanpage.jsx
index a76d5f393a..48bcc9a428 100644
--- a/src/web/pages/extras/trashcanpage.jsx
+++ b/src/web/pages/extras/trashcanpage.jsx
@@ -42,7 +42,7 @@ import {renewSessionTimeout} from 'web/store/usersettings/actions';
import compose from 'web/utils/compose';
import PropTypes from 'web/utils/proptypes';
import withGmp from 'web/utils/withGmp';
-import useCapabilities from 'web/utils/useCapabilities';
+import useCapabilities from 'web/hooks/useCapabilities';
import AlertsTable from '../alerts/table';
import ScanConfigsTable from '../scanconfigs/table';
diff --git a/src/web/pages/portlists/listpage.jsx b/src/web/pages/portlists/listpage.jsx
index e8d0479d5e..f5593efdc1 100644
--- a/src/web/pages/portlists/listpage.jsx
+++ b/src/web/pages/portlists/listpage.jsx
@@ -11,7 +11,7 @@ import {PORTLISTS_FILTER_FILTER} from 'gmp/models/filter';
import {isDefined, hasValue} from 'gmp/utils/identity';
-import useCapabilities from 'web/utils/useCapabilities';
+import useCapabilities from 'web/hooks/useCapabilities';
import useUserSessionTimeout from 'web/utils/useUserSessionTimeout';
import useGmp from 'web/utils/useGmp';
diff --git a/src/web/pages/results/detailspage.jsx b/src/web/pages/results/detailspage.jsx
index b08526539d..e378e873e9 100644
--- a/src/web/pages/results/detailspage.jsx
+++ b/src/web/pages/results/detailspage.jsx
@@ -69,7 +69,7 @@ import {getUsername} from 'web/store/usersettings/selectors';
import compose from 'web/utils/compose';
import {generateFilename} from 'web/utils/render';
import PropTypes from 'web/utils/proptypes';
-import useCapabilities from 'web/utils/useCapabilities';
+import useCapabilities from 'web/hooks/useCapabilities';
import NoteComponent from '../notes/component';
From e72ec05a455a0cd3b36def671135cf940fd6bf1d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?=
Date: Wed, 19 Jun 2024 11:47:27 +0200
Subject: [PATCH 049/130] Remove: Remove unused useUserIsLoggedIn hook
---
src/web/utils/__tests__/useUserIsLoggedIn.jsx | 47 -------------------
src/web/utils/useUserIsLoggedIn.js | 19 --------
2 files changed, 66 deletions(-)
delete mode 100644 src/web/utils/__tests__/useUserIsLoggedIn.jsx
delete mode 100644 src/web/utils/useUserIsLoggedIn.js
diff --git a/src/web/utils/__tests__/useUserIsLoggedIn.jsx b/src/web/utils/__tests__/useUserIsLoggedIn.jsx
deleted file mode 100644
index f1c7ab667d..0000000000
--- a/src/web/utils/__tests__/useUserIsLoggedIn.jsx
+++ /dev/null
@@ -1,47 +0,0 @@
-/* SPDX-FileCopyrightText: 2024 Greenbone AG
- *
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-import {describe, test, expect} from '@gsa/testing';
-
-import {setIsLoggedIn as setIsLoggedInAction} from 'web/store/usersettings/actions';
-
-import {rendererWith, fireEvent} from '../testing';
-
-import useUserIsLoggedIn from '../useUserIsLoggedIn';
-
-const TestUserIsLoggedIn = () => {
- const [isLoggedIn, setIsLoggedIn] = useUserIsLoggedIn();
- return (
- setIsLoggedIn(false)}>
- {isLoggedIn ? 'yes' : 'no'}
-
- );
-};
-
-describe('useUserIsLoggedIn tests', () => {
- test('should return the users login status', () => {
- const {render, store} = rendererWith({store: true});
-
- store.dispatch(setIsLoggedInAction(true));
-
- const {element} = render( );
-
- expect(element).toHaveTextContent(/^yes$/);
- });
-
- test('should allow to update the users login status', () => {
- const {render, store} = rendererWith({store: true});
-
- store.dispatch(setIsLoggedInAction(true));
-
- const {element} = render( );
-
- expect(element).toHaveTextContent(/^yes$/);
-
- fireEvent.click(element);
-
- expect(element).toHaveTextContent(/^no$/);
- });
-});
diff --git a/src/web/utils/useUserIsLoggedIn.js b/src/web/utils/useUserIsLoggedIn.js
deleted file mode 100644
index 44c13461b3..0000000000
--- a/src/web/utils/useUserIsLoggedIn.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/* SPDX-FileCopyrightText: 2024 Greenbone AG
- *
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-import {useSelector, useDispatch} from 'react-redux';
-
-import {isLoggedIn} from 'web/store/usersettings/selectors';
-import {setIsLoggedIn} from 'web/store/usersettings/actions';
-
-const useUserIsLoggedIn = () => {
- const dispatch = useDispatch();
- return [
- useSelector(isLoggedIn),
- loggedIn => dispatch(setIsLoggedIn(loggedIn)),
- ];
-};
-
-export default useUserIsLoggedIn;
From b6d140d7c23dac8a6ffacb5d6b8cf194e924de6f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?=
Date: Wed, 19 Jun 2024 11:49:01 +0200
Subject: [PATCH 050/130] Change: Move useUserName hook to hooks directory
---
src/web/components/menu/usermenu.jsx | 2 +-
src/web/{utils => hooks}/__tests__/useUserName.jsx | 2 +-
src/web/{utils => hooks}/useUserName.js | 0
3 files changed, 2 insertions(+), 2 deletions(-)
rename src/web/{utils => hooks}/__tests__/useUserName.jsx (94%)
rename src/web/{utils => hooks}/useUserName.js (100%)
diff --git a/src/web/components/menu/usermenu.jsx b/src/web/components/menu/usermenu.jsx
index 9dfe3298da..eec18f550d 100644
--- a/src/web/components/menu/usermenu.jsx
+++ b/src/web/components/menu/usermenu.jsx
@@ -23,7 +23,7 @@ import Link from 'web/components/link/link';
import Theme from 'web/utils/theme';
import useGmp from 'web/utils/useGmp';
-import useUserName from 'web/utils/useUserName';
+import useUserName from 'web/hooks/useUserName';
import useUserSessionTimeout from 'web/utils/useUserSessionTimeout';
import useUserTimezone from 'web/utils/useUserTimezone';
diff --git a/src/web/utils/__tests__/useUserName.jsx b/src/web/hooks/__tests__/useUserName.jsx
similarity index 94%
rename from src/web/utils/__tests__/useUserName.jsx
rename to src/web/hooks/__tests__/useUserName.jsx
index f66cccfc96..a90d180fae 100644
--- a/src/web/utils/__tests__/useUserName.jsx
+++ b/src/web/hooks/__tests__/useUserName.jsx
@@ -7,7 +7,7 @@ import {describe, test, expect} from '@gsa/testing';
import {setUsername} from 'web/store/usersettings/actions';
-import {rendererWith, fireEvent} from '../testing';
+import {rendererWith, fireEvent} from 'web/utils/testing';
import useUserName from '../useUserName';
diff --git a/src/web/utils/useUserName.js b/src/web/hooks/useUserName.js
similarity index 100%
rename from src/web/utils/useUserName.js
rename to src/web/hooks/useUserName.js
From ec2b6b9b4894e63cc7530bfc7b16d15f643277b7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?=
Date: Wed, 19 Jun 2024 11:50:49 +0200
Subject: [PATCH 051/130] Change: Move useUserSessionTimeout hook to hooks
directory
---
src/web/components/menu/usermenu.jsx | 2 +-
src/web/entities/BulkTags.jsx | 2 +-
src/web/{utils => hooks}/__tests__/useUserSessionTimeout.jsx | 2 +-
src/web/{utils => hooks}/useUserSessionTimeout.js | 0
src/web/pages/extras/cvssV4/CvssV4Calculator.jsx | 2 +-
src/web/pages/extras/cvsscalculatorpage.jsx | 2 +-
src/web/pages/portlists/listpage.jsx | 2 +-
7 files changed, 6 insertions(+), 6 deletions(-)
rename src/web/{utils => hooks}/__tests__/useUserSessionTimeout.jsx (96%)
rename src/web/{utils => hooks}/useUserSessionTimeout.js (100%)
diff --git a/src/web/components/menu/usermenu.jsx b/src/web/components/menu/usermenu.jsx
index eec18f550d..64d411423c 100644
--- a/src/web/components/menu/usermenu.jsx
+++ b/src/web/components/menu/usermenu.jsx
@@ -24,7 +24,7 @@ import Link from 'web/components/link/link';
import Theme from 'web/utils/theme';
import useGmp from 'web/utils/useGmp';
import useUserName from 'web/hooks/useUserName';
-import useUserSessionTimeout from 'web/utils/useUserSessionTimeout';
+import useUserSessionTimeout from 'web/hooks/useUserSessionTimeout';
import useUserTimezone from 'web/utils/useUserTimezone';
const UserMenu = styled.span`
diff --git a/src/web/entities/BulkTags.jsx b/src/web/entities/BulkTags.jsx
index 42e406d7da..8fcd855b30 100644
--- a/src/web/entities/BulkTags.jsx
+++ b/src/web/entities/BulkTags.jsx
@@ -14,7 +14,7 @@ import PropTypes from 'web/utils/proptypes';
import SelectionType from 'web/utils/selectiontype';
import useGmp from 'web/utils/useGmp';
-import useUserSessionTimeout from 'web/utils/useUserSessionTimeout';
+import useUserSessionTimeout from 'web/hooks/useUserSessionTimeout';
import TagDialog from 'web/pages/tags/dialog';
diff --git a/src/web/utils/__tests__/useUserSessionTimeout.jsx b/src/web/hooks/__tests__/useUserSessionTimeout.jsx
similarity index 96%
rename from src/web/utils/__tests__/useUserSessionTimeout.jsx
rename to src/web/hooks/__tests__/useUserSessionTimeout.jsx
index 89a7783522..75c9202378 100644
--- a/src/web/utils/__tests__/useUserSessionTimeout.jsx
+++ b/src/web/hooks/__tests__/useUserSessionTimeout.jsx
@@ -10,7 +10,7 @@ import date from 'gmp/models/date';
import {setSessionTimeout as setSessionTimeoutAction} from 'web/store/usersettings/actions';
-import {rendererWith, fireEvent} from '../testing';
+import {rendererWith, fireEvent} from 'web/utils/testing';
import useUserSessionTimeout from '../useUserSessionTimeout';
diff --git a/src/web/utils/useUserSessionTimeout.js b/src/web/hooks/useUserSessionTimeout.js
similarity index 100%
rename from src/web/utils/useUserSessionTimeout.js
rename to src/web/hooks/useUserSessionTimeout.js
diff --git a/src/web/pages/extras/cvssV4/CvssV4Calculator.jsx b/src/web/pages/extras/cvssV4/CvssV4Calculator.jsx
index 74390f134f..c75584b8f3 100644
--- a/src/web/pages/extras/cvssV4/CvssV4Calculator.jsx
+++ b/src/web/pages/extras/cvssV4/CvssV4Calculator.jsx
@@ -15,7 +15,7 @@ import {
removeUnusedMetrics,
} from 'gmp/parser/cvssV4';
-import useUserSessionTimeout from 'web/utils/useUserSessionTimeout';
+import useUserSessionTimeout from 'web/hooks/useUserSessionTimeout';
import FormGroup from 'web/components/form/formgroup';
import Layout from 'web/components/layout/layout';
import Section from 'web/components/section/section';
diff --git a/src/web/pages/extras/cvsscalculatorpage.jsx b/src/web/pages/extras/cvsscalculatorpage.jsx
index dc244821bb..a7e1b16102 100644
--- a/src/web/pages/extras/cvsscalculatorpage.jsx
+++ b/src/web/pages/extras/cvsscalculatorpage.jsx
@@ -34,7 +34,7 @@ import Divider from 'web/components/layout/divider';
import Section from 'web/components/section/section';
-import useUserSessionTimeout from 'web/utils/useUserSessionTimeout';
+import useUserSessionTimeout from 'web/hooks/useUserSessionTimeout';
import CvssV4Calculator from './cvssV4/CvssV4Calculator';
const StyledTextField = styled(TextField)`
diff --git a/src/web/pages/portlists/listpage.jsx b/src/web/pages/portlists/listpage.jsx
index f5593efdc1..65ac7964d7 100644
--- a/src/web/pages/portlists/listpage.jsx
+++ b/src/web/pages/portlists/listpage.jsx
@@ -12,7 +12,7 @@ import {PORTLISTS_FILTER_FILTER} from 'gmp/models/filter';
import {isDefined, hasValue} from 'gmp/utils/identity';
import useCapabilities from 'web/hooks/useCapabilities';
-import useUserSessionTimeout from 'web/utils/useUserSessionTimeout';
+import useUserSessionTimeout from 'web/hooks/useUserSessionTimeout';
import useGmp from 'web/utils/useGmp';
import usePageFilter from 'web/hooks/usePageFilter';
From 68b348601b061e7b10364f6e889a558dcc0c5987 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?=
Date: Wed, 19 Jun 2024 11:52:05 +0200
Subject: [PATCH 052/130] Change: Move useUserTimezone hook to hooks directory
---
src/web/components/date/datetime.jsx | 2 +-
src/web/components/menu/usermenu.jsx | 2 +-
src/web/{utils => hooks}/__tests__/useUserTimezone.jsx | 2 +-
src/web/{utils => hooks}/useUserTimezone.js | 0
4 files changed, 3 insertions(+), 3 deletions(-)
rename src/web/{utils => hooks}/__tests__/useUserTimezone.jsx (94%)
rename src/web/{utils => hooks}/useUserTimezone.js (100%)
diff --git a/src/web/components/date/datetime.jsx b/src/web/components/date/datetime.jsx
index 21b27e5bfd..5f673c643b 100644
--- a/src/web/components/date/datetime.jsx
+++ b/src/web/components/date/datetime.jsx
@@ -8,7 +8,7 @@ import {dateTimeWithTimeZone, ensureDate} from 'gmp/locale/date';
import {isDefined, hasValue} from 'gmp/utils/identity';
import PropTypes from 'web/utils/proptypes';
-import useUserTimezone from 'web/utils/useUserTimezone';
+import useUserTimezone from 'web/hooks/useUserTimezone';
const DateTime = ({formatter = dateTimeWithTimeZone, timezone, date}) => {
date = ensureDate(date);
diff --git a/src/web/components/menu/usermenu.jsx b/src/web/components/menu/usermenu.jsx
index 64d411423c..83a68623f2 100644
--- a/src/web/components/menu/usermenu.jsx
+++ b/src/web/components/menu/usermenu.jsx
@@ -25,7 +25,7 @@ import Theme from 'web/utils/theme';
import useGmp from 'web/utils/useGmp';
import useUserName from 'web/hooks/useUserName';
import useUserSessionTimeout from 'web/hooks/useUserSessionTimeout';
-import useUserTimezone from 'web/utils/useUserTimezone';
+import useUserTimezone from 'web/hooks/useUserTimezone';
const UserMenu = styled.span`
display: inline-flex;
diff --git a/src/web/utils/__tests__/useUserTimezone.jsx b/src/web/hooks/__tests__/useUserTimezone.jsx
similarity index 94%
rename from src/web/utils/__tests__/useUserTimezone.jsx
rename to src/web/hooks/__tests__/useUserTimezone.jsx
index efe8b82bec..5299cc0bc0 100644
--- a/src/web/utils/__tests__/useUserTimezone.jsx
+++ b/src/web/hooks/__tests__/useUserTimezone.jsx
@@ -7,7 +7,7 @@ import {describe, test, expect} from '@gsa/testing';
import {setTimezone as setTimezoneAction} from 'web/store/usersettings/actions';
-import {rendererWith, fireEvent} from '../testing';
+import {rendererWith, fireEvent} from 'web/utils/testing';
import useUserTimezone from '../useUserTimezone';
diff --git a/src/web/utils/useUserTimezone.js b/src/web/hooks/useUserTimezone.js
similarity index 100%
rename from src/web/utils/useUserTimezone.js
rename to src/web/hooks/useUserTimezone.js
From 25af2e211aaf7a47e48d6fe6227ff000c938ef7d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?=
Date: Wed, 19 Jun 2024 11:57:12 +0200
Subject: [PATCH 053/130] Change: Move useLicense hook to hooks directory
The license feature is unused and could possibly removed completely. But
until now we should get a consistent directory layout.
---
src/web/components/notification/licensenotification.jsx | 3 +--
src/web/{utils => hooks}/useLicense.js | 0
2 files changed, 1 insertion(+), 2 deletions(-)
rename src/web/{utils => hooks}/useLicense.js (100%)
diff --git a/src/web/components/notification/licensenotification.jsx b/src/web/components/notification/licensenotification.jsx
index 31e65c0b19..3e9e30c0d8 100644
--- a/src/web/components/notification/licensenotification.jsx
+++ b/src/web/components/notification/licensenotification.jsx
@@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
import _ from 'gmp/locale';
@@ -17,7 +16,7 @@ import Link from 'web/components/link/link';
import InfoPanel from 'web/components/panel/infopanel';
import PropTypes from 'web/utils/proptypes';
-import useLicense from 'web/utils/useLicense';
+import useLicense from 'web/hooks/useLicense';
const LICENSE_EXPIRATION_THRESHOLD = 30;
diff --git a/src/web/utils/useLicense.js b/src/web/hooks/useLicense.js
similarity index 100%
rename from src/web/utils/useLicense.js
rename to src/web/hooks/useLicense.js
From c4542fd7101aff2342d558310fb40b3d14b587c1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?=
Date: Wed, 19 Jun 2024 12:04:31 +0200
Subject: [PATCH 054/130] Change: Move useGmp hook to hooks directory
---
src/web/components/bar/titlebar.jsx | 5 +--
src/web/components/img/product.jsx | 3 +-
src/web/components/link/manuallink.jsx | 3 +-
src/web/components/link/protocoldoclink.jsx | 2 +-
src/web/components/menu/usermenu.jsx | 2 +-
.../components/provider/licenseprovider.jsx | 3 +-
src/web/entities/BulkTags.jsx | 2 +-
src/web/entities/useEntitiesReloadInterval.js | 2 +-
src/web/{utils => hooks}/__tests__/useGmp.jsx | 2 +-
src/web/{utils => hooks}/useGmp.js | 0
src/web/hooks/usePageFilter.js | 2 +-
src/web/pages/cves/details.jsx | 5 +--
src/web/pages/cves/row.jsx | 20 +++++-----
src/web/pages/cves/table.jsx | 17 ++++-----
src/web/pages/extras/feedstatuspage.jsx | 2 +-
src/web/pages/nvts/details.jsx | 38 ++++++++++++-------
src/web/pages/nvts/row.jsx | 18 ++++-----
src/web/pages/nvts/table.jsx | 17 +++------
src/web/pages/portlists/listpage.jsx | 2 +-
src/web/pages/scanners/detailspage.jsx | 2 +-
src/web/pages/scanners/listpage.jsx | 2 +-
src/web/pages/scanners/row.jsx | 2 +-
22 files changed, 72 insertions(+), 79 deletions(-)
rename src/web/{utils => hooks}/__tests__/useGmp.jsx (92%)
rename src/web/{utils => hooks}/useGmp.js (100%)
diff --git a/src/web/components/bar/titlebar.jsx b/src/web/components/bar/titlebar.jsx
index 460cfd624e..772cd5854c 100644
--- a/src/web/components/bar/titlebar.jsx
+++ b/src/web/components/bar/titlebar.jsx
@@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
import {connect} from 'react-redux';
@@ -25,7 +24,7 @@ import {isLoggedIn} from 'web/store/usersettings/selectors';
import PropTypes from 'web/utils/proptypes';
import Theme from 'web/utils/theme';
-import useGmp from 'web/utils/useGmp';
+import useGmp from 'web/hooks/useGmp';
const TITLE_BAR_HEIGHT = '42px';
@@ -90,7 +89,7 @@ const Titlebar = ({loggedIn}) => {
);
-}
+};
Titlebar.propTypes = {
loggedIn: PropTypes.bool.isRequired,
diff --git a/src/web/components/img/product.jsx b/src/web/components/img/product.jsx
index e684a73a42..0744170572 100644
--- a/src/web/components/img/product.jsx
+++ b/src/web/components/img/product.jsx
@@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
import styled from 'styled-components';
@@ -12,7 +11,7 @@ import _ from 'gmp/locale';
import {isDefined} from 'gmp/utils/identity';
-import useGmp from 'web/utils/useGmp';
+import useGmp from 'web/hooks/useGmp';
import Img from './img';
diff --git a/src/web/components/link/manuallink.jsx b/src/web/components/link/manuallink.jsx
index 38977d8325..c53a43df39 100644
--- a/src/web/components/link/manuallink.jsx
+++ b/src/web/components/link/manuallink.jsx
@@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
import {getLocale} from 'gmp/locale/lang';
@@ -11,7 +10,7 @@ import {getLocale} from 'gmp/locale/lang';
import {isDefined} from 'gmp/utils/identity';
import PropTypes from 'web/utils/proptypes';
-import useGmp from 'web/utils/useGmp';
+import useGmp from 'web/hooks/useGmp';
import BlankLink from './blanklink';
diff --git a/src/web/components/link/protocoldoclink.jsx b/src/web/components/link/protocoldoclink.jsx
index 2b7c6cf508..ded9d8fd8f 100644
--- a/src/web/components/link/protocoldoclink.jsx
+++ b/src/web/components/link/protocoldoclink.jsx
@@ -7,7 +7,7 @@ import React from 'react';
import PropTypes from 'web/utils/proptypes';
-import useGmp from 'web/utils/useGmp';
+import useGmp from 'web/hooks/useGmp';
import BlankLink from './blanklink';
diff --git a/src/web/components/menu/usermenu.jsx b/src/web/components/menu/usermenu.jsx
index 83a68623f2..9aef15e649 100644
--- a/src/web/components/menu/usermenu.jsx
+++ b/src/web/components/menu/usermenu.jsx
@@ -22,7 +22,7 @@ import Divider from 'web/components/layout/divider';
import Link from 'web/components/link/link';
import Theme from 'web/utils/theme';
-import useGmp from 'web/utils/useGmp';
+import useGmp from 'web/hooks/useGmp';
import useUserName from 'web/hooks/useUserName';
import useUserSessionTimeout from 'web/hooks/useUserSessionTimeout';
import useUserTimezone from 'web/hooks/useUserTimezone';
diff --git a/src/web/components/provider/licenseprovider.jsx b/src/web/components/provider/licenseprovider.jsx
index 3b4c2eab62..14492eb5f8 100644
--- a/src/web/components/provider/licenseprovider.jsx
+++ b/src/web/components/provider/licenseprovider.jsx
@@ -3,10 +3,9 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React, {useEffect, useState} from 'react';
-import useGmp from 'web/utils/useGmp';
+import useGmp from 'web/hooks/useGmp';
export const LicenseContext = React.createContext({});
diff --git a/src/web/entities/BulkTags.jsx b/src/web/entities/BulkTags.jsx
index 8fcd855b30..e8bfc14628 100644
--- a/src/web/entities/BulkTags.jsx
+++ b/src/web/entities/BulkTags.jsx
@@ -13,7 +13,7 @@ import {apiType, getEntityType, typeName} from 'gmp/utils/entitytype';
import PropTypes from 'web/utils/proptypes';
import SelectionType from 'web/utils/selectiontype';
-import useGmp from 'web/utils/useGmp';
+import useGmp from 'web/hooks/useGmp';
import useUserSessionTimeout from 'web/hooks/useUserSessionTimeout';
import TagDialog from 'web/pages/tags/dialog';
diff --git a/src/web/entities/useEntitiesReloadInterval.js b/src/web/entities/useEntitiesReloadInterval.js
index d834d536d3..703d3c5956 100644
--- a/src/web/entities/useEntitiesReloadInterval.js
+++ b/src/web/entities/useEntitiesReloadInterval.js
@@ -7,7 +7,7 @@ import {useCallback} from 'react';
import {isDefined} from 'gmp/utils/identity';
-import useGmp from 'web/utils/useGmp';
+import useGmp from 'web/hooks/useGmp';
/**
* Hook to get the reload interval for entities
diff --git a/src/web/utils/__tests__/useGmp.jsx b/src/web/hooks/__tests__/useGmp.jsx
similarity index 92%
rename from src/web/utils/__tests__/useGmp.jsx
rename to src/web/hooks/__tests__/useGmp.jsx
index 6a5e54b94a..8b60e435dc 100644
--- a/src/web/utils/__tests__/useGmp.jsx
+++ b/src/web/hooks/__tests__/useGmp.jsx
@@ -5,7 +5,7 @@
import {describe, test, expect, testing} from '@gsa/testing';
-import {rendererWith} from '../testing';
+import {rendererWith} from 'web/utils/testing';
import useGmp from '../useGmp';
diff --git a/src/web/utils/useGmp.js b/src/web/hooks/useGmp.js
similarity index 100%
rename from src/web/utils/useGmp.js
rename to src/web/hooks/useGmp.js
diff --git a/src/web/hooks/usePageFilter.js b/src/web/hooks/usePageFilter.js
index f8f3408649..1588264732 100644
--- a/src/web/hooks/usePageFilter.js
+++ b/src/web/hooks/usePageFilter.js
@@ -26,7 +26,7 @@ import {getUserSettingsDefaults} from 'web/store/usersettings/defaults/selectors
import {loadUserSettingsDefaultFilter} from 'web/store/usersettings/defaultfilters/actions';
import {getUserSettingsDefaultFilter} from 'web/store/usersettings/defaultfilters/selectors';
-import useGmp from 'web/utils/useGmp';
+import useGmp from 'web/hooks/useGmp';
import useShallowEqualSelector from './useShallowEqualSelector';
diff --git a/src/web/pages/cves/details.jsx b/src/web/pages/cves/details.jsx
index df0d48f31d..dafde48567 100644
--- a/src/web/pages/cves/details.jsx
+++ b/src/web/pages/cves/details.jsx
@@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
import {_, _l} from 'gmp/locale/lang';
@@ -25,7 +24,7 @@ import TableData from 'web/components/table/data';
import TableRow from 'web/components/table/row';
import PropTypes from 'web/utils/proptypes';
-import useGmp from "web/utils/useGmp";
+import useGmp from 'web/hooks/useGmp';
const CVSS_PROPS = {
cvssAccessVector: _l('Access Vector'),
@@ -45,7 +44,7 @@ const CVSS_PROPS = {
cvssAvailabilityVS: _l('Vulnerable System Availability Impact'),
cvssConfidentialitySS: _l('Subsequent System Confidentiality Impact'),
cvssIntegritySS: _l('Subsequent System Integrity Impact'),
- cvssAvailabilitySS: _l('Subsequent System Availability Impact'),
+ cvssAvailabilitySS: _l('Subsequent System Availability Impact'),
};
const CveDetails = ({entity}) => {
diff --git a/src/web/pages/cves/row.jsx b/src/web/pages/cves/row.jsx
index 0305ed6d68..e820241956 100644
--- a/src/web/pages/cves/row.jsx
+++ b/src/web/pages/cves/row.jsx
@@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
import {_} from 'gmp/locale/lang';
@@ -25,8 +24,8 @@ import EntitiesActions from 'web/entities/actions';
import {RowDetailsToggle} from 'web/entities/row';
import PropTypes from 'web/utils/proptypes';
-import {isNumber} from "gmp/utils/identity";
-import useGmp from "web/utils/useGmp";
+import {isNumber} from 'gmp/utils/identity';
+import useGmp from 'web/hooks/useGmp';
const Row = ({
actionsComponent: ActionsComponent = EntitiesActions,
@@ -36,8 +35,8 @@ const Row = ({
...props
}) => {
const gmp = useGmp();
- const epssScore = entity?.epss?.score
- const epssPercentile = entity?.epss?.percentile
+ const epssScore = entity?.epss?.score;
+ const epssPercentile = entity?.epss?.percentile;
return (
@@ -60,20 +59,19 @@ const Row = ({
- {
- gmp.settings.enableEPSS &&
+ {gmp.settings.enableEPSS && (
<>
- {isNumber(epssScore) ? epssScore.toFixed(5) : _("N/A")}
+ {isNumber(epssScore) ? epssScore.toFixed(5) : _('N/A')}
- {isNumber(epssPercentile) ? epssPercentile.toFixed(5) : _("N/A")}
+ {isNumber(epssPercentile) ? epssPercentile.toFixed(5) : _('N/A')}
>
- }
+ )}
- )
+ );
};
Row.propTypes = {
diff --git a/src/web/pages/cves/table.jsx b/src/web/pages/cves/table.jsx
index 95e8306cc6..aa44580998 100644
--- a/src/web/pages/cves/table.jsx
+++ b/src/web/pages/cves/table.jsx
@@ -20,8 +20,8 @@ import TableRow from 'web/components/table/row';
import CveDetails from './details';
import CveRow from './row';
-import {isDefined} from "gmp/utils/identity.js";
-import useGmp from "web/utils/useGmp";
+import {isDefined} from 'gmp/utils/identity.js';
+import useGmp from 'web/hooks/useGmp';
const Header = ({
actionsColumn,
@@ -80,11 +80,9 @@ const Header = ({
onSortChange={onSortChange}
title={_('Severity')}
/>
- {gmp.settings.enableEPSS &&
-
- {_("EPSS")}
-
- }
+ {gmp.settings.enableEPSS && (
+ {_('EPSS')}
+ )}
{isDefined(actionsColumn) ? (
actionsColumn
) : (
@@ -93,8 +91,7 @@ const Header = ({
)}
- {
- gmp.settings.enableEPSS &&
+ {gmp.settings.enableEPSS && (
- }
+ )}
);
};
diff --git a/src/web/pages/extras/feedstatuspage.jsx b/src/web/pages/extras/feedstatuspage.jsx
index 5c1adacd47..985c28a0cc 100644
--- a/src/web/pages/extras/feedstatuspage.jsx
+++ b/src/web/pages/extras/feedstatuspage.jsx
@@ -50,7 +50,7 @@ import Reload, {
USE_DEFAULT_RELOAD_INTERVAL_ACTIVE,
} from 'web/components/loading/reload';
-import useGmp from 'web/utils/useGmp';
+import useGmp from 'web/hooks/useGmp';
import PropTypes from 'web/utils/proptypes';
const ToolBarIcons = () => (
diff --git a/src/web/pages/nvts/details.jsx b/src/web/pages/nvts/details.jsx
index 5f7e80511d..2a4ac1e8d8 100644
--- a/src/web/pages/nvts/details.jsx
+++ b/src/web/pages/nvts/details.jsx
@@ -12,7 +12,7 @@ import {isDefined, isNumber} from 'gmp/utils/identity';
import {TAG_NA} from 'gmp/models/nvt';
import PropTypes from 'web/utils/proptypes';
-import useGmp from "web/utils/useGmp";
+import useGmp from 'web/hooks/useGmp';
import {na, getTranslatableSeverityOrigin} from 'web/utils/render';
@@ -33,7 +33,7 @@ import TableRow from 'web/components/table/row';
import References from './references';
import Solution from './solution';
import Pre from './preformatted';
-import CveLink from "web/components/link/cvelink";
+import CveLink from 'web/components/link/cvelink';
const NvtDetails = ({entity, links = true}) => {
const {
@@ -99,7 +99,7 @@ const NvtDetails = ({entity, links = true}) => {
)}
- { gmp.settings.enableEPSS && isDefined(epss?.max_severity) &&
+ {gmp.settings.enableEPSS && isDefined(epss?.max_severity) && (
<>
{_('EPSS (CVE with highest severity)')}
@@ -108,14 +108,16 @@ const NvtDetails = ({entity, links = true}) => {
{_('EPSS Score')}
{isNumber(epss?.max_severity?.score)
- ? epss?.max_severity?.score.toFixed(5) : _("N/A")}
+ ? epss?.max_severity?.score.toFixed(5)
+ : _('N/A')}
{_('EPSS Percentile')}
{isNumber(epss?.max_severity?.percentile)
- ? epss?.max_severity?.percentile.toFixed(5) : _("N/A")}
+ ? epss?.max_severity?.percentile.toFixed(5)
+ : _('N/A')}
@@ -129,13 +131,16 @@ const NvtDetails = ({entity, links = true}) => {
{_('CVE Severity')}
>
- }
- { gmp.settings.enableEPSS && isDefined(epss?.max_epss) &&
+ )}
+ {gmp.settings.enableEPSS && isDefined(epss?.max_epss) && (
<>
{_('EPSS (highest EPSS score)')}
@@ -144,14 +149,16 @@ const NvtDetails = ({entity, links = true}) => {
{_('EPSS Score')}
{isNumber(epss?.max_epss?.score)
- ? epss?.max_epss?.score.toFixed(5) : _("N/A")}
+ ? epss?.max_epss?.score.toFixed(5)
+ : _('N/A')}
{_('EPSS Percentile')}
{isNumber(epss?.max_epss?.percentile)
- ? epss?.max_epss?.percentile.toFixed(5) : _("N/A")}
+ ? epss?.max_epss?.percentile.toFixed(5)
+ : _('N/A')}
@@ -166,13 +173,16 @@ const NvtDetails = ({entity, links = true}) => {
{_('CVE Severity')}
>
- }
+ )}
diff --git a/src/web/pages/nvts/row.jsx b/src/web/pages/nvts/row.jsx
index 13fb41c812..03c588b224 100644
--- a/src/web/pages/nvts/row.jsx
+++ b/src/web/pages/nvts/row.jsx
@@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
import Filter from 'gmp/models/filter.js';
@@ -30,8 +29,8 @@ import EntitiesActions from 'web/entities/actions';
import {RowDetailsToggle} from 'web/entities/row';
import PropTypes from 'web/utils/proptypes';
-import useGmp from "web/utils/useGmp";
-import {_} from "gmp/locale/lang.js";
+import useGmp from 'web/hooks/useGmp';
+import {_} from 'gmp/locale/lang.js';
const Row = ({
actionsComponent: ActionsComponent = EntitiesActions,
@@ -46,8 +45,8 @@ const Row = ({
const filter = Filter.fromString('family="' + entity.family + '"');
onFilterChanged(filter);
};
- const epssScore = entity?.epss?.max_severity?.score
- const epssPercentile = entity?.epss?.max_severity?.percentile
+ const epssScore = entity?.epss?.max_severity?.score;
+ const epssPercentile = entity?.epss?.max_severity?.percentile;
return (
@@ -94,17 +93,16 @@ const Row = ({
{entity.qod && }
- {
- gmp.settings.enableEPSS &&
+ {gmp.settings.enableEPSS && (
<>
- {isNumber(epssScore) ? epssScore.toFixed(5) : _("N/A")}
+ {isNumber(epssScore) ? epssScore.toFixed(5) : _('N/A')}
- {isNumber(epssPercentile) ? epssPercentile.toFixed(5) : _("N/A")}
+ {isNumber(epssPercentile) ? epssPercentile.toFixed(5) : _('N/A')}
>
- }
+ )}
);
diff --git a/src/web/pages/nvts/table.jsx b/src/web/pages/nvts/table.jsx
index e343e10bca..4b41f07f21 100644
--- a/src/web/pages/nvts/table.jsx
+++ b/src/web/pages/nvts/table.jsx
@@ -27,7 +27,7 @@ import TableRow from 'web/components/table/row';
import NvtDetails from './details';
import NvtRow from './row';
-import useGmp from "web/utils/useGmp";
+import useGmp from 'web/hooks/useGmp';
const Header = ({
actionsColumn,
@@ -115,16 +115,12 @@ const Header = ({
onSortChange={onSortChange}
title={_('QoD')}
/>
- {
- gmp.settings.enableEPSS &&
-
- {_("EPSS")}
-
- }
+ {gmp.settings.enableEPSS && (
+ {_('EPSS')}
+ )}
{actionsColumn}
- {
- gmp.settings.enableEPSS &&
+ {gmp.settings.enableEPSS && (
- }
-
+ )}
);
};
diff --git a/src/web/pages/portlists/listpage.jsx b/src/web/pages/portlists/listpage.jsx
index 65ac7964d7..8b0b6123df 100644
--- a/src/web/pages/portlists/listpage.jsx
+++ b/src/web/pages/portlists/listpage.jsx
@@ -14,7 +14,7 @@ import {isDefined, hasValue} from 'gmp/utils/identity';
import useCapabilities from 'web/hooks/useCapabilities';
import useUserSessionTimeout from 'web/hooks/useUserSessionTimeout';
-import useGmp from 'web/utils/useGmp';
+import useGmp from 'web/hooks/useGmp';
import usePageFilter from 'web/hooks/usePageFilter';
import useShallowEqualSelector from 'web/hooks/useShallowEqualSelector';
import useReload from 'web/hooks/useReload';
diff --git a/src/web/pages/scanners/detailspage.jsx b/src/web/pages/scanners/detailspage.jsx
index 1dd432c191..bdb06cc896 100644
--- a/src/web/pages/scanners/detailspage.jsx
+++ b/src/web/pages/scanners/detailspage.jsx
@@ -56,7 +56,7 @@ import PropTypes from 'web/utils/proptypes';
import ScannerComponent from './component';
import ScannerDetails from './details';
-import useGmp from 'web/utils/useGmp';
+import useGmp from 'web/hooks/useGmp';
const ToolBarIcons = ({
entity,
diff --git a/src/web/pages/scanners/listpage.jsx b/src/web/pages/scanners/listpage.jsx
index dd289e1275..944738c053 100644
--- a/src/web/pages/scanners/listpage.jsx
+++ b/src/web/pages/scanners/listpage.jsx
@@ -29,7 +29,7 @@ import {
selector as entitiesSelector,
} from 'web/store/entities/scanners';
-import useGmp from 'web/utils/useGmp';
+import useGmp from 'web/hooks/useGmp';
import ScannerComponent from './component';
import ScannersTable, {SORT_FIELDS} from './table';
diff --git a/src/web/pages/scanners/row.jsx b/src/web/pages/scanners/row.jsx
index 01cf5e7fa7..754c3c185a 100644
--- a/src/web/pages/scanners/row.jsx
+++ b/src/web/pages/scanners/row.jsx
@@ -34,7 +34,7 @@ import EditIcon from 'web/entity/icon/editicon';
import TrashIcon from 'web/entity/icon/trashicon';
import PropTypes from 'web/utils/proptypes';
-import useGmp from 'web/utils/useGmp';
+import useGmp from 'web/hooks/useGmp';
const Actions = withEntitiesActions(
({
From 97516f47dc76ff490b2357c8b3e65c2607802996 Mon Sep 17 00:00:00 2001
From: daniele-mng
Date: Mon, 24 Jun 2024 13:34:18 +0200
Subject: [PATCH 055/130] fix: dates inconsistencies in new task wizard and
schedules
---
src/gmp/commands/wizard.js | 2 +-
src/gmp/models/event.js | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/gmp/commands/wizard.js b/src/gmp/commands/wizard.js
index 8b18062e88..2943bfb577 100644
--- a/src/gmp/commands/wizard.js
+++ b/src/gmp/commands/wizard.js
@@ -178,7 +178,7 @@ class WizardCommand extends HttpCommand {
event_data_quick_task_fields,
);
- event_data['event_data:start_day'] = start_date.day();
+ event_data['event_data:start_day'] = start_date.date();
event_data['event_data:start_month'] = start_date.month() + 1;
event_data['event_data:start_year'] = start_date.year();
diff --git a/src/gmp/models/event.js b/src/gmp/models/event.js
index 3a1d814c9d..a413fcb494 100644
--- a/src/gmp/models/event.js
+++ b/src/gmp/models/event.js
@@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import ical from 'ical.js';
import {v4 as uuid} from 'uuid';
@@ -305,7 +304,8 @@ class Event {
}
get duration() {
- return createDuration({...this.event.duration});
+ const {weeks, ...durationWithoutWeeks} = this.event.duration;
+ return createDuration(durationWithoutWeeks);
}
get durationInSeconds() {
From 4253bc4783c6059562e757cbcbdab8fc28e8ad41 Mon Sep 17 00:00:00 2001
From: Greenbone Bot
Date: Tue, 25 Jun 2024 07:39:19 +0000
Subject: [PATCH 056/130] Automatic release to 23.1.0
---
package.json | 6 +++---
src/version.js | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/package.json b/package.json
index 5ec5eeab68..941c74e057 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "gsa",
- "version": "23.0.1-dev1",
+ "version": "23.1.0",
"description": "Greenbone Security Assistant",
"keywords": [
"openvas",
@@ -13,7 +13,7 @@
"type": "git",
"url": "https://github.com/greenbone/gsa/"
},
- "author": "Björn Ricks ",
+ "author": "Bj\u00f6rn Ricks ",
"license": "AGPL-3.0+",
"type": "module",
"scripts": {
@@ -116,4 +116,4 @@
"prettier --write"
]
}
-}
+}
\ No newline at end of file
diff --git a/src/version.js b/src/version.js
index 31c69c1e04..5de9645c65 100644
--- a/src/version.js
+++ b/src/version.js
@@ -15,7 +15,7 @@ const getMajorMinorVersion = () => {
return `${major}.${minor}`;
};
-export const VERSION = '23.0.1-dev1';
+export const VERSION = '23.1.0';
export const RELEASE_VERSION = getMajorMinorVersion();
From b6d060c6d9a65ae88fa0010bea774b10c483b477 Mon Sep 17 00:00:00 2001
From: Greenbone Bot
Date: Tue, 25 Jun 2024 07:39:21 +0000
Subject: [PATCH 057/130] Automatic adjustments after release [skip ci]
* Update to version 23.1.1-dev1
---
package.json | 2 +-
src/version.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/package.json b/package.json
index 941c74e057..718078bdec 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "gsa",
- "version": "23.1.0",
+ "version": "23.1.1-dev1",
"description": "Greenbone Security Assistant",
"keywords": [
"openvas",
diff --git a/src/version.js b/src/version.js
index 5de9645c65..f824b37b91 100644
--- a/src/version.js
+++ b/src/version.js
@@ -15,7 +15,7 @@ const getMajorMinorVersion = () => {
return `${major}.${minor}`;
};
-export const VERSION = '23.1.0';
+export const VERSION = '23.1.1-dev1';
export const RELEASE_VERSION = getMajorMinorVersion();
From 90ead61461092a47bd5dadceef1429378d03cf35 Mon Sep 17 00:00:00 2001
From: Ahmed Abdelsalam
Date: Thu, 27 Jun 2024 16:06:56 +0200
Subject: [PATCH 058/130] Fix: Allow applying report configs to delta reports.
---
src/web/pages/reports/deltadetailspage.jsx | 30 +++++++++++++++++++---
1 file changed, 27 insertions(+), 3 deletions(-)
diff --git a/src/web/pages/reports/deltadetailspage.jsx b/src/web/pages/reports/deltadetailspage.jsx
index e37ac172aa..1f2137ca61 100644
--- a/src/web/pages/reports/deltadetailspage.jsx
+++ b/src/web/pages/reports/deltadetailspage.jsx
@@ -12,7 +12,10 @@ import _ from 'gmp/locale';
import logger from 'gmp/log';
-import Filter, {RESET_FILTER, RESULTS_FILTER_FILTER} from 'gmp/models/filter';
+import Filter, {
+ ALL_FILTER,
+ RESET_FILTER,
+ RESULTS_FILTER_FILTER} from 'gmp/models/filter';
import {isActive} from 'gmp/models/task';
import {first} from 'gmp/utils/array';
@@ -34,6 +37,11 @@ import {
selector as filterSelector,
} from 'web/store/entities/filters';
+import {
+ loadAllEntities as loadReportConfigs,
+ selector as reportConfigsSelector,
+} from 'web/store/entities/reportconfigs';
+
import {
loadAllEntities as loadReportFormats,
selector as reportFormatsSelector,
@@ -168,6 +176,7 @@ class DeltaReportDetails extends React.Component {
componentDidMount() {
this.props.loadSettings();
this.props.loadFilters();
+ this.props.loadReportConfigs();
this.props.loadReportFormats();
this.props.loadReportComposerDefaults();
}
@@ -307,8 +316,13 @@ class DeltaReportDetails extends React.Component {
username,
onDownload,
} = this.props;
- const {includeNotes, includeOverrides, reportFormatId, storeAsDefault} =
- state;
+ const {
+ includeNotes,
+ includeOverrides,
+ reportConfigId,
+ reportFormatId,
+ storeAsDefault
+ } = state;
const newFilter = reportFilter.copy();
newFilter.set('notes', includeNotes);
@@ -317,6 +331,7 @@ class DeltaReportDetails extends React.Component {
if (storeAsDefault) {
const defaults = {
...reportComposerDefaults,
+ defaultReportConfigId: reportConfigId,
defaultReportFormatId: reportFormatId,
includeNotes,
includeOverrides,
@@ -336,6 +351,7 @@ class DeltaReportDetails extends React.Component {
return gmp.report
.download(entity, {
+ reportConfigId,
reportFormatId,
deltaReportId,
filter: newFilter,
@@ -457,6 +473,7 @@ class DeltaReportDetails extends React.Component {
isLoading,
reportFilter,
reportFormats,
+ reportConfigs,
reportId,
onInteraction,
reportComposerDefaults,
@@ -530,11 +547,13 @@ class DeltaReportDetails extends React.Component {
)}
{showDownloadReportDialog && (
{
loadFilters: () => dispatch(loadFilters(gmp)(RESULTS_FILTER_FILTER)),
loadSettings: () => dispatch(loadUserSettingDefaults(gmp)()),
loadTarget: targetId => gmp.target.get({id: targetId}),
+ loadReportConfigs: () => dispatch(loadReportConfigs(gmp)(ALL_FILTER)),
loadReportFormats: () =>
dispatch(loadReportFormats(gmp)(REPORT_FORMATS_FILTER)),
loadReport: (id, deltaId, filter) =>
@@ -605,6 +627,7 @@ const mapStateToProps = (rootState, {match}) => {
const filterSel = filterSelector(rootState);
const deltaSel = deltaReportSelector(rootState);
const reportFormatsSel = reportFormatsSelector(rootState);
+ const reportConfigsSel = reportConfigsSelector(rootState);
const userDefaultsSelector = getUserSettingsDefaults(rootState);
const userDefaultFilterSel = getUserSettingsDefaultFilter(
rootState,
@@ -624,6 +647,7 @@ const mapStateToProps = (rootState, {match}) => {
'reportexportfilename',
),
reportFilter: getFilter(entity),
+ reportConfigs: reportConfigsSel.getAllEntities(ALL_FILTER),
reportFormats: reportFormatsSel.getAllEntities(REPORT_FORMATS_FILTER),
reportId: id,
reportComposerDefaults: getReportComposerDefaults(rootState),
From f7ef59714db9351bc638a8c72d74c58a630fd648 Mon Sep 17 00:00:00 2001
From: Greenbone Bot
Date: Fri, 28 Jun 2024 07:34:56 +0000
Subject: [PATCH 059/130] Automatic release to 23.1.1
---
package.json | 2 +-
src/version.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/package.json b/package.json
index 718078bdec..e7820f7d09 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "gsa",
- "version": "23.1.1-dev1",
+ "version": "23.1.1",
"description": "Greenbone Security Assistant",
"keywords": [
"openvas",
diff --git a/src/version.js b/src/version.js
index f824b37b91..80eb3c42ab 100644
--- a/src/version.js
+++ b/src/version.js
@@ -15,7 +15,7 @@ const getMajorMinorVersion = () => {
return `${major}.${minor}`;
};
-export const VERSION = '23.1.1-dev1';
+export const VERSION = '23.1.1';
export const RELEASE_VERSION = getMajorMinorVersion();
From 27b5a40ff8bc5c1a8207cce2cb9d64d9d65cb0af Mon Sep 17 00:00:00 2001
From: Greenbone Bot
Date: Fri, 28 Jun 2024 07:34:57 +0000
Subject: [PATCH 060/130] Automatic adjustments after release [skip ci]
* Update to version 23.1.2-dev1
---
package.json | 2 +-
src/version.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/package.json b/package.json
index e7820f7d09..3d35ccacac 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "gsa",
- "version": "23.1.1",
+ "version": "23.1.2-dev1",
"description": "Greenbone Security Assistant",
"keywords": [
"openvas",
diff --git a/src/version.js b/src/version.js
index 80eb3c42ab..2240a415f6 100644
--- a/src/version.js
+++ b/src/version.js
@@ -15,7 +15,7 @@ const getMajorMinorVersion = () => {
return `${major}.${minor}`;
};
-export const VERSION = '23.1.1';
+export const VERSION = '23.1.2-dev1';
export const RELEASE_VERSION = getMajorMinorVersion();
From d6f5a75cf7c3d60da6286ae664c2d6cf3ddbdda3 Mon Sep 17 00:00:00 2001
From: Ahmed Abdelsalam
Date: Fri, 28 Jun 2024 10:31:07 +0200
Subject: [PATCH 061/130] Change: Update node version for build in
release-pontos
---
.github/workflows/release-pontos.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/release-pontos.yml b/.github/workflows/release-pontos.yml
index de5769160f..8bdfc59b2c 100644
--- a/.github/workflows/release-pontos.yml
+++ b/.github/workflows/release-pontos.yml
@@ -66,7 +66,7 @@ jobs:
- name: Set up node
uses: actions/setup-node@v4
with:
- node-version: "14"
+ node-version: "18"
cache: "npm"
- name: Install npm dependencies
run: npm install
From 096dbd6f6c983ab23a8ab473460c531d58e872c9 Mon Sep 17 00:00:00 2001
From: Greenbone Bot
Date: Fri, 28 Jun 2024 08:51:44 +0000
Subject: [PATCH 062/130] Automatic release to 23.1.1
---
package.json | 2 +-
src/version.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/package.json b/package.json
index 3d35ccacac..e7820f7d09 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "gsa",
- "version": "23.1.2-dev1",
+ "version": "23.1.1",
"description": "Greenbone Security Assistant",
"keywords": [
"openvas",
diff --git a/src/version.js b/src/version.js
index 2240a415f6..80eb3c42ab 100644
--- a/src/version.js
+++ b/src/version.js
@@ -15,7 +15,7 @@ const getMajorMinorVersion = () => {
return `${major}.${minor}`;
};
-export const VERSION = '23.1.2-dev1';
+export const VERSION = '23.1.1';
export const RELEASE_VERSION = getMajorMinorVersion();
From 39b96ab5d1fd422a28a1be6c05dde53687516ca1 Mon Sep 17 00:00:00 2001
From: Greenbone Bot
Date: Fri, 28 Jun 2024 08:51:46 +0000
Subject: [PATCH 063/130] Automatic adjustments after release [skip ci]
* Update to version 23.1.2-dev1
---
package.json | 2 +-
src/version.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/package.json b/package.json
index e7820f7d09..3d35ccacac 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "gsa",
- "version": "23.1.1",
+ "version": "23.1.2-dev1",
"description": "Greenbone Security Assistant",
"keywords": [
"openvas",
diff --git a/src/version.js b/src/version.js
index 80eb3c42ab..2240a415f6 100644
--- a/src/version.js
+++ b/src/version.js
@@ -15,7 +15,7 @@ const getMajorMinorVersion = () => {
return `${major}.${minor}`;
};
-export const VERSION = '23.1.1';
+export const VERSION = '23.1.2-dev1';
export const RELEASE_VERSION = getMajorMinorVersion();
From 01d697574e0a616535c0644a173055278205df58 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 28 Jun 2024 10:13:48 +0000
Subject: [PATCH 064/130] Deps: Bump docker/build-push-action from 5 to 6
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 5 to 6.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v5...v6)
---
updated-dependencies:
- dependency-name: docker/build-push-action
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
.github/workflows/container.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml
index f512201516..f3249381dd 100644
--- a/.github/workflows/container.yml
+++ b/.github/workflows/container.yml
@@ -85,7 +85,7 @@ jobs:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and push Container image
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: .
push: true
From 639ce97cd64a28c45df4f868cd28bc56cad82de2 Mon Sep 17 00:00:00 2001
From: pascalholthaus <94793111+pascalholthaus@users.noreply.github.com>
Date: Wed, 3 Jul 2024 09:10:00 +0200
Subject: [PATCH 065/130] Add: Push workflow for greenbone registry #4075
---
.docker/prod.Dockerfile | 2 +-
.github/workflows/push.yml | 26 ++++++++++++++++++++++++++
2 files changed, 27 insertions(+), 1 deletion(-)
create mode 100644 .github/workflows/push.yml
diff --git a/.docker/prod.Dockerfile b/.docker/prod.Dockerfile
index c3aa4826e3..6d7df41079 100644
--- a/.docker/prod.Dockerfile
+++ b/.docker/prod.Dockerfile
@@ -1,7 +1,7 @@
ARG VERSION=stable
ARG DEBIAN_FRONTEND=noninteractive
-FROM --platform=linux/amd64 debian:stable-slim as builder
+FROM debian:stable-slim as builder
ENV NODE_VERSION=node_18.x
ENV NODE_KEYRING=/usr/share/keyrings/nodesource.gpg
diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml
new file mode 100644
index 0000000000..0c27150a3e
--- /dev/null
+++ b/.github/workflows/push.yml
@@ -0,0 +1,26 @@
+name: Build and Push to Greenbone Registry
+
+on:
+ push:
+ branches: [ main ]
+ tags: ["v*"]
+ pull_request:
+ branches: [ main ]
+ workflow_dispatch:
+ inputs:
+ ref-name:
+ type: string
+ description: "The ref to build a container image from. For example a tag v23.0.0."
+ required: true
+
+jobs:
+ build:
+ name: Build and Push to Greenbone Registry
+ uses: greenbone/workflows/.github/workflows/container-build-push-2nd-gen.yml@main
+ with:
+ image-url: community/gsa
+ image-labels: |
+ org.opencontainers.image.vendor=Greenbone
+ org.opencontainers.image.base.name=greenbone/gsad
+ ref-name: ${{ inputs.ref-name }}
+ secrets: inherit
From 653acd334a779330d1cced93bbfeb5546abd1934 Mon Sep 17 00:00:00 2001
From: Timo Pollmeier
Date: Fri, 21 Jun 2024 10:47:11 +0200
Subject: [PATCH 066/130] Remove debug statement
---
src/web/pages/results/row.jsx | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/web/pages/results/row.jsx b/src/web/pages/results/row.jsx
index 6b61a0d8c9..dbd9cd2281 100644
--- a/src/web/pages/results/row.jsx
+++ b/src/web/pages/results/row.jsx
@@ -64,7 +64,6 @@ const Row = ({
const epssScore = entity?.information?.epss?.max_severity?.score
const epssPercentile = entity?.information?.epss?.max_severity?.percentile
const gmp = useGmp()
- console.debug(entity?.information)
return (
{delta && (
From 821926daf86478f1a22553a68b7e0b425c5e2730 Mon Sep 17 00:00:00 2001
From: Timo Pollmeier
Date: Wed, 3 Jul 2024 10:31:21 +0200
Subject: [PATCH 067/130] Update useGmp import in results table and row
---
src/web/pages/results/row.jsx | 2 +-
src/web/pages/results/table.jsx | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/web/pages/results/row.jsx b/src/web/pages/results/row.jsx
index dbd9cd2281..addef1f093 100644
--- a/src/web/pages/results/row.jsx
+++ b/src/web/pages/results/row.jsx
@@ -38,7 +38,7 @@ import EntitiesActions from 'web/entities/actions';
import PropTypes from 'web/utils/proptypes';
import ResultDelta from './delta';
-import useGmp from "web/utils/useGmp";
+import useGmp from "web/hooks/useGmp";
const Row = ({
actionsComponent: ActionsComponent = EntitiesActions,
diff --git a/src/web/pages/results/table.jsx b/src/web/pages/results/table.jsx
index 117f26cc98..30e4344b04 100644
--- a/src/web/pages/results/table.jsx
+++ b/src/web/pages/results/table.jsx
@@ -26,7 +26,7 @@ import TableRow from 'web/components/table/row';
import ResultsRow from './row';
import ResultDetails from './details';
-import useGmp from "web/utils/useGmp";
+import useGmp from "web/hooks/useGmp";
const Header = ({
actionsColumn,
From c055f6545872cb322bfa9aea29d7f4dffefa0071 Mon Sep 17 00:00:00 2001
From: Timo Pollmeier
Date: Mon, 1 Jul 2024 12:59:10 +0200
Subject: [PATCH 068/130] Add: Available optional features in Capabilities
The Capabilities object now has a featureEnabled method that checks if
an optional feature is enabled according to the new GET_FEATURES GMP
command.
This will allow toggling/modifying UI elements for these features
without a redundant setting in the GSA config.
---
.../capabilities/__tests__/capabilities.js | 13 +++++
src/gmp/capabilities/capabilities.js | 21 ++++++-
src/gmp/commands/__tests__/user.js | 55 +++++++++++++++++++
src/gmp/commands/users.js | 3 +-
4 files changed, 88 insertions(+), 4 deletions(-)
diff --git a/src/gmp/capabilities/__tests__/capabilities.js b/src/gmp/capabilities/__tests__/capabilities.js
index 835994a957..ee6ad31798 100644
--- a/src/gmp/capabilities/__tests__/capabilities.js
+++ b/src/gmp/capabilities/__tests__/capabilities.js
@@ -215,6 +215,19 @@ describe('Capabilities tests', () => {
}
expect(i).toEqual(4);
});
+
+ test('should handle features', () => {
+ const featureList = [
+ {name: 'ENABLED_FEATURE_1', _enabled: 1},
+ {name: 'DISABLED_FEATURE', _enabled: 0},
+ {name: 'ENABLED_FEATURE_2', _enabled: 1},
+ ];
+ const caps = new Capabilities(['everything'], featureList);
+ expect(caps.featureEnabled('ENABLED_FEATURE_1')).toBe(true);
+ expect(caps.featureEnabled('DISABLED_FEATURE')).toBe(false);
+ expect(caps.featureEnabled('enabled_feature_2')).toBe(true);
+ expect(caps.featureEnabled('UNDEFINED_FEATURE')).toBe(false);
+ });
});
// vim: set ts=2 sw=2 tw=80:
diff --git a/src/gmp/capabilities/capabilities.js b/src/gmp/capabilities/capabilities.js
index e65a1832b2..6b4cf4f760 100644
--- a/src/gmp/capabilities/capabilities.js
+++ b/src/gmp/capabilities/capabilities.js
@@ -3,10 +3,10 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import {isDefined} from 'gmp/utils/identity';
-import {map} from 'gmp/utils/array';
+import {forEach, map} from 'gmp/utils/array';
import {pluralizeType} from 'gmp/utils/entitytype';
+import {parseBoolean} from 'gmp/parser';
const types = {
audit: 'task',
@@ -51,16 +51,27 @@ const convertType = type => {
};
class Capabilities {
- constructor(cap_names) {
+ constructor(cap_names, featuresList) {
this._has_caps = isDefined(cap_names);
+ this._has_features = isDefined(featuresList);
let caps;
+ let featuresEnabled = {};
if (this._has_caps) {
caps = map(cap_names, name => name.toLowerCase());
}
+ if (this._has_features) {
+ forEach(featuresList, feature => {
+ featuresEnabled[feature.name.toUpperCase()] = parseBoolean(
+ feature._enabled,
+ );
+ });
+ }
+
this._capabilities = new Set(caps);
+ this._featuresEnabled = featuresEnabled;
}
[Symbol.iterator]() {
@@ -102,6 +113,10 @@ class Capabilities {
get length() {
return this._capabilities.size;
}
+
+ featureEnabled(feature) {
+ return this._featuresEnabled[feature.toUpperCase()] == true;
+ }
}
export default Capabilities;
diff --git a/src/gmp/commands/__tests__/user.js b/src/gmp/commands/__tests__/user.js
index 17fe9d1ec9..e86f86df5d 100644
--- a/src/gmp/commands/__tests__/user.js
+++ b/src/gmp/commands/__tests__/user.js
@@ -121,3 +121,58 @@ describe('UserCommand transformSettingName() function tests', () => {
expect(transformSettingName(str4)).toEqual('foobar');
});
});
+
+describe('UserCommand capabilities tests', () => {
+ test('should get capabilities', () => {
+ const response = createResponse({
+ get_capabilities: {
+ help_response: {
+ schema: {
+ command: [
+ {
+ name: 'get_reports',
+ },
+ {
+ name: 'get_tasks',
+ },
+ ],
+ },
+ },
+ get_features_response: {
+ feature: [
+ {
+ _enabled: 1,
+ name: 'TEST_FEATURE_1',
+ },
+ {
+ _enabled: 1,
+ name: 'TEST_FEATURE_2',
+ },
+ ],
+ },
+ },
+ });
+ const fakeHttp = createHttp(response);
+ const cmd = new UserCommand(fakeHttp);
+
+ cmd.currentCapabilities().then(resp => {
+ const {data: caps} = resp;
+
+ expect(fakeHttp.request).toHaveBeenCalledWith('get', {
+ args: {
+ cmd: 'get_capabilities',
+ },
+ });
+
+ expect(caps._has_caps).toBe(true);
+ expect(caps.mayAccess('report')).toBe(true);
+ expect(caps.mayAccess('task')).toBe(true);
+ expect(caps.mayAccess('user')).toBe(false);
+
+ expect(caps._has_features).toBe(true);
+ expect(caps.featureEnabled('test_feature_1')).toBe(true);
+ expect(caps.featureEnabled('TEST_FEATURE_2')).toBe(true);
+ expect(caps.featureEnabled('TEST_FEATURE_3')).toBe(false);
+ });
+ });
+});
diff --git a/src/gmp/commands/users.js b/src/gmp/commands/users.js
index 65dcc9ab98..c94c4077e7 100644
--- a/src/gmp/commands/users.js
+++ b/src/gmp/commands/users.js
@@ -162,8 +162,9 @@ export class UserCommand extends EntityCommand {
).then(response => {
const {data} = response;
const {command: commands} = data.get_capabilities.help_response.schema;
+ const featuresList = data.get_capabilities.get_features_response.feature;
const caps = map(commands, command => command.name);
- return response.setData(new Capabilities(caps));
+ return response.setData(new Capabilities(caps, featuresList));
});
}
From 38357698cffdfe7439b40993959863dc2961bc92 Mon Sep 17 00:00:00 2001
From: Timo Pollmeier
Date: Mon, 1 Jul 2024 15:45:20 +0200
Subject: [PATCH 069/130] Use camelCase for capabilities, update exceptions
Attributes in Capabilities now use camelCase and exceptions for
snake_case in the GMP responses have been added.
---
allowedSnakeCase.cjs | 4 +++-
src/gmp/capabilities/capabilities.js | 10 +++++-----
src/gmp/commands/__tests__/user.js | 4 ++--
3 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/allowedSnakeCase.cjs b/allowedSnakeCase.cjs
index 2ba2448ee2..b257daf6f7 100644
--- a/allowedSnakeCase.cjs
+++ b/allowedSnakeCase.cjs
@@ -206,8 +206,10 @@ module.exports = [
'general_permissions',
'get_aggregate',
'get_aggregates_response',
+ 'get_capabilities',
'get_config_family_response',
'get_config_nvt_response',
+ 'get_features_response',
'get_feeds',
'get_feeds_response',
'get_identifier',
@@ -236,13 +238,13 @@ module.exports = [
'groups_data',
'gsad_response',
'has_av_duration',
- '_has_caps',
'has_detection',
'has_duration',
'has_reference',
'has_selected',
'has_severity_filter',
'header_title',
+ 'help_response',
'highest_severity',
'high_per_host',
'host_allow',
diff --git a/src/gmp/capabilities/capabilities.js b/src/gmp/capabilities/capabilities.js
index 6b4cf4f760..f8baa0e991 100644
--- a/src/gmp/capabilities/capabilities.js
+++ b/src/gmp/capabilities/capabilities.js
@@ -52,17 +52,17 @@ const convertType = type => {
class Capabilities {
constructor(cap_names, featuresList) {
- this._has_caps = isDefined(cap_names);
- this._has_features = isDefined(featuresList);
+ this._hasCaps = isDefined(cap_names);
+ this._hasFeatures = isDefined(featuresList);
let caps;
let featuresEnabled = {};
- if (this._has_caps) {
+ if (this._hasCaps) {
caps = map(cap_names, name => name.toLowerCase());
}
- if (this._has_features) {
+ if (this._hasFeatures) {
forEach(featuresList, feature => {
featuresEnabled[feature.name.toUpperCase()] = parseBoolean(
feature._enabled,
@@ -79,7 +79,7 @@ class Capabilities {
}
areDefined() {
- return this._has_caps;
+ return this._hasCaps;
}
has(name) {
diff --git a/src/gmp/commands/__tests__/user.js b/src/gmp/commands/__tests__/user.js
index e86f86df5d..fe39552f46 100644
--- a/src/gmp/commands/__tests__/user.js
+++ b/src/gmp/commands/__tests__/user.js
@@ -164,12 +164,12 @@ describe('UserCommand capabilities tests', () => {
},
});
- expect(caps._has_caps).toBe(true);
+ expect(caps._hasCaps).toBe(true);
expect(caps.mayAccess('report')).toBe(true);
expect(caps.mayAccess('task')).toBe(true);
expect(caps.mayAccess('user')).toBe(false);
- expect(caps._has_features).toBe(true);
+ expect(caps._hasFeatures).toBe(true);
expect(caps.featureEnabled('test_feature_1')).toBe(true);
expect(caps.featureEnabled('TEST_FEATURE_2')).toBe(true);
expect(caps.featureEnabled('TEST_FEATURE_3')).toBe(false);
From 065b11209563024c2216ca80893e19a96ed11659 Mon Sep 17 00:00:00 2001
From: daniele-mng
Date: Tue, 9 Jul 2024 11:38:03 +0200
Subject: [PATCH 070/130] Add: conditional route component for feature flag
---
.../conditionalRoute/ConditionalRoute.jsx | 29 +++++++++++++++++++
1 file changed, 29 insertions(+)
create mode 100644 src/web/components/conditionalRoute/ConditionalRoute.jsx
diff --git a/src/web/components/conditionalRoute/ConditionalRoute.jsx b/src/web/components/conditionalRoute/ConditionalRoute.jsx
new file mode 100644
index 0000000000..02524e712f
--- /dev/null
+++ b/src/web/components/conditionalRoute/ConditionalRoute.jsx
@@ -0,0 +1,29 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import PropTypes from 'prop-types';
+
+import {Route, Redirect} from 'react-router-dom';
+import useCapabilities from 'web/hooks/useCapabilities';
+
+const ConditionalRoute = ({component: Component, feature, ...rest}) => {
+ const capabilities = useCapabilities();
+ const isEnabled = capabilities._featuresEnabled[feature];
+ return (
+
+ isEnabled ? :
+ }
+ {...rest}
+ />
+ );
+};
+
+ConditionalRoute.propTypes = {
+ component: PropTypes.elementType.isRequired,
+ feature: PropTypes.string.isRequired,
+};
+
+export default ConditionalRoute;
From 18a2ac289f3fea508ea7c04c3c19e9731970e85c Mon Sep 17 00:00:00 2001
From: daniele-mng
Date: Tue, 9 Jul 2024 14:06:54 +0200
Subject: [PATCH 071/130] add test
---
.../__tests__/ConditionalRoute.jsx | 47 +++++++++++++++++++
1 file changed, 47 insertions(+)
create mode 100644 src/web/components/conditionalRoute/__tests__/ConditionalRoute.jsx
diff --git a/src/web/components/conditionalRoute/__tests__/ConditionalRoute.jsx b/src/web/components/conditionalRoute/__tests__/ConditionalRoute.jsx
new file mode 100644
index 0000000000..a88608e852
--- /dev/null
+++ b/src/web/components/conditionalRoute/__tests__/ConditionalRoute.jsx
@@ -0,0 +1,47 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {describe, test, expect} from '@gsa/testing';
+import {screen, rendererWith} from 'web/utils/testing';
+import {Route, MemoryRouter} from 'react-router-dom';
+import ConditionalRoute from 'web/components/conditionalRoute/ConditionalRoute';
+import Capabilities from 'gmp/capabilities/capabilities';
+
+const MockComponent = () => Mock Component
;
+
+describe('ConditionalRoute', () => {
+ const featureList = [
+ {name: 'ENABLED_FEATURE', _enabled: 1},
+ {name: 'DISABLED_FEATURE', _enabled: 0},
+ ];
+ const capabilities = new Capabilities(['everything'], featureList);
+ const {render} = rendererWith({capabilities, router: true});
+ test.each([
+ {
+ feature: 'ENABLED_FEATURE',
+ expectedText: 'Mock Component',
+ description: 'renders the component when the feature is enabled',
+ },
+ {
+ feature: 'DISABLED_FEATURE',
+ expectedText: 'Not Found',
+ description: 'redirects when the feature is disabled',
+ },
+ {
+ feature: 'unknown-feature',
+ expectedText: 'Not Found',
+ description: 'does not render the component for an unknown feature',
+ },
+ ])('$description', ({feature, expectedText}) => {
+ render(
+
+
+ Not Found
} />
+ ,
+ );
+
+ expect(screen.getByText(expectedText)).toBeVisible();
+ });
+});
From fc4198a87ec6703169996bf40788795384e32fd2 Mon Sep 17 00:00:00 2001
From: daniele-mng
Date: Tue, 9 Jul 2024 15:26:15 +0200
Subject: [PATCH 072/130] Update ConditionalRoute.jsx
---
src/web/components/conditionalRoute/ConditionalRoute.jsx | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/web/components/conditionalRoute/ConditionalRoute.jsx b/src/web/components/conditionalRoute/ConditionalRoute.jsx
index 02524e712f..97323b30fc 100644
--- a/src/web/components/conditionalRoute/ConditionalRoute.jsx
+++ b/src/web/components/conditionalRoute/ConditionalRoute.jsx
@@ -10,7 +10,8 @@ import useCapabilities from 'web/hooks/useCapabilities';
const ConditionalRoute = ({component: Component, feature, ...rest}) => {
const capabilities = useCapabilities();
- const isEnabled = capabilities._featuresEnabled[feature];
+ const isEnabled = capabilities.featureEnabled(feature);
+
return (
From 952ec5fd93701c40e169809bce5090239b1a19cf Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 11 Jul 2024 10:43:55 +0200
Subject: [PATCH 073/130] Deps: Bump @testing-library/react from 15.0.6 to
16.0.0 (#4091)
Bumps [@testing-library/react](https://github.com/testing-library/react-testing-library) from 15.0.6 to 16.0.0.
- [Release notes](https://github.com/testing-library/react-testing-library/releases)
- [Changelog](https://github.com/testing-library/react-testing-library/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/react-testing-library/compare/v15.0.6...v16.0.0)
---
updated-dependencies:
- dependency-name: "@testing-library/react"
dependency-type: direct:development
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: daniele-mng
---
package-lock.json | 34 ++++++++++++++++++++++------------
package.json | 2 +-
2 files changed, 23 insertions(+), 13 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 1d93bd048f..2473a92e4c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "gsa",
- "version": "23.0.1-dev1",
+ "version": "23.1.2-dev1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "gsa",
- "version": "23.0.1-dev1",
+ "version": "23.1.2-dev1",
"license": "AGPL-3.0+",
"dependencies": {
"@reduxjs/toolkit": "^2.2.5",
@@ -54,7 +54,7 @@
"@babel/cli": "^7.24.6",
"@pandatix/js-cvss": "^0.4.4",
"@testing-library/jest-dom": "^6.4.5",
- "@testing-library/react": "^15.0.6",
+ "@testing-library/react": "^16.0.0",
"@testing-library/user-event": "^13.5.0",
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
@@ -4000,6 +4000,7 @@
"resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.0.0.tgz",
"integrity": "sha512-PmJPnogldqoVFf+EwbHvbBJ98MmqASV8kLrBYgsDNxQcFMeIS7JFL48sfyXvuMtgmWO/wMhh25odr+8VhDmn4g==",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/code-frame": "^7.10.4",
"@babel/runtime": "^7.12.5",
@@ -4079,26 +4080,29 @@
"dev": true
},
"node_modules/@testing-library/react": {
- "version": "15.0.6",
- "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-15.0.6.tgz",
- "integrity": "sha512-UlbazRtEpQClFOiYp+1BapMT+xyqWMnE+hh9tn5DQ6gmlE7AIZWcGpzZukmDZuFk3By01oiqOf8lRedLS4k6xQ==",
+ "version": "16.0.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.0.tgz",
+ "integrity": "sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==",
"dev": true,
"dependencies": {
- "@babel/runtime": "^7.12.5",
- "@testing-library/dom": "^10.0.0",
- "@types/react-dom": "^18.0.0"
+ "@babel/runtime": "^7.12.5"
},
"engines": {
"node": ">=18"
},
"peerDependencies": {
+ "@testing-library/dom": "^10.0.0",
"@types/react": "^18.0.0",
+ "@types/react-dom": "^18.0.0",
"react": "^18.0.0",
"react-dom": "^18.0.0"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
}
}
},
@@ -4133,7 +4137,8 @@
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
"integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/@types/babel__core": {
"version": "7.20.5",
@@ -6779,7 +6784,8 @@
"version": "0.5.16",
"resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz",
"integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/domexception": {
"version": "4.0.0",
@@ -10640,6 +10646,7 @@
"resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz",
"integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==",
"dev": true,
+ "peer": true,
"bin": {
"lz-string": "bin/bin.js"
}
@@ -11505,6 +11512,7 @@
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
"integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"ansi-regex": "^5.0.1",
"ansi-styles": "^5.0.0",
@@ -11519,6 +11527,7 @@
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
"integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=10"
},
@@ -11530,7 +11539,8 @@
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/prompts": {
"version": "2.4.2",
diff --git a/package.json b/package.json
index 3d35ccacac..3965908923 100644
--- a/package.json
+++ b/package.json
@@ -77,7 +77,7 @@
"@babel/cli": "^7.24.6",
"@pandatix/js-cvss": "^0.4.4",
"@testing-library/jest-dom": "^6.4.5",
- "@testing-library/react": "^15.0.6",
+ "@testing-library/react": "^16.0.0",
"@testing-library/user-event": "^13.5.0",
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
From fa3e091c5b3b2c3157bfadaf3e059549ead39dd2 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 11 Jul 2024 11:22:38 +0200
Subject: [PATCH 074/130] Deps: Bump uuid from 9.0.1 to 10.0.0 (#4086)
Bumps [uuid](https://github.com/uuidjs/uuid) from 9.0.1 to 10.0.0.
- [Changelog](https://github.com/uuidjs/uuid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/uuidjs/uuid/compare/v9.0.1...v10.0.0)
---
updated-dependencies:
- dependency-name: uuid
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: daniele-mng
---
package-lock.json | 8 ++++----
package.json | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 2473a92e4c..8cda2cba3e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -47,7 +47,7 @@
"redux": "^5.0.1",
"redux-logger": "^3.0.6",
"styled-components": "^6.1.11",
- "uuid": "^9.0.1",
+ "uuid": "^10.0.0",
"whatwg-fetch": "^3.6.20"
},
"devDependencies": {
@@ -13395,9 +13395,9 @@
}
},
"node_modules/uuid": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
- "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
+ "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
diff --git a/package.json b/package.json
index 3965908923..87a3c44468 100644
--- a/package.json
+++ b/package.json
@@ -70,7 +70,7 @@
"redux": "^5.0.1",
"redux-logger": "^3.0.6",
"styled-components": "^6.1.11",
- "uuid": "^9.0.1",
+ "uuid": "^10.0.0",
"whatwg-fetch": "^3.6.20"
},
"devDependencies": {
From 67c721346deb1f5a7f045a99faa1317f18048872 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 11 Jul 2024 12:07:04 +0200
Subject: [PATCH 075/130] Deps: Bump @sentry/react from 8.7.0 to 8.13.0 (#4089)
Bumps [@sentry/react](https://github.com/getsentry/sentry-javascript) from 8.7.0 to 8.13.0.
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.7.0...8.13.0)
---
updated-dependencies:
- dependency-name: "@sentry/react"
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: daniele-mng
---
package-lock.json | 114 +++++++++++++++++++++++-----------------------
package.json | 2 +-
2 files changed, 58 insertions(+), 58 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 8cda2cba3e..bedeb63724 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,7 +10,7 @@
"license": "AGPL-3.0+",
"dependencies": {
"@reduxjs/toolkit": "^2.2.5",
- "@sentry/react": "^8.7.0",
+ "@sentry/react": "^8.13.0",
"@visx/axis": "^3.10.1",
"@visx/gradient": "^3.3.0",
"@visx/shape": "^3.5.0",
@@ -3635,97 +3635,97 @@
]
},
"node_modules/@sentry-internal/browser-utils": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.7.0.tgz",
- "integrity": "sha512-RFBK1sYBwV5qGMEwWF0rjOTqQpp4/SvE+qHkOJNRUTVYmfjM+Y9lcxwn4B6lu3aboxePpBw/i1PlP6XwX4UnGA==",
+ "version": "8.13.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.13.0.tgz",
+ "integrity": "sha512-lqq8BYbbs9KTlDuyB5NjdZB6P/llqQs32KUgaCQ/k5DFB4Zf56+BFHXObnMHxwx375X1uixtnEphagWZa+nsLQ==",
"dependencies": {
- "@sentry/core": "8.7.0",
- "@sentry/types": "8.7.0",
- "@sentry/utils": "8.7.0"
+ "@sentry/core": "8.13.0",
+ "@sentry/types": "8.13.0",
+ "@sentry/utils": "8.13.0"
},
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry-internal/feedback": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.7.0.tgz",
- "integrity": "sha512-qcGtWCtRB4eP7NVQoxW936oPkU4qu9otMLYELPGmOJPnuAG0lujlJXW7BucaM7ADyJgJTE75hG849bHecfnbmQ==",
+ "version": "8.13.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.13.0.tgz",
+ "integrity": "sha512-YyJ6SzpTonixvguAg0H9vkEp7Jq8ZeVY8M4n47ClR0+TtaAUp04ZhcJpHKF7PwBIAzc7DRr2XP112tmWgiVEcg==",
"dependencies": {
- "@sentry/core": "8.7.0",
- "@sentry/types": "8.7.0",
- "@sentry/utils": "8.7.0"
+ "@sentry/core": "8.13.0",
+ "@sentry/types": "8.13.0",
+ "@sentry/utils": "8.13.0"
},
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry-internal/replay": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.7.0.tgz",
- "integrity": "sha512-bQzOkWplaWTe3u+aDBhxWY3Qy0aT7ss2A3VR8iC6N8ZIEP9PxqyJwTNoouhinfgmlnCguI7RDOO4f3r3e2M80Q==",
+ "version": "8.13.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.13.0.tgz",
+ "integrity": "sha512-DJ1jF/Pab0FH4SeCvSGCnGAu/s0wJvhBWM5VjQp7Jjmcfunp+R3vJibqU8gAVZU1nYRLaqprLdIXrSyP2Km8nQ==",
"dependencies": {
- "@sentry-internal/browser-utils": "8.7.0",
- "@sentry/core": "8.7.0",
- "@sentry/types": "8.7.0",
- "@sentry/utils": "8.7.0"
+ "@sentry-internal/browser-utils": "8.13.0",
+ "@sentry/core": "8.13.0",
+ "@sentry/types": "8.13.0",
+ "@sentry/utils": "8.13.0"
},
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry-internal/replay-canvas": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.7.0.tgz",
- "integrity": "sha512-FOnvBPbq6MJVHPduc0hcsdE3PeeovQ2z5WJnZDGhvp/Obehxqe+XgX7K/595vRIknv4EokRn/3Kw0mFwG8E+ZQ==",
+ "version": "8.13.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.13.0.tgz",
+ "integrity": "sha512-lPlfWVIHX+gW4S8a/UOVutuqMyQhlkNUAay0W21MVhZJT5Mtj0p21D/Cz7nrOQRDIiLNq90KAGK2tLxx5NkiWA==",
"dependencies": {
- "@sentry-internal/replay": "8.7.0",
- "@sentry/core": "8.7.0",
- "@sentry/types": "8.7.0",
- "@sentry/utils": "8.7.0"
+ "@sentry-internal/replay": "8.13.0",
+ "@sentry/core": "8.13.0",
+ "@sentry/types": "8.13.0",
+ "@sentry/utils": "8.13.0"
},
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry/browser": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.7.0.tgz",
- "integrity": "sha512-4EEp+PlcktsMN0p+MdCPl/lghTkq7eOtZjQG9NGhWzfyWrJ3tuL1nsDr2SSivJ1V277F01KtKYo6BFwP2NtBZA==",
+ "version": "8.13.0",
+ "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.13.0.tgz",
+ "integrity": "sha512-/tp7HZ5qjwDLtwooPMoexdAi2PG7gMNY0bHeMlwy20hs8mclC8RW8ZiJA6czXHfgnbmvxfrHaY53IJyz//JnlA==",
"dependencies": {
- "@sentry-internal/browser-utils": "8.7.0",
- "@sentry-internal/feedback": "8.7.0",
- "@sentry-internal/replay": "8.7.0",
- "@sentry-internal/replay-canvas": "8.7.0",
- "@sentry/core": "8.7.0",
- "@sentry/types": "8.7.0",
- "@sentry/utils": "8.7.0"
+ "@sentry-internal/browser-utils": "8.13.0",
+ "@sentry-internal/feedback": "8.13.0",
+ "@sentry-internal/replay": "8.13.0",
+ "@sentry-internal/replay-canvas": "8.13.0",
+ "@sentry/core": "8.13.0",
+ "@sentry/types": "8.13.0",
+ "@sentry/utils": "8.13.0"
},
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry/core": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.7.0.tgz",
- "integrity": "sha512-Sq/46B+5nWmgnCD6dEMZ6HTkKbV/KAdgaSvT8oXDb9OWoPy1jJ/gbLrhLs62KbjuDQk4/vWnOgHiKQbcslSzMw==",
+ "version": "8.13.0",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.13.0.tgz",
+ "integrity": "sha512-N9Qg4ZGxZWp8eb2eUUHVVKgjBLtFIjS805nG92s6yJmkvOpKm6mLtcUaT/iDf3Hta6nG+xRkhbE3r+Z4cbXG8w==",
"dependencies": {
- "@sentry/types": "8.7.0",
- "@sentry/utils": "8.7.0"
+ "@sentry/types": "8.13.0",
+ "@sentry/utils": "8.13.0"
},
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry/react": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/@sentry/react/-/react-8.7.0.tgz",
- "integrity": "sha512-JFo8QW8JB4eaFC8RdkOBO96JvlGgstywmyMZ39qWfFbD735vGl8PnOa0AnrC/5Auc86dZ98/I4OEPboqUE9q1w==",
- "dependencies": {
- "@sentry/browser": "8.7.0",
- "@sentry/core": "8.7.0",
- "@sentry/types": "8.7.0",
- "@sentry/utils": "8.7.0",
+ "version": "8.13.0",
+ "resolved": "https://registry.npmjs.org/@sentry/react/-/react-8.13.0.tgz",
+ "integrity": "sha512-gz+aHZMcl6uvHkmLBGzMGjJJ+Vpl+W0VXJsKB9fdjZDDF5vJpgXTR9mwMEXJ9lKi+cY6tDe0+af+DA8BGJgw0Q==",
+ "dependencies": {
+ "@sentry/browser": "8.13.0",
+ "@sentry/core": "8.13.0",
+ "@sentry/types": "8.13.0",
+ "@sentry/utils": "8.13.0",
"hoist-non-react-statics": "^3.3.2"
},
"engines": {
@@ -3736,19 +3736,19 @@
}
},
"node_modules/@sentry/types": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.7.0.tgz",
- "integrity": "sha512-11KLOKumP6akugVGLvSoEig+JlP0ZEzW3nN9P+ppgdIx9HAxMIh6UvumbieG4/DWjAh2kh6NPNfUw3gk2Gfq1A==",
+ "version": "8.13.0",
+ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.13.0.tgz",
+ "integrity": "sha512-r63s/H5gvQnQM9tTGBXz2xErUbxZALh4e2Lg/1aHj4zIvGLBjA2z5qWsh6TEZYbpmgAyGShLDr6+rWeUVf9yBQ==",
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry/utils": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.7.0.tgz",
- "integrity": "sha512-aWmcbSoOmrbzll/FkNQFJcCtLAuJLvTYbRKiCSkV3FScA7UaA742HkTZAPFiioALFIESWk/fcGZqtN0s4I281Q==",
+ "version": "8.13.0",
+ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.13.0.tgz",
+ "integrity": "sha512-PxV0v9VbGWH9zP37P5w2msLUFDr287nYjoY2XVF+RSolyiTs1CQNI5ZMUO3o4MsSac/dpXxjyrZXQd72t/jRYA==",
"dependencies": {
- "@sentry/types": "8.7.0"
+ "@sentry/types": "8.13.0"
},
"engines": {
"node": ">=14.18"
diff --git a/package.json b/package.json
index 87a3c44468..2cee8c5ca7 100644
--- a/package.json
+++ b/package.json
@@ -33,7 +33,7 @@
},
"dependencies": {
"@reduxjs/toolkit": "^2.2.5",
- "@sentry/react": "^8.7.0",
+ "@sentry/react": "^8.13.0",
"@visx/axis": "^3.10.1",
"@visx/gradient": "^3.3.0",
"@visx/shape": "^3.5.0",
From 7cd3ef934f644582a7a30d13d0cabb183446e26b Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 11 Jul 2024 12:47:38 +0200
Subject: [PATCH 076/130] Deps: Bump prettier from 3.2.5 to 3.3.2 (#4090)
Bumps [prettier](https://github.com/prettier/prettier) from 3.2.5 to 3.3.2.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.2.5...3.3.2)
---
updated-dependencies:
- dependency-name: prettier
dependency-type: direct:development
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: daniele-mng
---
package-lock.json | 8 ++++----
package.json | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index bedeb63724..be47ef4b57 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -75,7 +75,7 @@
"husky": "^2.7.0",
"jest-styled-components": "^7.2.0",
"lint-staged": "^13.1.0",
- "prettier": "^3.2.5",
+ "prettier": "^3.3.2",
"typescript": "^5.2.2",
"vite": "^5.2.12",
"vite-plugin-eslint": "^1.8.1",
@@ -11493,9 +11493,9 @@
}
},
"node_modules/prettier": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz",
- "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==",
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz",
+ "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==",
"dev": true,
"bin": {
"prettier": "bin/prettier.cjs"
diff --git a/package.json b/package.json
index 2cee8c5ca7..e9f7d72339 100644
--- a/package.json
+++ b/package.json
@@ -98,7 +98,7 @@
"husky": "^2.7.0",
"jest-styled-components": "^7.2.0",
"lint-staged": "^13.1.0",
- "prettier": "^3.2.5",
+ "prettier": "^3.3.2",
"typescript": "^5.2.2",
"vite": "^5.2.12",
"vite-plugin-eslint": "^1.8.1",
From e9bad1baeb07e6a8e43ef021a406664e5edc0d0e Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 11 Jul 2024 14:08:19 +0200
Subject: [PATCH 077/130] Deps: Bump the patch-updates group across 1 directory
with 7 updates (#4096)
Bumps the patch-updates group with 7 updates in the / directory:
| Package | From | To |
| --- | --- | --- |
| [@reduxjs/toolkit](https://github.com/reduxjs/redux-toolkit) | `2.2.5` | `2.2.6` |
| [qs](https://github.com/ljharb/qs) | `6.12.1` | `6.12.3` |
| [@babel/cli](https://github.com/babel/babel/tree/HEAD/packages/babel-cli) | `7.24.6` | `7.24.7` |
| [@testing-library/jest-dom](https://github.com/testing-library/jest-dom) | `6.4.5` | `6.4.6` |
| [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) | `4.3.0` | `4.3.1` |
| [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) | `7.34.2` | `7.34.3` |
| [eslint-plugin-react-refresh](https://github.com/ArnaudBarre/eslint-plugin-react-refresh) | `0.4.7` | `0.4.8` |
Updates `@reduxjs/toolkit` from 2.2.5 to 2.2.6
- [Release notes](https://github.com/reduxjs/redux-toolkit/releases)
- [Commits](https://github.com/reduxjs/redux-toolkit/compare/v2.2.5...v2.2.6)
Updates `qs` from 6.12.1 to 6.12.3
- [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/qs/compare/v6.12.1...v6.12.3)
Updates `@babel/cli` from 7.24.6 to 7.24.7
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.24.7/packages/babel-cli)
Updates `@testing-library/jest-dom` from 6.4.5 to 6.4.6
- [Release notes](https://github.com/testing-library/jest-dom/releases)
- [Changelog](https://github.com/testing-library/jest-dom/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/jest-dom/compare/v6.4.5...v6.4.6)
Updates `@vitejs/plugin-react` from 4.3.0 to 4.3.1
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/v4.3.1/packages/plugin-react)
Updates `eslint-plugin-react` from 7.34.2 to 7.34.3
- [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases)
- [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.34.2...v7.34.3)
Updates `eslint-plugin-react-refresh` from 0.4.7 to 0.4.8
- [Release notes](https://github.com/ArnaudBarre/eslint-plugin-react-refresh/releases)
- [Changelog](https://github.com/ArnaudBarre/eslint-plugin-react-refresh/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ArnaudBarre/eslint-plugin-react-refresh/compare/v0.4.7...v0.4.8)
---
updated-dependencies:
- dependency-name: "@reduxjs/toolkit"
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: patch-updates
- dependency-name: qs
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: patch-updates
- dependency-name: "@babel/cli"
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: patch-updates
- dependency-name: "@testing-library/jest-dom"
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: patch-updates
- dependency-name: "@vitejs/plugin-react"
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: patch-updates
- dependency-name: eslint-plugin-react
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: patch-updates
- dependency-name: eslint-plugin-react-refresh
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: patch-updates
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: daniele-mng
---
package-lock.json | 81 ++++++++++++++++++++++++-----------------------
package.json | 14 ++++----
2 files changed, 49 insertions(+), 46 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index be47ef4b57..598b248131 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,7 +9,7 @@
"version": "23.1.2-dev1",
"license": "AGPL-3.0+",
"dependencies": {
- "@reduxjs/toolkit": "^2.2.5",
+ "@reduxjs/toolkit": "^2.2.6",
"@sentry/react": "^8.13.0",
"@visx/axis": "^3.10.1",
"@visx/gradient": "^3.3.0",
@@ -37,7 +37,7 @@
"moment-timezone": "^0.5.45",
"prop-types": "^15.8.1",
"qhistory": "^1.1.0",
- "qs": "^6.12.0",
+ "qs": "^6.12.3",
"react": "^18.3.1",
"react-beautiful-dnd": "^13.1.1",
"react-datepicker": "^6.0.0",
@@ -51,9 +51,9 @@
"whatwg-fetch": "^3.6.20"
},
"devDependencies": {
- "@babel/cli": "^7.24.6",
+ "@babel/cli": "^7.24.7",
"@pandatix/js-cvss": "^0.4.4",
- "@testing-library/jest-dom": "^6.4.5",
+ "@testing-library/jest-dom": "^6.4.6",
"@testing-library/react": "^16.0.0",
"@testing-library/user-event": "^13.5.0",
"@types/react": "^18.3.3",
@@ -61,16 +61,16 @@
"@typescript-eslint/eslint-plugin": "^7.12.0",
"@typescript-eslint/parser": "^7.12.0",
"@vitejs/plugin-legacy": "^5.4.1",
- "@vitejs/plugin-react": "^4.3.0",
+ "@vitejs/plugin-react": "^4.3.1",
"@vitest/coverage-v8": "^1.6.0",
"@vitest/ui": "^1.5.0",
"babel-plugin-i18next-extract": "^0.10.0",
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-header": "^3.1.1",
- "eslint-plugin-react": "^7.34.2",
+ "eslint-plugin-react": "^7.34.3",
"eslint-plugin-react-hooks": "^4.6.2",
- "eslint-plugin-react-refresh": "^0.4.7",
+ "eslint-plugin-react-refresh": "^0.4.8",
"eslint-plugin-vitest-globals": "^1.5.0",
"husky": "^2.7.0",
"jest-styled-components": "^7.2.0",
@@ -97,9 +97,9 @@
}
},
"node_modules/@adobe/css-tools": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz",
- "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==",
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz",
+ "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==",
"dev": true
},
"node_modules/@ampproject/remapping": {
@@ -115,9 +115,9 @@
}
},
"node_modules/@babel/cli": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.24.6.tgz",
- "integrity": "sha512-Sm/YhG/0REw9SKByFHDf4hkk7PYsjcsOyZgHGz1nvab4tUTQ9N4XVv+ykK0Y+VCJ3OshA/7EDyxnwCd8NEP/mQ==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.24.7.tgz",
+ "integrity": "sha512-8dfPprJgV4O14WTx+AQyEA+opgUKPrsIXX/MdL50J1n06EQJ6m1T+CdsJe0qEC0B/Xl85i+Un5KVAxd/PACX9A==",
"dev": true,
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.25",
@@ -3395,9 +3395,9 @@
"dev": true
},
"node_modules/@reduxjs/toolkit": {
- "version": "2.2.5",
- "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.5.tgz",
- "integrity": "sha512-aeFA/s5NCG7NoJe/MhmwREJxRkDs0ZaSqt0MxhWUrwCf1UQXpwR87RROJEql0uAkLI6U7snBOYOcKw83ew3FPg==",
+ "version": "2.2.6",
+ "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.6.tgz",
+ "integrity": "sha512-kH0r495c5z1t0g796eDQAkYbEQ3a1OLYN9o8jQQVZyKyw367pfRGS+qZLkHYvFHiUUdafpoSlQ2QYObIApjPWA==",
"dependencies": {
"immer": "^10.0.3",
"redux": "^5.0.1",
@@ -4016,12 +4016,12 @@
}
},
"node_modules/@testing-library/jest-dom": {
- "version": "6.4.5",
- "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.5.tgz",
- "integrity": "sha512-AguB9yvTXmCnySBP1lWjfNNUwpbElsaQ567lt2VdGqAdHtpieLgjmcVyv1q7PMIvLbgpDdkWV5Ydv3FEejyp2A==",
+ "version": "6.4.6",
+ "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.6.tgz",
+ "integrity": "sha512-8qpnGVincVDLEcQXWaHOf6zmlbwTKc6Us6PPu4CRnPXCzo2OGBS5cwgMMOWdxDpEz1mkbvXHpEy99M5Yvt682w==",
"dev": true,
"dependencies": {
- "@adobe/css-tools": "^4.3.2",
+ "@adobe/css-tools": "^4.4.0",
"@babel/runtime": "^7.9.2",
"aria-query": "^5.0.0",
"chalk": "^3.0.0",
@@ -4836,9 +4836,9 @@
}
},
"node_modules/@vitejs/plugin-react": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.0.tgz",
- "integrity": "sha512-KcEbMsn4Dpk+LIbHMj7gDPRKaTMStxxWRkRmxsg/jVdFdJCZWt1SchZcf0M4t8lIKdwwMsEyzhrcOXRrDPtOBw==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz",
+ "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==",
"dev": true,
"dependencies": {
"@babel/core": "^7.24.5",
@@ -5347,16 +5347,19 @@
}
},
"node_modules/array.prototype.tosorted": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz",
- "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==",
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
+ "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.5",
+ "call-bind": "^1.0.7",
"define-properties": "^1.2.1",
- "es-abstract": "^1.22.3",
- "es-errors": "^1.1.0",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
"es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
}
},
"node_modules/arraybuffer.prototype.slice": {
@@ -7201,16 +7204,16 @@
}
},
"node_modules/eslint-plugin-react": {
- "version": "7.34.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.2.tgz",
- "integrity": "sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw==",
+ "version": "7.34.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz",
+ "integrity": "sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==",
"dev": true,
"dependencies": {
"array-includes": "^3.1.8",
"array.prototype.findlast": "^1.2.5",
"array.prototype.flatmap": "^1.3.2",
"array.prototype.toreversed": "^1.1.2",
- "array.prototype.tosorted": "^1.1.3",
+ "array.prototype.tosorted": "^1.1.4",
"doctrine": "^2.1.0",
"es-iterator-helpers": "^1.0.19",
"estraverse": "^5.3.0",
@@ -7245,9 +7248,9 @@
}
},
"node_modules/eslint-plugin-react-refresh": {
- "version": "0.4.7",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.7.tgz",
- "integrity": "sha512-yrj+KInFmwuQS2UQcg1SF83ha1tuHC1jMQbRNyuWtlEzzKRDgAl7L4Yp4NlDUZTZNlWvHEzOtJhMi40R7JxcSw==",
+ "version": "0.4.8",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.8.tgz",
+ "integrity": "sha512-MIKAclwaDFIiYtVBLzDdm16E+Ty4GwhB6wZlCAG1R3Ur+F9Qbo6PRxpA5DK7XtDgm+WlCoAY2WxAwqhmIDHg6Q==",
"dev": true,
"peerDependencies": {
"eslint": ">=7"
@@ -11629,9 +11632,9 @@
}
},
"node_modules/qs": {
- "version": "6.12.1",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz",
- "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==",
+ "version": "6.12.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.3.tgz",
+ "integrity": "sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==",
"dependencies": {
"side-channel": "^1.0.6"
},
diff --git a/package.json b/package.json
index e9f7d72339..0bcfd901d2 100644
--- a/package.json
+++ b/package.json
@@ -32,7 +32,7 @@
"node": ">=18.0"
},
"dependencies": {
- "@reduxjs/toolkit": "^2.2.5",
+ "@reduxjs/toolkit": "^2.2.6",
"@sentry/react": "^8.13.0",
"@visx/axis": "^3.10.1",
"@visx/gradient": "^3.3.0",
@@ -60,7 +60,7 @@
"moment-timezone": "^0.5.45",
"prop-types": "^15.8.1",
"qhistory": "^1.1.0",
- "qs": "^6.12.0",
+ "qs": "^6.12.3",
"react": "^18.3.1",
"react-beautiful-dnd": "^13.1.1",
"react-datepicker": "^6.0.0",
@@ -74,9 +74,9 @@
"whatwg-fetch": "^3.6.20"
},
"devDependencies": {
- "@babel/cli": "^7.24.6",
+ "@babel/cli": "^7.24.7",
"@pandatix/js-cvss": "^0.4.4",
- "@testing-library/jest-dom": "^6.4.5",
+ "@testing-library/jest-dom": "^6.4.6",
"@testing-library/react": "^16.0.0",
"@testing-library/user-event": "^13.5.0",
"@types/react": "^18.3.3",
@@ -84,16 +84,16 @@
"@typescript-eslint/eslint-plugin": "^7.12.0",
"@typescript-eslint/parser": "^7.12.0",
"@vitejs/plugin-legacy": "^5.4.1",
- "@vitejs/plugin-react": "^4.3.0",
+ "@vitejs/plugin-react": "^4.3.1",
"@vitest/coverage-v8": "^1.6.0",
"@vitest/ui": "^1.5.0",
"babel-plugin-i18next-extract": "^0.10.0",
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-header": "^3.1.1",
- "eslint-plugin-react": "^7.34.2",
+ "eslint-plugin-react": "^7.34.3",
"eslint-plugin-react-hooks": "^4.6.2",
- "eslint-plugin-react-refresh": "^0.4.7",
+ "eslint-plugin-react-refresh": "^0.4.8",
"eslint-plugin-vitest-globals": "^1.5.0",
"husky": "^2.7.0",
"jest-styled-components": "^7.2.0",
From 09a86278ba927111287f224bc8c0355d5a1663d7 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 11 Jul 2024 14:46:17 +0200
Subject: [PATCH 078/130] Deps: Bump vite from 5.2.12 to 5.3.3 (#4100)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.2.12 to 5.3.3.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.3.3/packages/vite)
---
updated-dependencies:
- dependency-name: vite
dependency-type: direct:development
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: daniele-mng
---
package-lock.json | 236 ++++++++++++++++++++++++++--------------------
package.json | 2 +-
2 files changed, 133 insertions(+), 105 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 598b248131..d57d361092 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -77,7 +77,7 @@
"lint-staged": "^13.1.0",
"prettier": "^3.3.2",
"typescript": "^5.2.2",
- "vite": "^5.2.12",
+ "vite": "^5.3.3",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-eslint2": "^4.4.0",
"vite-plugin-svgr": "^4.2.0",
@@ -2206,9 +2206,9 @@
"integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ=="
},
"node_modules/@esbuild/aix-ppc64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
- "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
"cpu": [
"ppc64"
],
@@ -2222,9 +2222,9 @@
}
},
"node_modules/@esbuild/android-arm": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
- "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
"cpu": [
"arm"
],
@@ -2238,9 +2238,9 @@
}
},
"node_modules/@esbuild/android-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
- "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
"cpu": [
"arm64"
],
@@ -2254,9 +2254,9 @@
}
},
"node_modules/@esbuild/android-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
- "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
"cpu": [
"x64"
],
@@ -2270,9 +2270,9 @@
}
},
"node_modules/@esbuild/darwin-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
- "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
"cpu": [
"arm64"
],
@@ -2286,9 +2286,9 @@
}
},
"node_modules/@esbuild/darwin-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
- "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
"cpu": [
"x64"
],
@@ -2302,9 +2302,9 @@
}
},
"node_modules/@esbuild/freebsd-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
- "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
"cpu": [
"arm64"
],
@@ -2318,9 +2318,9 @@
}
},
"node_modules/@esbuild/freebsd-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
- "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
"cpu": [
"x64"
],
@@ -2334,9 +2334,9 @@
}
},
"node_modules/@esbuild/linux-arm": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
- "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
"cpu": [
"arm"
],
@@ -2350,9 +2350,9 @@
}
},
"node_modules/@esbuild/linux-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
- "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
"cpu": [
"arm64"
],
@@ -2366,9 +2366,9 @@
}
},
"node_modules/@esbuild/linux-ia32": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
- "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
"cpu": [
"ia32"
],
@@ -2382,9 +2382,9 @@
}
},
"node_modules/@esbuild/linux-loong64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
- "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
"cpu": [
"loong64"
],
@@ -2398,9 +2398,9 @@
}
},
"node_modules/@esbuild/linux-mips64el": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
- "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
"cpu": [
"mips64el"
],
@@ -2414,9 +2414,9 @@
}
},
"node_modules/@esbuild/linux-ppc64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
- "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
"cpu": [
"ppc64"
],
@@ -2430,9 +2430,9 @@
}
},
"node_modules/@esbuild/linux-riscv64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
- "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
"cpu": [
"riscv64"
],
@@ -2446,9 +2446,9 @@
}
},
"node_modules/@esbuild/linux-s390x": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
- "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
"cpu": [
"s390x"
],
@@ -2462,9 +2462,9 @@
}
},
"node_modules/@esbuild/linux-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
- "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
"cpu": [
"x64"
],
@@ -2478,9 +2478,9 @@
}
},
"node_modules/@esbuild/netbsd-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
- "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
"cpu": [
"x64"
],
@@ -2494,9 +2494,9 @@
}
},
"node_modules/@esbuild/openbsd-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
- "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
"cpu": [
"x64"
],
@@ -2510,9 +2510,9 @@
}
},
"node_modules/@esbuild/sunos-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
- "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
"cpu": [
"x64"
],
@@ -2526,9 +2526,9 @@
}
},
"node_modules/@esbuild/win32-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
- "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
"cpu": [
"arm64"
],
@@ -2542,9 +2542,9 @@
}
},
"node_modules/@esbuild/win32-ia32": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
- "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
"cpu": [
"ia32"
],
@@ -2558,9 +2558,9 @@
}
},
"node_modules/@esbuild/win32-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
- "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
"cpu": [
"x64"
],
@@ -7047,9 +7047,9 @@
}
},
"node_modules/esbuild": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
- "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
"dev": true,
"hasInstallScript": true,
"bin": {
@@ -7059,29 +7059,29 @@
"node": ">=12"
},
"optionalDependencies": {
- "@esbuild/aix-ppc64": "0.20.2",
- "@esbuild/android-arm": "0.20.2",
- "@esbuild/android-arm64": "0.20.2",
- "@esbuild/android-x64": "0.20.2",
- "@esbuild/darwin-arm64": "0.20.2",
- "@esbuild/darwin-x64": "0.20.2",
- "@esbuild/freebsd-arm64": "0.20.2",
- "@esbuild/freebsd-x64": "0.20.2",
- "@esbuild/linux-arm": "0.20.2",
- "@esbuild/linux-arm64": "0.20.2",
- "@esbuild/linux-ia32": "0.20.2",
- "@esbuild/linux-loong64": "0.20.2",
- "@esbuild/linux-mips64el": "0.20.2",
- "@esbuild/linux-ppc64": "0.20.2",
- "@esbuild/linux-riscv64": "0.20.2",
- "@esbuild/linux-s390x": "0.20.2",
- "@esbuild/linux-x64": "0.20.2",
- "@esbuild/netbsd-x64": "0.20.2",
- "@esbuild/openbsd-x64": "0.20.2",
- "@esbuild/sunos-x64": "0.20.2",
- "@esbuild/win32-arm64": "0.20.2",
- "@esbuild/win32-ia32": "0.20.2",
- "@esbuild/win32-x64": "0.20.2"
+ "@esbuild/aix-ppc64": "0.21.5",
+ "@esbuild/android-arm": "0.21.5",
+ "@esbuild/android-arm64": "0.21.5",
+ "@esbuild/android-x64": "0.21.5",
+ "@esbuild/darwin-arm64": "0.21.5",
+ "@esbuild/darwin-x64": "0.21.5",
+ "@esbuild/freebsd-arm64": "0.21.5",
+ "@esbuild/freebsd-x64": "0.21.5",
+ "@esbuild/linux-arm": "0.21.5",
+ "@esbuild/linux-arm64": "0.21.5",
+ "@esbuild/linux-ia32": "0.21.5",
+ "@esbuild/linux-loong64": "0.21.5",
+ "@esbuild/linux-mips64el": "0.21.5",
+ "@esbuild/linux-ppc64": "0.21.5",
+ "@esbuild/linux-riscv64": "0.21.5",
+ "@esbuild/linux-s390x": "0.21.5",
+ "@esbuild/linux-x64": "0.21.5",
+ "@esbuild/netbsd-x64": "0.21.5",
+ "@esbuild/openbsd-x64": "0.21.5",
+ "@esbuild/sunos-x64": "0.21.5",
+ "@esbuild/win32-arm64": "0.21.5",
+ "@esbuild/win32-ia32": "0.21.5",
+ "@esbuild/win32-x64": "0.21.5"
}
},
"node_modules/escalade": {
@@ -11313,9 +11313,9 @@
}
},
"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.0.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
+ "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="
},
"node_modules/picomatch": {
"version": "2.3.1",
@@ -13441,13 +13441,13 @@
"integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw=="
},
"node_modules/vite": {
- "version": "5.2.12",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.12.tgz",
- "integrity": "sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==",
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.3.tgz",
+ "integrity": "sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==",
"dev": true,
"dependencies": {
- "esbuild": "^0.20.1",
- "postcss": "^8.4.38",
+ "esbuild": "^0.21.3",
+ "postcss": "^8.4.39",
"rollup": "^4.13.0"
},
"bin": {
@@ -13599,6 +13599,34 @@
"vite": "^2.6.0 || 3 || 4 || 5"
}
},
+ "node_modules/vite/node_modules/postcss": {
+ "version": "8.4.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz",
+ "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.0.1",
+ "source-map-js": "^1.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
"node_modules/vitest": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz",
diff --git a/package.json b/package.json
index 0bcfd901d2..404630bc07 100644
--- a/package.json
+++ b/package.json
@@ -100,7 +100,7 @@
"lint-staged": "^13.1.0",
"prettier": "^3.3.2",
"typescript": "^5.2.2",
- "vite": "^5.2.12",
+ "vite": "^5.3.3",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-eslint2": "^4.4.0",
"vite-plugin-svgr": "^4.2.0",
From 90654244b60742a8832f57d083cc94337a9c1772 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 11 Jul 2024 15:45:52 +0200
Subject: [PATCH 079/130] Deps: Bump typescript from 5.4.5 to 5.5.3 (#4101)
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 5.4.5 to 5.5.3.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release.yml)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v5.4.5...v5.5.3)
---
updated-dependencies:
- dependency-name: typescript
dependency-type: direct:development
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package-lock.json | 8 ++++----
package.json | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index d57d361092..421145f2f6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -76,7 +76,7 @@
"jest-styled-components": "^7.2.0",
"lint-staged": "^13.1.0",
"prettier": "^3.3.2",
- "typescript": "^5.2.2",
+ "typescript": "^5.5.3",
"vite": "^5.3.3",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-eslint2": "^4.4.0",
@@ -13243,9 +13243,9 @@
}
},
"node_modules/typescript": {
- "version": "5.4.5",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
- "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz",
+ "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
diff --git a/package.json b/package.json
index 404630bc07..74e77cda5c 100644
--- a/package.json
+++ b/package.json
@@ -99,7 +99,7 @@
"jest-styled-components": "^7.2.0",
"lint-staged": "^13.1.0",
"prettier": "^3.3.2",
- "typescript": "^5.2.2",
+ "typescript": "^5.5.3",
"vite": "^5.3.3",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-eslint2": "^4.4.0",
From 2be70b6fa92d9e62e3911b0a27c03c612785e02a Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 11 Jul 2024 16:28:15 +0200
Subject: [PATCH 080/130] Deps: Bump @typescript-eslint/eslint-plugin from
7.12.0 to 7.16.0 (#4099)
Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 7.12.0 to 7.16.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.16.0/packages/eslint-plugin)
---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
dependency-type: direct:development
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package-lock.json | 218 ++++++++++++++++++++++++++++++++++++++++++----
package.json | 2 +-
2 files changed, 200 insertions(+), 20 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 421145f2f6..2e2b2c95c9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -58,7 +58,7 @@
"@testing-library/user-event": "^13.5.0",
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
- "@typescript-eslint/eslint-plugin": "^7.12.0",
+ "@typescript-eslint/eslint-plugin": "^7.16.0",
"@typescript-eslint/parser": "^7.12.0",
"@vitejs/plugin-legacy": "^5.4.1",
"@vitejs/plugin-react": "^4.3.1",
@@ -4474,16 +4474,16 @@
"peer": true
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "7.12.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.12.0.tgz",
- "integrity": "sha512-7F91fcbuDf/d3S8o21+r3ZncGIke/+eWk0EpO21LXhDfLahriZF9CGj4fbAetEjlaBdjdSm9a6VeXbpbT6Z40Q==",
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.0.tgz",
+ "integrity": "sha512-py1miT6iQpJcs1BiJjm54AMzeuMPBSPuKPlnT8HlfudbcS5rYeX5jajpLf3mrdRh9dA/Ec2FVUY0ifeVNDIhZw==",
"dev": true,
"dependencies": {
"@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "7.12.0",
- "@typescript-eslint/type-utils": "7.12.0",
- "@typescript-eslint/utils": "7.12.0",
- "@typescript-eslint/visitor-keys": "7.12.0",
+ "@typescript-eslint/scope-manager": "7.16.0",
+ "@typescript-eslint/type-utils": "7.16.0",
+ "@typescript-eslint/utils": "7.16.0",
+ "@typescript-eslint/visitor-keys": "7.16.0",
"graphemer": "^1.4.0",
"ignore": "^5.3.1",
"natural-compare": "^1.4.0",
@@ -4506,6 +4506,53 @@
}
}
},
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.0.tgz",
+ "integrity": "sha512-8gVv3kW6n01Q6TrI1cmTZ9YMFi3ucDT7i7aI5lEikk2ebk1AEjrwX8MDTdaX5D7fPXMBLvnsaa0IFTAu+jcfOw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "7.16.0",
+ "@typescript-eslint/visitor-keys": "7.16.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.0.tgz",
+ "integrity": "sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.0.tgz",
+ "integrity": "sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "7.16.0",
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
"node_modules/@typescript-eslint/parser": {
"version": "7.12.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.12.0.tgz",
@@ -4552,13 +4599,13 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "7.12.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.12.0.tgz",
- "integrity": "sha512-lib96tyRtMhLxwauDWUp/uW3FMhLA6D0rJ8T7HmH7x23Gk1Gwwu8UZ94NMXBvOELn6flSPiBrCKlehkiXyaqwA==",
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.0.tgz",
+ "integrity": "sha512-j0fuUswUjDHfqV/UdW6mLtOQQseORqfdmoBNDFOqs9rvNVR2e+cmu6zJu/Ku4SDuqiJko6YnhwcL8x45r8Oqxg==",
"dev": true,
"dependencies": {
- "@typescript-eslint/typescript-estree": "7.12.0",
- "@typescript-eslint/utils": "7.12.0",
+ "@typescript-eslint/typescript-estree": "7.16.0",
+ "@typescript-eslint/utils": "7.16.0",
"debug": "^4.3.4",
"ts-api-utils": "^1.3.0"
},
@@ -4578,6 +4625,64 @@
}
}
},
+ "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.0.tgz",
+ "integrity": "sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.0.tgz",
+ "integrity": "sha512-a5NTvk51ZndFuOLCh5OaJBELYc2O3Zqxfl3Js78VFE1zE46J2AaVuW+rEbVkQznjkmlzWsUI15BG5tQMixzZLw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "7.16.0",
+ "@typescript-eslint/visitor-keys": "7.16.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.0.tgz",
+ "integrity": "sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "7.16.0",
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
"node_modules/@typescript-eslint/types": {
"version": "7.12.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.12.0.tgz",
@@ -4620,15 +4725,15 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "7.12.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.12.0.tgz",
- "integrity": "sha512-Y6hhwxwDx41HNpjuYswYp6gDbkiZ8Hin9Bf5aJQn1bpTs3afYY4GX+MPYxma8jtoIV2GRwTM/UJm/2uGCVv+DQ==",
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.0.tgz",
+ "integrity": "sha512-PqP4kP3hb4r7Jav+NiRCntlVzhxBNWq6ZQ+zQwII1y/G/1gdIPeYDCKr2+dH6049yJQsWZiHU6RlwvIFBXXGNA==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "7.12.0",
- "@typescript-eslint/types": "7.12.0",
- "@typescript-eslint/typescript-estree": "7.12.0"
+ "@typescript-eslint/scope-manager": "7.16.0",
+ "@typescript-eslint/types": "7.16.0",
+ "@typescript-eslint/typescript-estree": "7.16.0"
},
"engines": {
"node": "^18.18.0 || >=20.0.0"
@@ -4641,6 +4746,81 @@
"eslint": "^8.56.0"
}
},
+ "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.0.tgz",
+ "integrity": "sha512-8gVv3kW6n01Q6TrI1cmTZ9YMFi3ucDT7i7aI5lEikk2ebk1AEjrwX8MDTdaX5D7fPXMBLvnsaa0IFTAu+jcfOw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "7.16.0",
+ "@typescript-eslint/visitor-keys": "7.16.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.0.tgz",
+ "integrity": "sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.0.tgz",
+ "integrity": "sha512-a5NTvk51ZndFuOLCh5OaJBELYc2O3Zqxfl3Js78VFE1zE46J2AaVuW+rEbVkQznjkmlzWsUI15BG5tQMixzZLw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "7.16.0",
+ "@typescript-eslint/visitor-keys": "7.16.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.0.tgz",
+ "integrity": "sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "7.16.0",
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
"node_modules/@typescript-eslint/visitor-keys": {
"version": "7.12.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.12.0.tgz",
diff --git a/package.json b/package.json
index 74e77cda5c..5aca087f6b 100644
--- a/package.json
+++ b/package.json
@@ -81,7 +81,7 @@
"@testing-library/user-event": "^13.5.0",
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
- "@typescript-eslint/eslint-plugin": "^7.12.0",
+ "@typescript-eslint/eslint-plugin": "^7.16.0",
"@typescript-eslint/parser": "^7.12.0",
"@vitejs/plugin-legacy": "^5.4.1",
"@vitejs/plugin-react": "^4.3.1",
From 2596273b2f59b8d7650fb9b600941cd7b42932b8 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 11 Jul 2024 17:06:23 +0200
Subject: [PATCH 081/130] Deps: Bump @typescript-eslint/parser from 7.12.0 to
7.16.0 (#4097)
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 7.12.0 to 7.16.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.16.0/packages/parser)
---
updated-dependencies:
- dependency-name: "@typescript-eslint/parser"
dependency-type: direct:development
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package-lock.json | 210 ++++------------------------------------------
package.json | 2 +-
2 files changed, 16 insertions(+), 196 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 2e2b2c95c9..5001f7d7fd 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -59,7 +59,7 @@
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
"@typescript-eslint/eslint-plugin": "^7.16.0",
- "@typescript-eslint/parser": "^7.12.0",
+ "@typescript-eslint/parser": "^7.16.0",
"@vitejs/plugin-legacy": "^5.4.1",
"@vitejs/plugin-react": "^4.3.1",
"@vitest/coverage-v8": "^1.6.0",
@@ -4506,63 +4506,16 @@
}
}
},
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.0.tgz",
- "integrity": "sha512-8gVv3kW6n01Q6TrI1cmTZ9YMFi3ucDT7i7aI5lEikk2ebk1AEjrwX8MDTdaX5D7fPXMBLvnsaa0IFTAu+jcfOw==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "7.16.0",
- "@typescript-eslint/visitor-keys": "7.16.0"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.0.tgz",
- "integrity": "sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw==",
- "dev": true,
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": {
+ "node_modules/@typescript-eslint/parser": {
"version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.0.tgz",
- "integrity": "sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg==",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.16.0.tgz",
+ "integrity": "sha512-ar9E+k7CU8rWi2e5ErzQiC93KKEFAXA2Kky0scAlPcxYblLt8+XZuHUZwlyfXILyQa95P6lQg+eZgh/dDs3+Vw==",
"dev": true,
"dependencies": {
+ "@typescript-eslint/scope-manager": "7.16.0",
"@typescript-eslint/types": "7.16.0",
- "eslint-visitor-keys": "^3.4.3"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/parser": {
- "version": "7.12.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.12.0.tgz",
- "integrity": "sha512-dm/J2UDY3oV3TKius2OUZIFHsomQmpHtsV0FTh1WO8EKgHLQ1QCADUqscPgTpU+ih1e21FQSRjXckHn3txn6kQ==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/scope-manager": "7.12.0",
- "@typescript-eslint/types": "7.12.0",
- "@typescript-eslint/typescript-estree": "7.12.0",
- "@typescript-eslint/visitor-keys": "7.12.0",
+ "@typescript-eslint/typescript-estree": "7.16.0",
+ "@typescript-eslint/visitor-keys": "7.16.0",
"debug": "^4.3.4"
},
"engines": {
@@ -4582,13 +4535,13 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "7.12.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.12.0.tgz",
- "integrity": "sha512-itF1pTnN6F3unPak+kutH9raIkL3lhH1YRPGgt7QQOh43DQKVJXmWkpb+vpc/TiDHs6RSd9CTbDsc/Y+Ygq7kg==",
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.0.tgz",
+ "integrity": "sha512-8gVv3kW6n01Q6TrI1cmTZ9YMFi3ucDT7i7aI5lEikk2ebk1AEjrwX8MDTdaX5D7fPXMBLvnsaa0IFTAu+jcfOw==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "7.12.0",
- "@typescript-eslint/visitor-keys": "7.12.0"
+ "@typescript-eslint/types": "7.16.0",
+ "@typescript-eslint/visitor-keys": "7.16.0"
},
"engines": {
"node": "^18.18.0 || >=20.0.0"
@@ -4625,7 +4578,7 @@
}
}
},
- "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": {
+ "node_modules/@typescript-eslint/types": {
"version": "7.16.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.0.tgz",
"integrity": "sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw==",
@@ -4638,7 +4591,7 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": {
+ "node_modules/@typescript-eslint/typescript-estree": {
"version": "7.16.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.0.tgz",
"integrity": "sha512-a5NTvk51ZndFuOLCh5OaJBELYc2O3Zqxfl3Js78VFE1zE46J2AaVuW+rEbVkQznjkmlzWsUI15BG5tQMixzZLw==",
@@ -4666,64 +4619,6 @@
}
}
},
- "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.0.tgz",
- "integrity": "sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "7.16.0",
- "eslint-visitor-keys": "^3.4.3"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/types": {
- "version": "7.12.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.12.0.tgz",
- "integrity": "sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==",
- "dev": true,
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/typescript-estree": {
- "version": "7.12.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.12.0.tgz",
- "integrity": "sha512-5bwqLsWBULv1h6pn7cMW5dXX/Y2amRqLaKqsASVwbBHMZSnHqE/HN4vT4fE0aFsiwxYvr98kqOWh1a8ZKXalCQ==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "7.12.0",
- "@typescript-eslint/visitor-keys": "7.12.0",
- "debug": "^4.3.4",
- "globby": "^11.1.0",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^1.3.0"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
"node_modules/@typescript-eslint/utils": {
"version": "7.16.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.0.tgz",
@@ -4746,65 +4641,7 @@
"eslint": "^8.56.0"
}
},
- "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.0.tgz",
- "integrity": "sha512-8gVv3kW6n01Q6TrI1cmTZ9YMFi3ucDT7i7aI5lEikk2ebk1AEjrwX8MDTdaX5D7fPXMBLvnsaa0IFTAu+jcfOw==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "7.16.0",
- "@typescript-eslint/visitor-keys": "7.16.0"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.0.tgz",
- "integrity": "sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw==",
- "dev": true,
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.0.tgz",
- "integrity": "sha512-a5NTvk51ZndFuOLCh5OaJBELYc2O3Zqxfl3Js78VFE1zE46J2AaVuW+rEbVkQznjkmlzWsUI15BG5tQMixzZLw==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "7.16.0",
- "@typescript-eslint/visitor-keys": "7.16.0",
- "debug": "^4.3.4",
- "globby": "^11.1.0",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^1.3.0"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": {
+ "node_modules/@typescript-eslint/visitor-keys": {
"version": "7.16.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.0.tgz",
"integrity": "sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg==",
@@ -4821,23 +4658,6 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@typescript-eslint/visitor-keys": {
- "version": "7.12.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.12.0.tgz",
- "integrity": "sha512-uZk7DevrQLL3vSnfFl5bj4sL75qC9D6EdjemIdbtkuUmIheWpuiiylSY01JxJE7+zGrOWDZrp1WxOuDntvKrHQ==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "7.12.0",
- "eslint-visitor-keys": "^3.4.3"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
"node_modules/@ungap/structured-clone": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
diff --git a/package.json b/package.json
index 5aca087f6b..07bf2fc979 100644
--- a/package.json
+++ b/package.json
@@ -82,7 +82,7 @@
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
"@typescript-eslint/eslint-plugin": "^7.16.0",
- "@typescript-eslint/parser": "^7.12.0",
+ "@typescript-eslint/parser": "^7.16.0",
"@vitejs/plugin-legacy": "^5.4.1",
"@vitejs/plugin-react": "^4.3.1",
"@vitest/coverage-v8": "^1.6.0",
From a11f731da7ea066c230bcc6aa7104a18b765fb24 Mon Sep 17 00:00:00 2001
From: daniele-mng
Date: Tue, 16 Jul 2024 11:12:31 +0200
Subject: [PATCH 082/130] Fix: bug loading status button in download report
dialog
---
.../pages/reports/downloadreportdialog.jsx | 22 ++++++++-----------
1 file changed, 9 insertions(+), 13 deletions(-)
diff --git a/src/web/pages/reports/downloadreportdialog.jsx b/src/web/pages/reports/downloadreportdialog.jsx
index e3ca51b539..b4cc730c69 100644
--- a/src/web/pages/reports/downloadreportdialog.jsx
+++ b/src/web/pages/reports/downloadreportdialog.jsx
@@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React, {useState} from 'react';
import styled from 'styled-components';
@@ -19,7 +18,7 @@ import {renderSelectItems} from 'web/utils/render';
import ComposerContent, {
COMPOSER_CONTENT_DEFAULTS,
-} from 'web/components/dialog/composercontent'; /* eslint-disable-line max-len */
+} from 'web/components/dialog/composercontent';
import ThresholdMessage from 'web/pages/reports/thresholdmessage';
import SaveDialog from 'web/components/dialog/savedialog';
@@ -43,7 +42,6 @@ const DownloadReportDialog = ({
includeOverrides = COMPOSER_CONTENT_DEFAULTS.includeOverrides,
reportConfigId,
reportConfigs,
- reportFormatId,
reportFormats,
showThresholdMessage = false,
storeAsDefault,
@@ -59,10 +57,11 @@ const DownloadReportDialog = ({
reportConfigId = selectSaveId(reportConfigs, defaultReportConfigId, '');
}
- const [reportFormatIdInState, setReportFormatId] = useState(
+ const [reportFormatIdInState, setReportFormatIdInState] = useState(
selectSaveId(reportFormats, defaultReportFormatId),
);
- const [reportConfigIdInState, setReportConfigId] = useState(reportConfigId);
+ const [reportConfigIdInState, setReportConfigIdInState] =
+ useState(reportConfigId);
const unControlledValues = {
includeNotes,
@@ -71,16 +70,16 @@ const DownloadReportDialog = ({
};
const handleReportFormatIdChange = value => {
- setReportConfigId('');
- setReportFormatId(value);
+ setReportConfigIdInState('');
+ setReportFormatIdInState(value);
};
const handleReportConfigIdChange = value => {
- setReportConfigId(value);
+ setReportConfigIdInState(value);
};
- const handleSave = values => {
- onSave({
+ const handleSave = async values => {
+ await onSave({
...values,
reportConfigId: reportConfigIdInState,
reportFormatId: reportFormatIdInState,
@@ -159,7 +158,6 @@ DownloadReportDialog.propTypes = {
includeOverrides: PropTypes.number,
reportConfigId: PropTypes.id,
reportConfigs: PropTypes.array,
- reportFormatId: PropTypes.id,
reportFormats: PropTypes.array,
showThresholdMessage: PropTypes.bool,
storeAsDefault: PropTypes.bool,
@@ -169,5 +167,3 @@ DownloadReportDialog.propTypes = {
};
export default DownloadReportDialog;
-
-// vim: set ts=2 sw=2 tw=80:
From 158aaf750f50229c42f694f48d9d1584b6f46e0c Mon Sep 17 00:00:00 2001
From: Timo Pollmeier
Date: Tue, 16 Jul 2024 14:29:10 +0200
Subject: [PATCH 083/130] Fix: Make report configs optional in alerts and
reports
If the report configs are not available, the report export and alert
dialogs will hide the report config fields.
This will make the dialogs work as expected if the report config
commands are disabled.
---
src/gmp/commands/alerts.js | 23 +++++----
src/web/pages/alerts/dialog.jsx | 4 ++
src/web/pages/alerts/emailmethodpart.jsx | 47 +++++++++++--------
src/web/pages/alerts/scpmethodpart.jsx | 23 +++++----
src/web/pages/alerts/sendmethodpart.jsx | 23 +++++----
src/web/pages/alerts/smbmethodpart.jsx | 23 +++++----
src/web/pages/alerts/verinicemethodpart.jsx | 23 +++++----
.../pages/reports/downloadreportdialog.jsx | 33 +++++++------
8 files changed, 125 insertions(+), 74 deletions(-)
diff --git a/src/gmp/commands/alerts.js b/src/gmp/commands/alerts.js
index 2dbfc320cb..ab18c8ae49 100644
--- a/src/gmp/commands/alerts.js
+++ b/src/gmp/commands/alerts.js
@@ -9,6 +9,7 @@ import {map} from 'gmp/utils/array';
import registerCommand from 'gmp/command';
import {parseModelFromElement} from 'gmp/model';
+import {isDefined} from 'gmp/utils/identity';
import Alert from 'gmp/models/alert';
import Credential from 'gmp/models/credential';
@@ -190,10 +191,12 @@ class AlertCommand extends EntityCommand {
new_alert.get_report_formats_response.report_format,
format => parseModelFromElement(format, 'reportformat'),
);
- new_alert.report_configs = map(
- new_alert.get_report_configs_response.report_config,
- config => parseModelFromElement(config, 'reportconfig'),
- );
+ if (isDefined(new_alert.get_report_configs_response)) {
+ new_alert.report_configs = map(
+ new_alert.get_report_configs_response.report_config,
+ config => parseModelFromElement(config, 'reportconfig'),
+ );
+ }
new_alert.credentials = map(
new_alert.get_credentials_response.credential,
credential => Credential.fromElement(credential),
@@ -226,11 +229,13 @@ class AlertCommand extends EntityCommand {
);
delete edit_alert.get_report_formats_response;
- edit_alert.report_configs = map(
- edit_alert.get_report_configs_response.report_config,
- config => parseModelFromElement(config, 'reportconfig'),
- );
- delete edit_alert.get_report_configs_response;
+ if (isDefined(edit_alert.get_report_configs_response)) {
+ edit_alert.report_configs = map(
+ edit_alert.get_report_configs_response.report_config,
+ config => parseModelFromElement(config, 'reportconfig'),
+ );
+ delete edit_alert.get_report_configs_response;
+ }
edit_alert.credentials = map(
edit_alert.get_credentials_response.credential,
diff --git a/src/web/pages/alerts/dialog.jsx b/src/web/pages/alerts/dialog.jsx
index 8b195883e2..35edb26178 100644
--- a/src/web/pages/alerts/dialog.jsx
+++ b/src/web/pages/alerts/dialog.jsx
@@ -717,6 +717,7 @@ class AlertDialog extends React.Component {
{values.method === METHOD_TYPE_SCP && (
)}
-
- Report Config
-
+ {
+ capabilities.mayOp("get_report_configs") &&
+ <>
+ Report Config
+
+ >
+ }
)}
- Report Config
-
+ {
+ capabilities.mayOp('get_report_configs') &&
+ <>
+ Report Config
+
+ >
+ }
- Report Config
-
+ {
+ capabilities.mayOp('get_report_configs') &&
+ <>
+ Report Config
+
+ >
+ }
);
};
ScpMethodPart.propTypes = {
+ capabilities: PropTypes.capabilities.isRequired,
credentials: PropTypes.array,
prefix: PropTypes.string,
reportConfigs: PropTypes.array,
diff --git a/src/web/pages/alerts/sendmethodpart.jsx b/src/web/pages/alerts/sendmethodpart.jsx
index 97f1c7c075..c302513692 100644
--- a/src/web/pages/alerts/sendmethodpart.jsx
+++ b/src/web/pages/alerts/sendmethodpart.jsx
@@ -21,6 +21,7 @@ import TextField from 'web/components/form/textfield';
const SendMethodPart = ({
prefix,
+ capabilities,
reportConfigs,
reportFormats,
sendHost,
@@ -79,20 +80,26 @@ const SendMethodPart = ({
items={renderSelectItems(reportFormats)}
onChange={handleReportFormatIdChange}
/>
- Report Config
-
+ {
+ capabilities.mayOp('get_report_configs') &&
+ <>
+ Report Config
+
+ >
+ }
);
};
SendMethodPart.propTypes = {
+ capabilities: PropTypes.capabilities.isRequired,
prefix: PropTypes.string,
reportConfigs: PropTypes.array,
reportFormats: PropTypes.array,
diff --git a/src/web/pages/alerts/smbmethodpart.jsx b/src/web/pages/alerts/smbmethodpart.jsx
index 9da988a6ca..4d8e5f543c 100644
--- a/src/web/pages/alerts/smbmethodpart.jsx
+++ b/src/web/pages/alerts/smbmethodpart.jsx
@@ -37,6 +37,7 @@ const smbMaxProtocolItems = [
const SmbMethodPart = ({
prefix,
+ capabilities,
credentials = [],
reportConfigs,
reportFormats,
@@ -129,14 +130,19 @@ const SmbMethodPart = ({
value={reportFormatIdInState}
onChange={handleReportFormatIdChange}
/>
- Report Config
-
+ {
+ capabilities.mayOp('get_report_configs') &&
+ <>
+ Report Config
+
+ >
+ }
@@ -152,6 +158,7 @@ const SmbMethodPart = ({
};
SmbMethodPart.propTypes = {
+ capabilities: PropTypes.capabilities.isRequired,
credentials: PropTypes.array,
prefix: PropTypes.string,
reportConfigs: PropTypes.array,
diff --git a/src/web/pages/alerts/verinicemethodpart.jsx b/src/web/pages/alerts/verinicemethodpart.jsx
index a89797eb0d..2ddae3e1f6 100644
--- a/src/web/pages/alerts/verinicemethodpart.jsx
+++ b/src/web/pages/alerts/verinicemethodpart.jsx
@@ -27,6 +27,7 @@ const VERINICE_CREDENTIAL_TYPES = [USERNAME_PASSWORD_CREDENTIAL_TYPE];
const VeriniceMethodPart = ({
prefix,
+ capabilities,
veriniceServerUrl,
veriniceServerCredential,
veriniceServerReportConfig,
@@ -102,20 +103,26 @@ const VeriniceMethodPart = ({
value={reportFormatIdInState}
onChange={handleReportFormatIdChange}
/>
- Report Config
-
+ {
+ capabilities.mayOp('get_report_configs') &&
+ <>
+ Report Config
+
+ >
+ }
);
};
VeriniceMethodPart.propTypes = {
+ capabilities: PropTypes.capabilities,
credentials: PropTypes.array,
prefix: PropTypes.string,
reportConfigs: PropTypes.array,
diff --git a/src/web/pages/reports/downloadreportdialog.jsx b/src/web/pages/reports/downloadreportdialog.jsx
index b4cc730c69..dca512f3ad 100644
--- a/src/web/pages/reports/downloadreportdialog.jsx
+++ b/src/web/pages/reports/downloadreportdialog.jsx
@@ -95,9 +95,11 @@ const DownloadReportDialog = ({
onSave={handleSave}
>
{({values, onValueChange}) => {
- const filteredReportConfigs = reportConfigs.filter(
- config => config.report_format.id === reportFormatIdInState,
- );
+ const filteredReportConfigs = isDefined(reportConfigs)
+ ? reportConfigs.filter(
+ config => config.report_format.id === reportFormatIdInState,
+ )
+ : [];
return (
@@ -118,17 +120,20 @@ const DownloadReportDialog = ({
/>
-
-
-
-
-
+ {
+ isDefined(reportConfigs) &&
+
+
+
+
+
+ }
Date: Mon, 22 Jul 2024 10:42:08 +0200
Subject: [PATCH 084/130] Use withCapabilities in alert method parts
Instead of passing the capabilities as a prop, use withCapabilities in
the dialog part components for the alert methods SCP, Send, SMB and
Verinice.
---
src/web/pages/alerts/dialog.jsx | 4 ----
src/web/pages/alerts/scpmethodpart.jsx | 4 +++-
src/web/pages/alerts/sendmethodpart.jsx | 4 +++-
src/web/pages/alerts/smbmethodpart.jsx | 4 +++-
src/web/pages/alerts/verinicemethodpart.jsx | 4 +++-
5 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/src/web/pages/alerts/dialog.jsx b/src/web/pages/alerts/dialog.jsx
index 35edb26178..8b195883e2 100644
--- a/src/web/pages/alerts/dialog.jsx
+++ b/src/web/pages/alerts/dialog.jsx
@@ -717,7 +717,6 @@ class AlertDialog extends React.Component {
{values.method === METHOD_TYPE_SCP && (
Date: Mon, 22 Jul 2024 11:27:41 +0200
Subject: [PATCH 085/130] Use useCapabilities hook in alert method parts
Instead of using the withCapabilities HOC, the alert method parts now
use the useCapabilities hook.
---
src/web/pages/alerts/emailmethodpart.jsx | 9 ++++-----
src/web/pages/alerts/scpmethodpart.jsx | 8 +++-----
src/web/pages/alerts/sendmethodpart.jsx | 8 +++-----
src/web/pages/alerts/smbmethodpart.jsx | 8 +++-----
src/web/pages/alerts/verinicemethodpart.jsx | 8 +++-----
5 files changed, 16 insertions(+), 25 deletions(-)
diff --git a/src/web/pages/alerts/emailmethodpart.jsx b/src/web/pages/alerts/emailmethodpart.jsx
index 183776bb4c..213451dc87 100644
--- a/src/web/pages/alerts/emailmethodpart.jsx
+++ b/src/web/pages/alerts/emailmethodpart.jsx
@@ -34,14 +34,13 @@ import Divider from 'web/components/layout/divider';
import IconDivider from 'web/components/layout/icondivider';
import Layout from 'web/components/layout/layout';
-import compose from 'web/utils/compose';
+import useCapabilities from "web/hooks/useCapabilities";
+
import PropTypes from 'web/utils/proptypes';
import {renderSelectItems, UNSET_VALUE} from 'web/utils/render';
-import withCapabilities from 'web/utils/withCapabilities';
import withPrefix from 'web/utils/withPrefix';
const EmailMethodPart = ({
- capabilities,
credentials = [],
fromAddress,
event,
@@ -62,6 +61,7 @@ const EmailMethodPart = ({
onCredentialChange,
onNewCredentialClick,
}) => {
+ const capabilities = useCapabilities();
const taskEvent = isTaskEvent(event);
const secinfoEvent = isSecinfoEvent(event);
const textReportFormatItems = renderSelectItems(
@@ -295,7 +295,6 @@ const EmailMethodPart = ({
EmailMethodPart.propTypes = {
attachConfigItems: PropTypes.array,
- capabilities: PropTypes.capabilities.isRequired,
credentials: PropTypes.array,
event: PropTypes.string.isRequired,
fromAddress: PropTypes.string.isRequired,
@@ -318,6 +317,6 @@ EmailMethodPart.propTypes = {
onNewCredentialClick: PropTypes.func,
};
-export default compose(withCapabilities, withPrefix)(EmailMethodPart);
+export default withPrefix(EmailMethodPart);
// vim: set ts=2 sw=2 tw=80:
diff --git a/src/web/pages/alerts/scpmethodpart.jsx b/src/web/pages/alerts/scpmethodpart.jsx
index fedef4fdb1..6d0c4693e4 100644
--- a/src/web/pages/alerts/scpmethodpart.jsx
+++ b/src/web/pages/alerts/scpmethodpart.jsx
@@ -18,9 +18,8 @@ import Layout from 'web/components/layout/layout';
import PropTypes from 'web/utils/proptypes';
+import useCapabilities from "web/hooks/useCapabilities";
import {renderSelectItems, UNSET_VALUE} from '../../utils/render';
-import compose from "web/utils/compose";
-import withCapabilities from "web/utils/withCapabilities";
import withPrefix from 'web/utils/withPrefix';
import Select from 'web/components/form/select';
@@ -33,7 +32,6 @@ import NewIcon from 'web/components/icon/newicon';
const ScpMethodPart = ({
prefix,
- capabilities,
credentials = [],
reportFormats,
reportConfigs,
@@ -48,6 +46,7 @@ const ScpMethodPart = ({
onCredentialChange,
onNewCredentialClick,
}) => {
+ const capabilities = useCapabilities();
const [reportFormatIdInState, setReportFormatId] = useState(
selectSaveId(reportFormats, scpReportFormat),
);
@@ -158,7 +157,6 @@ const ScpMethodPart = ({
};
ScpMethodPart.propTypes = {
- capabilities: PropTypes.capabilities.isRequired,
credentials: PropTypes.array,
prefix: PropTypes.string,
reportConfigs: PropTypes.array,
@@ -175,6 +173,6 @@ ScpMethodPart.propTypes = {
onNewCredentialClick: PropTypes.func.isRequired,
};
-export default compose(withCapabilities, withPrefix)(ScpMethodPart);
+export default withPrefix(ScpMethodPart);
// vim: set ts=2 sw=2 tw=80:
diff --git a/src/web/pages/alerts/sendmethodpart.jsx b/src/web/pages/alerts/sendmethodpart.jsx
index 19bd6789ca..4a16e2f967 100644
--- a/src/web/pages/alerts/sendmethodpart.jsx
+++ b/src/web/pages/alerts/sendmethodpart.jsx
@@ -12,9 +12,8 @@ import _ from 'gmp/locale';
import Divider from 'web/components/layout/divider';
import Layout from 'web/components/layout/layout';
+import useCapabilities from "web/hooks/useCapabilities";
import PropTypes from 'web/utils/proptypes';
-import compose from "web/utils/compose";
-import withCapabilities from "web/utils/withCapabilities";
import withPrefix from 'web/utils/withPrefix';
import Select from 'web/components/form/select';
@@ -23,7 +22,6 @@ import TextField from 'web/components/form/textfield';
const SendMethodPart = ({
prefix,
- capabilities,
reportConfigs,
reportFormats,
sendHost,
@@ -32,6 +30,7 @@ const SendMethodPart = ({
sendReportFormat,
onChange,
}) => {
+ const capabilities = useCapabilities();
const [reportFormatIdInState, setReportFormatId] = useState(
selectSaveId(reportFormats, sendReportFormat),
);
@@ -101,7 +100,6 @@ const SendMethodPart = ({
};
SendMethodPart.propTypes = {
- capabilities: PropTypes.capabilities.isRequired,
prefix: PropTypes.string,
reportConfigs: PropTypes.array,
reportFormats: PropTypes.array,
@@ -112,6 +110,6 @@ SendMethodPart.propTypes = {
onChange: PropTypes.func,
};
-export default compose(withCapabilities, withPrefix)(SendMethodPart);
+export default withPrefix(SendMethodPart);
// vim: set ts=2 sw=2 tw=80:
diff --git a/src/web/pages/alerts/smbmethodpart.jsx b/src/web/pages/alerts/smbmethodpart.jsx
index 7df5ff4a2b..01e241382a 100644
--- a/src/web/pages/alerts/smbmethodpart.jsx
+++ b/src/web/pages/alerts/smbmethodpart.jsx
@@ -19,9 +19,8 @@ import Layout from 'web/components/layout/layout';
import PropTypes from 'web/utils/proptypes';
+import useCapabilities from "web/hooks/useCapabilities";
import {renderSelectItems, UNSET_VALUE} from 'web/utils/render';
-import compose from "web/utils/compose";
-import withCapabilities from "web/utils/withCapabilities";
import withPrefix from 'web/utils/withPrefix';
import Select from 'web/components/form/select';
@@ -39,7 +38,6 @@ const smbMaxProtocolItems = [
const SmbMethodPart = ({
prefix,
- capabilities,
credentials = [],
reportConfigs,
reportFormats,
@@ -53,6 +51,7 @@ const SmbMethodPart = ({
onNewCredentialClick,
onCredentialChange,
}) => {
+ const capabilities = useCapabilities();
const [reportFormatIdInState, setReportFormatId] = useState(
selectSaveId(reportFormats, smbReportFormat),
);
@@ -160,7 +159,6 @@ const SmbMethodPart = ({
};
SmbMethodPart.propTypes = {
- capabilities: PropTypes.capabilities.isRequired,
credentials: PropTypes.array,
prefix: PropTypes.string,
reportConfigs: PropTypes.array,
@@ -176,6 +174,6 @@ SmbMethodPart.propTypes = {
onNewCredentialClick: PropTypes.func.isRequired,
};
-export default compose(withCapabilities, withPrefix)(SmbMethodPart);
+export default withPrefix(SmbMethodPart);
// vim: set ts=2 sw=2 tw=80:
diff --git a/src/web/pages/alerts/verinicemethodpart.jsx b/src/web/pages/alerts/verinicemethodpart.jsx
index 37b9249a2a..506a744123 100644
--- a/src/web/pages/alerts/verinicemethodpart.jsx
+++ b/src/web/pages/alerts/verinicemethodpart.jsx
@@ -13,10 +13,9 @@ import {USERNAME_PASSWORD_CREDENTIAL_TYPE} from 'gmp/models/credential';
import Divider from 'web/components/layout/divider';
import Layout from 'web/components/layout/layout';
+import useCapabilities from "web/hooks/useCapabilities";
import PropTypes from 'web/utils/proptypes';
import {renderSelectItems, UNSET_VALUE} from '../../utils/render';
-import compose from "web/utils/compose";
-import withCapabilities from "web/utils/withCapabilities";
import withPrefix from 'web/utils/withPrefix';
import Select from 'web/components/form/select';
@@ -29,7 +28,6 @@ const VERINICE_CREDENTIAL_TYPES = [USERNAME_PASSWORD_CREDENTIAL_TYPE];
const VeriniceMethodPart = ({
prefix,
- capabilities,
veriniceServerUrl,
veriniceServerCredential,
veriniceServerReportConfig,
@@ -41,6 +39,7 @@ const VeriniceMethodPart = ({
onCredentialChange,
onNewCredentialClick,
}) => {
+ const capabilities = useCapabilities();
reportFormats = reportFormats.filter(format => format.extension === 'vna');
credentials = credentials.filter(
cred => cred.credential_type === USERNAME_PASSWORD_CREDENTIAL_TYPE,
@@ -124,7 +123,6 @@ const VeriniceMethodPart = ({
};
VeriniceMethodPart.propTypes = {
- capabilities: PropTypes.capabilities,
credentials: PropTypes.array,
prefix: PropTypes.string,
reportConfigs: PropTypes.array,
@@ -138,6 +136,6 @@ VeriniceMethodPart.propTypes = {
onNewCredentialClick: PropTypes.func.isRequired,
};
-export default compose(withCapabilities, withPrefix)(VeriniceMethodPart);
+export default withPrefix(VeriniceMethodPart);
// vim: set ts=2 sw=2 tw=80:
From 6fc8b0acbd9042889f96c4108937b265ba7ea7cd Mon Sep 17 00:00:00 2001
From: Greenbone Bot
Date: Tue, 23 Jul 2024 08:46:18 +0000
Subject: [PATCH 086/130] Automatic release to 23.2.0
---
package.json | 2 +-
src/version.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/package.json b/package.json
index 07bf2fc979..748f8e1d49 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "gsa",
- "version": "23.1.2-dev1",
+ "version": "23.2.0",
"description": "Greenbone Security Assistant",
"keywords": [
"openvas",
diff --git a/src/version.js b/src/version.js
index 2240a415f6..5facd68fef 100644
--- a/src/version.js
+++ b/src/version.js
@@ -15,7 +15,7 @@ const getMajorMinorVersion = () => {
return `${major}.${minor}`;
};
-export const VERSION = '23.1.2-dev1';
+export const VERSION = '23.2.0';
export const RELEASE_VERSION = getMajorMinorVersion();
From 8195cd61870709107d436289acce5323babab381 Mon Sep 17 00:00:00 2001
From: Greenbone Bot
Date: Tue, 23 Jul 2024 08:46:20 +0000
Subject: [PATCH 087/130] Automatic adjustments after release [skip ci]
* Update to version 23.2.1-dev1
---
package.json | 2 +-
src/version.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/package.json b/package.json
index 748f8e1d49..0deebdfbf9 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "gsa",
- "version": "23.2.0",
+ "version": "23.2.1-dev1",
"description": "Greenbone Security Assistant",
"keywords": [
"openvas",
diff --git a/src/version.js b/src/version.js
index 5facd68fef..8e3c76874b 100644
--- a/src/version.js
+++ b/src/version.js
@@ -15,7 +15,7 @@ const getMajorMinorVersion = () => {
return `${major}.${minor}`;
};
-export const VERSION = '23.2.0';
+export const VERSION = '23.2.1-dev1';
export const RELEASE_VERSION = getMajorMinorVersion();
From daa891097e07ce0d583b40e73b0ac5dcf1f1d16a Mon Sep 17 00:00:00 2001
From: Timo Pollmeier
Date: Thu, 25 Jul 2024 11:23:26 +0200
Subject: [PATCH 088/130] Fix: Disable mangling in production build minify
The production build now uses terser with the "mangle" option
deactivated.
This addresses a false positive Lintian warning from a mangled variable
name.
---
vite.config.ts | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/vite.config.ts b/vite.config.ts
index 2d1522806b..ca197e12df 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -48,5 +48,9 @@ export default defineConfig({
},
build: {
outDir: 'build',
+ minify: 'terser',
+ terserOptions: {
+ mangle: false,
+ },
},
});
From 6f39103909032b73c66660548adb508e40939e9c Mon Sep 17 00:00:00 2001
From: Greenbone Bot
Date: Thu, 25 Jul 2024 10:05:52 +0000
Subject: [PATCH 089/130] Automatic release to 23.2.1
---
package.json | 2 +-
src/version.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/package.json b/package.json
index 0deebdfbf9..917d626bef 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "gsa",
- "version": "23.2.1-dev1",
+ "version": "23.2.1",
"description": "Greenbone Security Assistant",
"keywords": [
"openvas",
diff --git a/src/version.js b/src/version.js
index 8e3c76874b..ba57d6370f 100644
--- a/src/version.js
+++ b/src/version.js
@@ -15,7 +15,7 @@ const getMajorMinorVersion = () => {
return `${major}.${minor}`;
};
-export const VERSION = '23.2.1-dev1';
+export const VERSION = '23.2.1';
export const RELEASE_VERSION = getMajorMinorVersion();
From 1a00dbd643d8741d77f290547704e5f02ad56cae Mon Sep 17 00:00:00 2001
From: Greenbone Bot
Date: Thu, 25 Jul 2024 10:05:54 +0000
Subject: [PATCH 090/130] Automatic adjustments after release [skip ci]
* Update to version 23.2.2-dev1
---
package.json | 2 +-
src/version.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/package.json b/package.json
index 917d626bef..84539d3ac5 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "gsa",
- "version": "23.2.1",
+ "version": "23.2.2-dev1",
"description": "Greenbone Security Assistant",
"keywords": [
"openvas",
diff --git a/src/version.js b/src/version.js
index ba57d6370f..93c0375919 100644
--- a/src/version.js
+++ b/src/version.js
@@ -15,7 +15,7 @@ const getMajorMinorVersion = () => {
return `${major}.${minor}`;
};
-export const VERSION = '23.2.1';
+export const VERSION = '23.2.2-dev1';
export const RELEASE_VERSION = getMajorMinorVersion();
From cf4f4ebf85f1244c2f81db8e7c2366d3dda2d64c Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 29 Jul 2024 22:26:59 +0000
Subject: [PATCH 091/130] Bump fast-xml-parser from 4.3.6 to 4.4.1
Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) from 4.3.6 to 4.4.1.
- [Release notes](https://github.com/NaturalIntelligence/fast-xml-parser/releases)
- [Changelog](https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/NaturalIntelligence/fast-xml-parser/compare/v4.3.6...v4.4.1)
---
updated-dependencies:
- dependency-name: fast-xml-parser
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
---
package-lock.json | 12 ++++++------
package.json | 2 +-
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 5001f7d7fd..ab7e1aa167 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "gsa",
- "version": "23.1.2-dev1",
+ "version": "23.2.2-dev1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "gsa",
- "version": "23.1.2-dev1",
+ "version": "23.2.2-dev1",
"license": "AGPL-3.0+",
"dependencies": {
"@reduxjs/toolkit": "^2.2.6",
@@ -26,7 +26,7 @@
"d3-shape": "^3.2.0",
"downshift": "^9.0.6",
"fast-deep-equal": "^3.1.3",
- "fast-xml-parser": "^4.2.5",
+ "fast-xml-parser": "^4.4.1",
"history": "^4.10.1",
"hoist-non-react-statics": "^3.3.2",
"i18next": "^23.11.5",
@@ -7630,9 +7630,9 @@
"dev": true
},
"node_modules/fast-xml-parser": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.6.tgz",
- "integrity": "sha512-M2SovcRxD4+vC493Uc2GZVcZaj66CCJhWurC4viynVSTvrpErCShNcDz1lAho6n9REQKvL/ll4A4/fw6Y9z8nw==",
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz",
+ "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==",
"funding": [
{
"type": "github",
diff --git a/package.json b/package.json
index 84539d3ac5..45eeff8446 100644
--- a/package.json
+++ b/package.json
@@ -49,7 +49,7 @@
"d3-shape": "^3.2.0",
"downshift": "^9.0.6",
"fast-deep-equal": "^3.1.3",
- "fast-xml-parser": "^4.2.5",
+ "fast-xml-parser": "^4.4.1",
"history": "^4.10.1",
"hoist-non-react-statics": "^3.3.2",
"i18next": "^23.11.5",
From a95e44cd3271c4367a908a5d4075bf2169ac34b2 Mon Sep 17 00:00:00 2001
From: daniele-mng
Date: Wed, 24 Jul 2024 12:35:47 +0200
Subject: [PATCH 092/130] add: cvss 4 calculator missing de translation
---
package-lock.json | 4 ++--
public/locales/gsa-de.json | 1 +
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 5001f7d7fd..b7eb13cce0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "gsa",
- "version": "23.1.2-dev1",
+ "version": "23.2.1-dev1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "gsa",
- "version": "23.1.2-dev1",
+ "version": "23.2.1-dev1",
"license": "AGPL-3.0+",
"dependencies": {
"@reduxjs/toolkit": "^2.2.6",
diff --git a/public/locales/gsa-de.json b/public/locales/gsa-de.json
index 4f17839c13..24374558ee 100644
--- a/public/locales/gsa-de.json
+++ b/public/locales/gsa-de.json
@@ -560,6 +560,7 @@
"Effect": "Auswirkung",
"Elevate privileges": "Berechtigungen erweitern",
"Environmental (Modified Base Metrics)": "Umgebung (Modifizierte Basismetriken)",
+ "Environmental (Security Requirements)": "Umgebung (Sicherheitsanforderungen)",
"Email": "E-Mail",
"Email Encryption": "E-Mail-Verschlüsselung",
"Email report to": "E-Mail-Bericht an",
From d2c855592eb21b579d8809425cf6238835d56f95 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 5 Aug 2024 10:16:27 +0200
Subject: [PATCH 093/130] Deps: Bump eslint-plugin-react from 7.34.3 to 7.35.0
(#4118)
Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.34.3 to 7.35.0.
- [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases)
- [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.34.3...v7.35.0)
---
updated-dependencies:
- dependency-name: eslint-plugin-react
dependency-type: direct:development
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package-lock.json | 55 ++++++++++++++++-------------------------------
package.json | 2 +-
2 files changed, 19 insertions(+), 38 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index ab7e1aa167..ff67e58256 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -68,7 +68,7 @@
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-header": "^3.1.1",
- "eslint-plugin-react": "^7.34.3",
+ "eslint-plugin-react": "^7.35.0",
"eslint-plugin-react-hooks": "^4.6.2",
"eslint-plugin-react-refresh": "^0.4.8",
"eslint-plugin-vitest-globals": "^1.5.0",
@@ -5334,18 +5334,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/array.prototype.toreversed": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz",
- "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0"
- }
- },
"node_modules/array.prototype.tosorted": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
@@ -7204,35 +7192,35 @@
}
},
"node_modules/eslint-plugin-react": {
- "version": "7.34.3",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz",
- "integrity": "sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==",
+ "version": "7.35.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz",
+ "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==",
"dev": true,
"dependencies": {
"array-includes": "^3.1.8",
"array.prototype.findlast": "^1.2.5",
"array.prototype.flatmap": "^1.3.2",
- "array.prototype.toreversed": "^1.1.2",
"array.prototype.tosorted": "^1.1.4",
"doctrine": "^2.1.0",
"es-iterator-helpers": "^1.0.19",
"estraverse": "^5.3.0",
+ "hasown": "^2.0.2",
"jsx-ast-utils": "^2.4.1 || ^3.0.0",
"minimatch": "^3.1.2",
"object.entries": "^1.1.8",
"object.fromentries": "^2.0.8",
- "object.hasown": "^1.1.4",
"object.values": "^1.2.0",
"prop-types": "^15.8.1",
"resolve": "^2.0.0-next.5",
"semver": "^6.3.1",
- "string.prototype.matchall": "^4.0.11"
+ "string.prototype.matchall": "^4.0.11",
+ "string.prototype.repeat": "^1.0.0"
},
"engines": {
"node": ">=4"
},
"peerDependencies": {
- "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
}
},
"node_modules/eslint-plugin-react-hooks": {
@@ -11084,23 +11072,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/object.hasown": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz",
- "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==",
- "dev": true,
- "dependencies": {
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.2",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/object.values": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz",
@@ -12736,6 +12707,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/string.prototype.repeat": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
+ "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ }
+ },
"node_modules/string.prototype.trim": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
diff --git a/package.json b/package.json
index 45eeff8446..eb571fef47 100644
--- a/package.json
+++ b/package.json
@@ -91,7 +91,7 @@
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-header": "^3.1.1",
- "eslint-plugin-react": "^7.34.3",
+ "eslint-plugin-react": "^7.35.0",
"eslint-plugin-react-hooks": "^4.6.2",
"eslint-plugin-react-refresh": "^0.4.8",
"eslint-plugin-vitest-globals": "^1.5.0",
From a167ad6aa64554d4110ffd8a533ebf77f148d3e7 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 5 Aug 2024 11:31:37 +0200
Subject: [PATCH 094/130] Deps: Bump @typescript-eslint/parser from 7.16.0 to
7.18.0 (#4114)
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 7.16.0 to 7.18.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.18.0/packages/parser)
---
updated-dependencies:
- dependency-name: "@typescript-eslint/parser"
dependency-type: direct:development
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: daniele-mng
---
package-lock.json | 91 ++++++++++++++++++++++++++++++++++++++++++-----
package.json | 2 +-
2 files changed, 84 insertions(+), 9 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index ff67e58256..1404e29987 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -59,7 +59,7 @@
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
"@typescript-eslint/eslint-plugin": "^7.16.0",
- "@typescript-eslint/parser": "^7.16.0",
+ "@typescript-eslint/parser": "^7.18.0",
"@vitejs/plugin-legacy": "^5.4.1",
"@vitejs/plugin-react": "^4.3.1",
"@vitest/coverage-v8": "^1.6.0",
@@ -4507,15 +4507,15 @@
}
},
"node_modules/@typescript-eslint/parser": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.16.0.tgz",
- "integrity": "sha512-ar9E+k7CU8rWi2e5ErzQiC93KKEFAXA2Kky0scAlPcxYblLt8+XZuHUZwlyfXILyQa95P6lQg+eZgh/dDs3+Vw==",
+ "version": "7.18.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz",
+ "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==",
"dev": true,
"dependencies": {
- "@typescript-eslint/scope-manager": "7.16.0",
- "@typescript-eslint/types": "7.16.0",
- "@typescript-eslint/typescript-estree": "7.16.0",
- "@typescript-eslint/visitor-keys": "7.16.0",
+ "@typescript-eslint/scope-manager": "7.18.0",
+ "@typescript-eslint/types": "7.18.0",
+ "@typescript-eslint/typescript-estree": "7.18.0",
+ "@typescript-eslint/visitor-keys": "7.18.0",
"debug": "^4.3.4"
},
"engines": {
@@ -4534,6 +4534,81 @@
}
}
},
+ "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz",
+ "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "7.18.0",
+ "@typescript-eslint/visitor-keys": "7.18.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
+ "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz",
+ "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "7.18.0",
+ "@typescript-eslint/visitor-keys": "7.18.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz",
+ "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "7.18.0",
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
"node_modules/@typescript-eslint/scope-manager": {
"version": "7.16.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.0.tgz",
diff --git a/package.json b/package.json
index eb571fef47..2949a1ee06 100644
--- a/package.json
+++ b/package.json
@@ -82,7 +82,7 @@
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
"@typescript-eslint/eslint-plugin": "^7.16.0",
- "@typescript-eslint/parser": "^7.16.0",
+ "@typescript-eslint/parser": "^7.18.0",
"@vitejs/plugin-legacy": "^5.4.1",
"@vitejs/plugin-react": "^4.3.1",
"@vitest/coverage-v8": "^1.6.0",
From 43cc2cae2d1fc88253199fe8a77321d02a4ba822 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 5 Aug 2024 13:02:14 +0200
Subject: [PATCH 095/130] Deps: Bump i18next from 23.11.5 to 23.12.2 (#4117)
Bumps [i18next](https://github.com/i18next/i18next) from 23.11.5 to 23.12.2.
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v23.11.5...v23.12.2)
---
updated-dependencies:
- dependency-name: i18next
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package-lock.json | 8 ++++----
package.json | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 1404e29987..8d245ffe56 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -29,7 +29,7 @@
"fast-xml-parser": "^4.4.1",
"history": "^4.10.1",
"hoist-non-react-statics": "^3.3.2",
- "i18next": "^23.11.5",
+ "i18next": "^23.12.2",
"i18next-http-backend": "^2.5.2",
"ical.js": "^2.0.0",
"memoize-one": "^6.0.0",
@@ -8430,9 +8430,9 @@
}
},
"node_modules/i18next": {
- "version": "23.11.5",
- "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.11.5.tgz",
- "integrity": "sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA==",
+ "version": "23.12.2",
+ "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.12.2.tgz",
+ "integrity": "sha512-XIeh5V+bi8SJSWGL3jqbTEBW5oD6rbP5L+E7dVQh1MNTxxYef0x15rhJVcRb7oiuq4jLtgy2SD8eFlf6P2cmqg==",
"funding": [
{
"type": "individual",
diff --git a/package.json b/package.json
index 2949a1ee06..13ec5c94b4 100644
--- a/package.json
+++ b/package.json
@@ -52,7 +52,7 @@
"fast-xml-parser": "^4.4.1",
"history": "^4.10.1",
"hoist-non-react-statics": "^3.3.2",
- "i18next": "^23.11.5",
+ "i18next": "^23.12.2",
"i18next-http-backend": "^2.5.2",
"ical.js": "^2.0.0",
"memoize-one": "^6.0.0",
From 8922d0dd600e0170c6b9c63aa25f2ead45bff5f0 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 5 Aug 2024 14:49:50 +0200
Subject: [PATCH 096/130] Deps: Bump @typescript-eslint/eslint-plugin from
7.16.0 to 8.0.0 (#4113)
* Deps: Bump @typescript-eslint/eslint-plugin from 7.16.0 to 8.0.0
Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 7.16.0 to 8.0.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.0.0/packages/eslint-plugin)
---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
dependency-type: direct:development
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
* update ts eslint parser version
---------
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: daniele-mng
---
package-lock.json | 190 ++++++++++++++--------------------------------
package.json | 8 +-
2 files changed, 60 insertions(+), 138 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 8d245ffe56..008a5fc34a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -58,8 +58,8 @@
"@testing-library/user-event": "^13.5.0",
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
- "@typescript-eslint/eslint-plugin": "^7.16.0",
- "@typescript-eslint/parser": "^7.18.0",
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
+ "@typescript-eslint/parser": "^8.0.0",
"@vitejs/plugin-legacy": "^5.4.1",
"@vitejs/plugin-react": "^4.3.1",
"@vitest/coverage-v8": "^1.6.0",
@@ -4474,31 +4474,31 @@
"peer": true
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.0.tgz",
- "integrity": "sha512-py1miT6iQpJcs1BiJjm54AMzeuMPBSPuKPlnT8HlfudbcS5rYeX5jajpLf3mrdRh9dA/Ec2FVUY0ifeVNDIhZw==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.0.0.tgz",
+ "integrity": "sha512-STIZdwEQRXAHvNUS6ILDf5z3u95Gc8jzywunxSNqX00OooIemaaNIA0vEgynJlycL5AjabYLLrIyHd4iazyvtg==",
"dev": true,
"dependencies": {
"@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "7.16.0",
- "@typescript-eslint/type-utils": "7.16.0",
- "@typescript-eslint/utils": "7.16.0",
- "@typescript-eslint/visitor-keys": "7.16.0",
+ "@typescript-eslint/scope-manager": "8.0.0",
+ "@typescript-eslint/type-utils": "8.0.0",
+ "@typescript-eslint/utils": "8.0.0",
+ "@typescript-eslint/visitor-keys": "8.0.0",
"graphemer": "^1.4.0",
"ignore": "^5.3.1",
"natural-compare": "^1.4.0",
"ts-api-utils": "^1.3.0"
},
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "@typescript-eslint/parser": "^7.0.0",
- "eslint": "^8.56.0"
+ "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0",
+ "eslint": "^8.57.0 || ^9.0.0"
},
"peerDependenciesMeta": {
"typescript": {
@@ -4507,84 +4507,26 @@
}
},
"node_modules/@typescript-eslint/parser": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz",
- "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.0.0.tgz",
+ "integrity": "sha512-pS1hdZ+vnrpDIxuFXYQpLTILglTjSYJ9MbetZctrUawogUsPdz31DIIRZ9+rab0LhYNTsk88w4fIzVheiTbWOQ==",
"dev": true,
"dependencies": {
- "@typescript-eslint/scope-manager": "7.18.0",
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/typescript-estree": "7.18.0",
- "@typescript-eslint/visitor-keys": "7.18.0",
+ "@typescript-eslint/scope-manager": "8.0.0",
+ "@typescript-eslint/types": "8.0.0",
+ "@typescript-eslint/typescript-estree": "8.0.0",
+ "@typescript-eslint/visitor-keys": "8.0.0",
"debug": "^4.3.4"
},
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^8.56.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz",
- "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/visitor-keys": "7.18.0"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
- "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
- "dev": true,
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz",
- "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/visitor-keys": "7.18.0",
- "debug": "^4.3.4",
- "globby": "^11.1.0",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^1.3.0"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "eslint": "^8.57.0 || ^9.0.0"
},
"peerDependenciesMeta": {
"typescript": {
@@ -4592,34 +4534,17 @@
}
}
},
- "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz",
- "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "7.18.0",
- "eslint-visitor-keys": "^3.4.3"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
"node_modules/@typescript-eslint/scope-manager": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.0.tgz",
- "integrity": "sha512-8gVv3kW6n01Q6TrI1cmTZ9YMFi3ucDT7i7aI5lEikk2ebk1AEjrwX8MDTdaX5D7fPXMBLvnsaa0IFTAu+jcfOw==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.0.tgz",
+ "integrity": "sha512-V0aa9Csx/ZWWv2IPgTfY7T4agYwJyILESu/PVqFtTFz9RIS823mAze+NbnBI8xiwdX3iqeQbcTYlvB04G9wyQw==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "7.16.0",
- "@typescript-eslint/visitor-keys": "7.16.0"
+ "@typescript-eslint/types": "8.0.0",
+ "@typescript-eslint/visitor-keys": "8.0.0"
},
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
@@ -4627,26 +4552,23 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.0.tgz",
- "integrity": "sha512-j0fuUswUjDHfqV/UdW6mLtOQQseORqfdmoBNDFOqs9rvNVR2e+cmu6zJu/Ku4SDuqiJko6YnhwcL8x45r8Oqxg==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.0.0.tgz",
+ "integrity": "sha512-mJAFP2mZLTBwAn5WI4PMakpywfWFH5nQZezUQdSKV23Pqo6o9iShQg1hP2+0hJJXP2LnZkWPphdIq4juYYwCeg==",
"dev": true,
"dependencies": {
- "@typescript-eslint/typescript-estree": "7.16.0",
- "@typescript-eslint/utils": "7.16.0",
+ "@typescript-eslint/typescript-estree": "8.0.0",
+ "@typescript-eslint/utils": "8.0.0",
"debug": "^4.3.4",
"ts-api-utils": "^1.3.0"
},
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
- "peerDependencies": {
- "eslint": "^8.56.0"
- },
"peerDependenciesMeta": {
"typescript": {
"optional": true
@@ -4654,12 +4576,12 @@
}
},
"node_modules/@typescript-eslint/types": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.0.tgz",
- "integrity": "sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.0.tgz",
+ "integrity": "sha512-wgdSGs9BTMWQ7ooeHtu5quddKKs5Z5dS+fHLbrQI+ID0XWJLODGMHRfhwImiHoeO2S5Wir2yXuadJN6/l4JRxw==",
"dev": true,
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
@@ -4667,13 +4589,13 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.0.tgz",
- "integrity": "sha512-a5NTvk51ZndFuOLCh5OaJBELYc2O3Zqxfl3Js78VFE1zE46J2AaVuW+rEbVkQznjkmlzWsUI15BG5tQMixzZLw==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.0.tgz",
+ "integrity": "sha512-5b97WpKMX+Y43YKi4zVcCVLtK5F98dFls3Oxui8LbnmRsseKenbbDinmvxrWegKDMmlkIq/XHuyy0UGLtpCDKg==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "7.16.0",
- "@typescript-eslint/visitor-keys": "7.16.0",
+ "@typescript-eslint/types": "8.0.0",
+ "@typescript-eslint/visitor-keys": "8.0.0",
"debug": "^4.3.4",
"globby": "^11.1.0",
"is-glob": "^4.0.3",
@@ -4682,7 +4604,7 @@
"ts-api-utils": "^1.3.0"
},
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
@@ -4695,38 +4617,38 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.0.tgz",
- "integrity": "sha512-PqP4kP3hb4r7Jav+NiRCntlVzhxBNWq6ZQ+zQwII1y/G/1gdIPeYDCKr2+dH6049yJQsWZiHU6RlwvIFBXXGNA==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.0.0.tgz",
+ "integrity": "sha512-k/oS/A/3QeGLRvOWCg6/9rATJL5rec7/5s1YmdS0ZU6LHveJyGFwBvLhSRBv6i9xaj7etmosp+l+ViN1I9Aj/Q==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "7.16.0",
- "@typescript-eslint/types": "7.16.0",
- "@typescript-eslint/typescript-estree": "7.16.0"
+ "@typescript-eslint/scope-manager": "8.0.0",
+ "@typescript-eslint/types": "8.0.0",
+ "@typescript-eslint/typescript-estree": "8.0.0"
},
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^8.56.0"
+ "eslint": "^8.57.0 || ^9.0.0"
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.0.tgz",
- "integrity": "sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.0.tgz",
+ "integrity": "sha512-oN0K4nkHuOyF3PVMyETbpP5zp6wfyOvm7tWhTMfoqxSSsPmJIh6JNASuZDlODE8eE+0EB9uar+6+vxr9DBTYOA==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "7.16.0",
+ "@typescript-eslint/types": "8.0.0",
"eslint-visitor-keys": "^3.4.3"
},
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
diff --git a/package.json b/package.json
index 13ec5c94b4..608d46952d 100644
--- a/package.json
+++ b/package.json
@@ -13,7 +13,7 @@
"type": "git",
"url": "https://github.com/greenbone/gsa/"
},
- "author": "Bj\u00f6rn Ricks ",
+ "author": "Björn Ricks ",
"license": "AGPL-3.0+",
"type": "module",
"scripts": {
@@ -81,8 +81,8 @@
"@testing-library/user-event": "^13.5.0",
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
- "@typescript-eslint/eslint-plugin": "^7.16.0",
- "@typescript-eslint/parser": "^7.18.0",
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
+ "@typescript-eslint/parser": "^8.0.0",
"@vitejs/plugin-legacy": "^5.4.1",
"@vitejs/plugin-react": "^4.3.1",
"@vitest/coverage-v8": "^1.6.0",
@@ -116,4 +116,4 @@
"prettier --write"
]
}
-}
\ No newline at end of file
+}
From ffaf5d255da4745d4277c215ddbb8710dfd0cff1 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 5 Aug 2024 16:10:13 +0200
Subject: [PATCH 097/130] Deps: Bump @sentry/react from 8.13.0 to 8.22.0
(#4119)
Bumps [@sentry/react](https://github.com/getsentry/sentry-javascript) from 8.13.0 to 8.22.0.
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.13.0...8.22.0)
---
updated-dependencies:
- dependency-name: "@sentry/react"
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package-lock.json | 114 +++++++++++++++++++++++-----------------------
package.json | 2 +-
2 files changed, 58 insertions(+), 58 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 008a5fc34a..e635d7f461 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,7 +10,7 @@
"license": "AGPL-3.0+",
"dependencies": {
"@reduxjs/toolkit": "^2.2.6",
- "@sentry/react": "^8.13.0",
+ "@sentry/react": "^8.22.0",
"@visx/axis": "^3.10.1",
"@visx/gradient": "^3.3.0",
"@visx/shape": "^3.5.0",
@@ -3635,97 +3635,97 @@
]
},
"node_modules/@sentry-internal/browser-utils": {
- "version": "8.13.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.13.0.tgz",
- "integrity": "sha512-lqq8BYbbs9KTlDuyB5NjdZB6P/llqQs32KUgaCQ/k5DFB4Zf56+BFHXObnMHxwx375X1uixtnEphagWZa+nsLQ==",
+ "version": "8.22.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.22.0.tgz",
+ "integrity": "sha512-R0u8KPaSivueIwUOhmYxcisKaJq3gx+I0xOcWoluDB3OI1Ds/QOSP/vmTsMg/mjwG/nUJ8RRM8pj0s8vlqCrjg==",
"dependencies": {
- "@sentry/core": "8.13.0",
- "@sentry/types": "8.13.0",
- "@sentry/utils": "8.13.0"
+ "@sentry/core": "8.22.0",
+ "@sentry/types": "8.22.0",
+ "@sentry/utils": "8.22.0"
},
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry-internal/feedback": {
- "version": "8.13.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.13.0.tgz",
- "integrity": "sha512-YyJ6SzpTonixvguAg0H9vkEp7Jq8ZeVY8M4n47ClR0+TtaAUp04ZhcJpHKF7PwBIAzc7DRr2XP112tmWgiVEcg==",
+ "version": "8.22.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.22.0.tgz",
+ "integrity": "sha512-Sy2+v0xBmVnZ5LQ48603CvLy5vVQvAZ+hc9xQSAHexts07NkvApMU1qv26YNwxlAWfDha1wXiW6ryd4YDzaoVA==",
"dependencies": {
- "@sentry/core": "8.13.0",
- "@sentry/types": "8.13.0",
- "@sentry/utils": "8.13.0"
+ "@sentry/core": "8.22.0",
+ "@sentry/types": "8.22.0",
+ "@sentry/utils": "8.22.0"
},
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry-internal/replay": {
- "version": "8.13.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.13.0.tgz",
- "integrity": "sha512-DJ1jF/Pab0FH4SeCvSGCnGAu/s0wJvhBWM5VjQp7Jjmcfunp+R3vJibqU8gAVZU1nYRLaqprLdIXrSyP2Km8nQ==",
+ "version": "8.22.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.22.0.tgz",
+ "integrity": "sha512-sF8RyMPJP1fSIyyBDAbtybvKCu0dy8ZAfMwLP7ZqEnWrhZqktVuqM7/++EAFMlD5YaWJXm1IDuOXjgSQjUtSIQ==",
"dependencies": {
- "@sentry-internal/browser-utils": "8.13.0",
- "@sentry/core": "8.13.0",
- "@sentry/types": "8.13.0",
- "@sentry/utils": "8.13.0"
+ "@sentry-internal/browser-utils": "8.22.0",
+ "@sentry/core": "8.22.0",
+ "@sentry/types": "8.22.0",
+ "@sentry/utils": "8.22.0"
},
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry-internal/replay-canvas": {
- "version": "8.13.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.13.0.tgz",
- "integrity": "sha512-lPlfWVIHX+gW4S8a/UOVutuqMyQhlkNUAay0W21MVhZJT5Mtj0p21D/Cz7nrOQRDIiLNq90KAGK2tLxx5NkiWA==",
+ "version": "8.22.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.22.0.tgz",
+ "integrity": "sha512-/gV8qN3JqWw0LXTMuCGB8RDI8Bx1VESNRBdh/7Cmc5+hxYBfcketuix3S8mHWcE/JO+Ed9g1Abzys6GphTB9LA==",
"dependencies": {
- "@sentry-internal/replay": "8.13.0",
- "@sentry/core": "8.13.0",
- "@sentry/types": "8.13.0",
- "@sentry/utils": "8.13.0"
+ "@sentry-internal/replay": "8.22.0",
+ "@sentry/core": "8.22.0",
+ "@sentry/types": "8.22.0",
+ "@sentry/utils": "8.22.0"
},
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry/browser": {
- "version": "8.13.0",
- "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.13.0.tgz",
- "integrity": "sha512-/tp7HZ5qjwDLtwooPMoexdAi2PG7gMNY0bHeMlwy20hs8mclC8RW8ZiJA6czXHfgnbmvxfrHaY53IJyz//JnlA==",
+ "version": "8.22.0",
+ "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.22.0.tgz",
+ "integrity": "sha512-t3b+/9WWcP9SQTWwrHrB57B33ENgmUjyFlW2+JSlCXkSJBSmAoquPZ/GPjOuPaSr3HIA0mu9uEr4A41d5diASQ==",
"dependencies": {
- "@sentry-internal/browser-utils": "8.13.0",
- "@sentry-internal/feedback": "8.13.0",
- "@sentry-internal/replay": "8.13.0",
- "@sentry-internal/replay-canvas": "8.13.0",
- "@sentry/core": "8.13.0",
- "@sentry/types": "8.13.0",
- "@sentry/utils": "8.13.0"
+ "@sentry-internal/browser-utils": "8.22.0",
+ "@sentry-internal/feedback": "8.22.0",
+ "@sentry-internal/replay": "8.22.0",
+ "@sentry-internal/replay-canvas": "8.22.0",
+ "@sentry/core": "8.22.0",
+ "@sentry/types": "8.22.0",
+ "@sentry/utils": "8.22.0"
},
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry/core": {
- "version": "8.13.0",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.13.0.tgz",
- "integrity": "sha512-N9Qg4ZGxZWp8eb2eUUHVVKgjBLtFIjS805nG92s6yJmkvOpKm6mLtcUaT/iDf3Hta6nG+xRkhbE3r+Z4cbXG8w==",
+ "version": "8.22.0",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.22.0.tgz",
+ "integrity": "sha512-fYPnxp7UkY2tckaOtivIySxnJvlbekuxs+Qi6rkUv9JpF+TYKpt7OPNUAbgVIhS0xazAEN6iKTfmnmpUbFRLmQ==",
"dependencies": {
- "@sentry/types": "8.13.0",
- "@sentry/utils": "8.13.0"
+ "@sentry/types": "8.22.0",
+ "@sentry/utils": "8.22.0"
},
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry/react": {
- "version": "8.13.0",
- "resolved": "https://registry.npmjs.org/@sentry/react/-/react-8.13.0.tgz",
- "integrity": "sha512-gz+aHZMcl6uvHkmLBGzMGjJJ+Vpl+W0VXJsKB9fdjZDDF5vJpgXTR9mwMEXJ9lKi+cY6tDe0+af+DA8BGJgw0Q==",
- "dependencies": {
- "@sentry/browser": "8.13.0",
- "@sentry/core": "8.13.0",
- "@sentry/types": "8.13.0",
- "@sentry/utils": "8.13.0",
+ "version": "8.22.0",
+ "resolved": "https://registry.npmjs.org/@sentry/react/-/react-8.22.0.tgz",
+ "integrity": "sha512-LcO8SPfjYsx3Zvg1mQwjreVvtriVxde+6njIJyXU9TArB0e8bFexvd4MGXdBExgW9aY449hNaStgKRWMNHeVHQ==",
+ "dependencies": {
+ "@sentry/browser": "8.22.0",
+ "@sentry/core": "8.22.0",
+ "@sentry/types": "8.22.0",
+ "@sentry/utils": "8.22.0",
"hoist-non-react-statics": "^3.3.2"
},
"engines": {
@@ -3736,19 +3736,19 @@
}
},
"node_modules/@sentry/types": {
- "version": "8.13.0",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.13.0.tgz",
- "integrity": "sha512-r63s/H5gvQnQM9tTGBXz2xErUbxZALh4e2Lg/1aHj4zIvGLBjA2z5qWsh6TEZYbpmgAyGShLDr6+rWeUVf9yBQ==",
+ "version": "8.22.0",
+ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.22.0.tgz",
+ "integrity": "sha512-1MLK3xO+uF2oJaa+M98aLIrQsEHzV7xnVWPfE3MhejYLNQebj4rQnQKTut/xZNIF9W0Q+bRcakLarC3ce2a74g==",
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry/utils": {
- "version": "8.13.0",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.13.0.tgz",
- "integrity": "sha512-PxV0v9VbGWH9zP37P5w2msLUFDr287nYjoY2XVF+RSolyiTs1CQNI5ZMUO3o4MsSac/dpXxjyrZXQd72t/jRYA==",
+ "version": "8.22.0",
+ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.22.0.tgz",
+ "integrity": "sha512-0ITG2+3EtyMtyc/nQG8aB9z9eIQ4L43nM/KuNgYSnM1vPl/zegbaLT0Ek/xkQB1OLIOLkEPQ6x9GWe+248/n3g==",
"dependencies": {
- "@sentry/types": "8.13.0"
+ "@sentry/types": "8.22.0"
},
"engines": {
"node": ">=14.18"
diff --git a/package.json b/package.json
index 608d46952d..568502cb0a 100644
--- a/package.json
+++ b/package.json
@@ -33,7 +33,7 @@
},
"dependencies": {
"@reduxjs/toolkit": "^2.2.6",
- "@sentry/react": "^8.13.0",
+ "@sentry/react": "^8.22.0",
"@visx/axis": "^3.10.1",
"@visx/gradient": "^3.3.0",
"@visx/shape": "^3.5.0",
From e6e3d829c1a5065f295b7636076eea74fc676c73 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 5 Aug 2024 16:56:32 +0200
Subject: [PATCH 098/130] Deps: Bump the patch-updates group with 9 updates
(#4112)
Bumps the patch-updates group with 9 updates:
| Package | From | To |
| --- | --- | --- |
| [@reduxjs/toolkit](https://github.com/reduxjs/redux-toolkit) | `2.2.6` | `2.2.7` |
| [downshift](https://github.com/downshift-js/downshift) | `9.0.6` | `9.0.7` |
| [styled-components](https://github.com/styled-components/styled-components) | `6.1.11` | `6.1.12` |
| [@babel/cli](https://github.com/babel/babel/tree/HEAD/packages/babel-cli) | `7.24.7` | `7.24.8` |
| [@testing-library/jest-dom](https://github.com/testing-library/jest-dom) | `6.4.6` | `6.4.8` |
| [eslint-plugin-react-refresh](https://github.com/ArnaudBarre/eslint-plugin-react-refresh) | `0.4.8` | `0.4.9` |
| [prettier](https://github.com/prettier/prettier) | `3.3.2` | `3.3.3` |
| [typescript](https://github.com/Microsoft/TypeScript) | `5.5.3` | `5.5.4` |
| [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `5.3.3` | `5.3.5` |
Updates `@reduxjs/toolkit` from 2.2.6 to 2.2.7
- [Release notes](https://github.com/reduxjs/redux-toolkit/releases)
- [Commits](https://github.com/reduxjs/redux-toolkit/compare/v2.2.6...v2.2.7)
Updates `downshift` from 9.0.6 to 9.0.7
- [Release notes](https://github.com/downshift-js/downshift/releases)
- [Changelog](https://github.com/downshift-js/downshift/blob/master/CHANGELOG.md)
- [Commits](https://github.com/downshift-js/downshift/compare/v9.0.6...v9.0.7)
Updates `styled-components` from 6.1.11 to 6.1.12
- [Release notes](https://github.com/styled-components/styled-components/releases)
- [Commits](https://github.com/styled-components/styled-components/compare/v6.1.11...v6.1.12)
Updates `@babel/cli` from 7.24.7 to 7.24.8
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.24.8/packages/babel-cli)
Updates `@testing-library/jest-dom` from 6.4.6 to 6.4.8
- [Release notes](https://github.com/testing-library/jest-dom/releases)
- [Changelog](https://github.com/testing-library/jest-dom/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/jest-dom/compare/v6.4.6...v6.4.8)
Updates `eslint-plugin-react-refresh` from 0.4.8 to 0.4.9
- [Release notes](https://github.com/ArnaudBarre/eslint-plugin-react-refresh/releases)
- [Changelog](https://github.com/ArnaudBarre/eslint-plugin-react-refresh/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ArnaudBarre/eslint-plugin-react-refresh/compare/v0.4.8...v0.4.9)
Updates `prettier` from 3.3.2 to 3.3.3
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.3.2...3.3.3)
Updates `typescript` from 5.5.3 to 5.5.4
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release.yml)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v5.5.3...v5.5.4)
Updates `vite` from 5.3.3 to 5.3.5
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.3.5/packages/vite)
---
updated-dependencies:
- dependency-name: "@reduxjs/toolkit"
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: patch-updates
- dependency-name: downshift
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: patch-updates
- dependency-name: styled-components
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: patch-updates
- dependency-name: "@babel/cli"
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: patch-updates
- dependency-name: "@testing-library/jest-dom"
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: patch-updates
- dependency-name: eslint-plugin-react-refresh
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: patch-updates
- dependency-name: prettier
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: patch-updates
- dependency-name: typescript
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: patch-updates
- dependency-name: vite
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: patch-updates
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package-lock.json | 9847 +++++++++++++++++----------------------------
package.json | 18 +-
2 files changed, 3699 insertions(+), 6166 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index e635d7f461..eef4e4dce9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,7 +9,7 @@
"version": "23.2.2-dev1",
"license": "AGPL-3.0+",
"dependencies": {
- "@reduxjs/toolkit": "^2.2.6",
+ "@reduxjs/toolkit": "^2.2.7",
"@sentry/react": "^8.22.0",
"@visx/axis": "^3.10.1",
"@visx/gradient": "^3.3.0",
@@ -24,7 +24,7 @@
"d3-interpolate": "^3.0.1",
"d3-scale": "^4.0.2",
"d3-shape": "^3.2.0",
- "downshift": "^9.0.6",
+ "downshift": "^9.0.7",
"fast-deep-equal": "^3.1.3",
"fast-xml-parser": "^4.4.1",
"history": "^4.10.1",
@@ -46,14 +46,14 @@
"react-router-dom": "^5.2.0",
"redux": "^5.0.1",
"redux-logger": "^3.0.6",
- "styled-components": "^6.1.11",
+ "styled-components": "^6.1.12",
"uuid": "^10.0.0",
"whatwg-fetch": "^3.6.20"
},
"devDependencies": {
- "@babel/cli": "^7.24.7",
+ "@babel/cli": "^7.24.8",
"@pandatix/js-cvss": "^0.4.4",
- "@testing-library/jest-dom": "^6.4.6",
+ "@testing-library/jest-dom": "^6.4.8",
"@testing-library/react": "^16.0.0",
"@testing-library/user-event": "^13.5.0",
"@types/react": "^18.3.3",
@@ -70,14 +70,14 @@
"eslint-plugin-header": "^3.1.1",
"eslint-plugin-react": "^7.35.0",
"eslint-plugin-react-hooks": "^4.6.2",
- "eslint-plugin-react-refresh": "^0.4.8",
+ "eslint-plugin-react-refresh": "^0.4.9",
"eslint-plugin-vitest-globals": "^1.5.0",
"husky": "^2.7.0",
"jest-styled-components": "^7.2.0",
"lint-staged": "^13.1.0",
- "prettier": "^3.3.2",
- "typescript": "^5.5.3",
- "vite": "^5.3.3",
+ "prettier": "^3.3.3",
+ "typescript": "^5.5.4",
+ "vite": "^5.3.5",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-eslint2": "^4.4.0",
"vite-plugin-svgr": "^4.2.0",
@@ -115,9 +115,9 @@
}
},
"node_modules/@babel/cli": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.24.7.tgz",
- "integrity": "sha512-8dfPprJgV4O14WTx+AQyEA+opgUKPrsIXX/MdL50J1n06EQJ6m1T+CdsJe0qEC0B/Xl85i+Un5KVAxd/PACX9A==",
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.24.8.tgz",
+ "integrity": "sha512-isdp+G6DpRyKc+3Gqxy2rjzgF7Zj9K0mzLNnxz+E/fgeag8qT3vVulX4gY9dGO1q0y+0lUv6V3a+uhUzMzrwXg==",
"dev": true,
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.25",
@@ -818,20 +818,6 @@
"@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-syntax-bigint": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
- "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
"node_modules/@babel/plugin-syntax-class-properties": {
"version": "7.12.13",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
@@ -2769,3462 +2755,1194 @@
"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
"dev": true
},
- "node_modules/@istanbuljs/load-nyc-config": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
- "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
"dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "camelcase": "^5.3.1",
- "find-up": "^4.1.0",
- "get-package-type": "^0.1.0",
- "js-yaml": "^3.13.1",
- "resolve-from": "^5.0.0"
- },
"engines": {
"node": ">=8"
}
},
- "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "node_modules/@jest/schemas": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+ "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "sprintf-js": "~1.0.2"
- }
- },
- "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true,
- "optional": true,
- "peer": true,
+ "@sinclair/typebox": "^0.27.8"
+ },
"engines": {
- "node": ">=6"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "optional": true,
- "peer": true,
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+ "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
"dependencies": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
},
"engines": {
- "node": ">=8"
+ "node": ">=6.0.0"
}
},
- "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "engines": {
+ "node": ">=6.0.0"
}
},
- "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "p-locate": "^4.1.0"
- },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
"engines": {
- "node": ">=8"
+ "node": ">=6.0.0"
}
},
- "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
+ "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
"dev": true,
- "optional": true,
"peer": true,
"dependencies": {
- "p-try": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
}
},
- "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "optional": true,
- "peer": true,
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
"dependencies": {
- "p-limit": "^2.2.0"
- },
- "engines": {
- "node": ">=8"
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
}
},
- "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "node_modules/@nicolo-ribaudo/chokidar-2": {
+ "version": "2.1.8-no-fsevents.3",
+ "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz",
+ "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==",
"dev": true,
- "optional": true,
- "peer": true,
+ "optional": true
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
"engines": {
- "node": ">=8"
+ "node": ">= 8"
}
},
- "node_modules/@istanbuljs/schema": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
- "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
"dev": true,
"engines": {
- "node": ">=8"
+ "node": ">= 8"
}
},
- "node_modules/@jest/console": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz",
- "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==",
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0",
- "slash": "^3.0.0"
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 8"
}
},
- "node_modules/@jest/core": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz",
- "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==",
- "dev": true,
- "optional": true,
- "peer": true,
+ "node_modules/@pandatix/js-cvss": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/@pandatix/js-cvss/-/js-cvss-0.4.4.tgz",
+ "integrity": "sha512-hhBbQ7IKfoRoV3QKTP9hLKJT166/e0FkeiVSLZZIEVsO7DjxVmIWhJlPvbp+RXaM4w215xghtnXQv13Ebdlj/w==",
+ "dev": true
+ },
+ "node_modules/@polka/url": {
+ "version": "1.0.0-next.25",
+ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz",
+ "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==",
+ "dev": true
+ },
+ "node_modules/@reduxjs/toolkit": {
+ "version": "2.2.7",
+ "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.7.tgz",
+ "integrity": "sha512-faI3cZbSdFb8yv9dhDTmGwclW0vk0z5o1cia+kf7gCbaCwHI5e+7tP57mJUv22pNcNbeA62GSrPpfrUfdXcQ6g==",
"dependencies": {
- "@jest/console": "^29.7.0",
- "@jest/reporters": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "ansi-escapes": "^4.2.1",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "exit": "^0.1.2",
- "graceful-fs": "^4.2.9",
- "jest-changed-files": "^29.7.0",
- "jest-config": "^29.7.0",
- "jest-haste-map": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-regex-util": "^29.6.3",
- "jest-resolve": "^29.7.0",
- "jest-resolve-dependencies": "^29.7.0",
- "jest-runner": "^29.7.0",
- "jest-runtime": "^29.7.0",
- "jest-snapshot": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-validate": "^29.7.0",
- "jest-watcher": "^29.7.0",
- "micromatch": "^4.0.4",
- "pretty-format": "^29.7.0",
- "slash": "^3.0.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "immer": "^10.0.3",
+ "redux": "^5.0.1",
+ "redux-thunk": "^3.1.0",
+ "reselect": "^5.1.0"
},
"peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ "react": "^16.9.0 || ^17.0.0 || ^18",
+ "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0"
},
"peerDependenciesMeta": {
- "node-notifier": {
+ "react": {
+ "optional": true
+ },
+ "react-redux": {
"optional": true
}
}
},
- "node_modules/@jest/core/node_modules/ansi-escapes": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
- "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "node_modules/@rollup/pluginutils": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz",
+ "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "type-fest": "^0.21.3"
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^2.3.1"
},
"engines": {
- "node": ">=8"
+ "node": ">=14.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@jest/core/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=10"
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
},
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/@jest/core/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
}
- ],
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=8"
}
},
- "node_modules/@jest/core/node_modules/pretty-format": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
- "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.14.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.2.tgz",
+ "integrity": "sha512-ahxSgCkAEk+P/AVO0vYr7DxOD3CwAQrT0Go9BJyGQ9Ef0QxVOfjDZMiF4Y2s3mLyPrjonchIMH/tbWHucJMykQ==",
+ "cpu": [
+ "arm"
+ ],
"dev": true,
"optional": true,
- "peer": true,
- "dependencies": {
- "@jest/schemas": "^29.6.3",
- "ansi-styles": "^5.0.0",
- "react-is": "^18.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
+ "os": [
+ "android"
+ ]
},
- "node_modules/@jest/core/node_modules/type-fest": {
- "version": "0.21.3",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
- "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.14.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.2.tgz",
+ "integrity": "sha512-lAarIdxZWbFSHFSDao9+I/F5jDaKyCqAPMq5HqnfpBw8dKDiCaaqM0lq5h1pQTLeIqueeay4PieGR5jGZMWprw==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
"optional": true,
- "peer": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
+ "os": [
+ "android"
+ ]
},
- "node_modules/@jest/environment": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz",
- "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==",
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.14.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.2.tgz",
+ "integrity": "sha512-SWsr8zEUk82KSqquIMgZEg2GE5mCSfr9sE/thDROkX6pb3QQWPp8Vw8zOq2GyxZ2t0XoSIUlvHDkrf5Gmf7x3Q==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
"optional": true,
- "peer": true,
- "dependencies": {
- "@jest/fake-timers": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "jest-mock": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
+ "os": [
+ "darwin"
+ ]
},
- "node_modules/@jest/expect": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz",
- "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==",
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.14.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.2.tgz",
+ "integrity": "sha512-o/HAIrQq0jIxJAhgtIvV5FWviYK4WB0WwV91SLUnsliw1lSAoLsmgEEgRWzDguAFeUEUUoIWXiJrPqU7vGiVkA==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
"optional": true,
- "peer": true,
- "dependencies": {
- "expect": "^29.7.0",
- "jest-snapshot": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
+ "os": [
+ "darwin"
+ ]
},
- "node_modules/@jest/expect-utils": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz",
- "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==",
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.14.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.2.tgz",
+ "integrity": "sha512-nwlJ65UY9eGq91cBi6VyDfArUJSKOYt5dJQBq8xyLhvS23qO+4Nr/RreibFHjP6t+5ap2ohZrUJcHv5zk5ju/g==",
+ "cpu": [
+ "arm"
+ ],
"dev": true,
"optional": true,
- "peer": true,
- "dependencies": {
- "jest-get-type": "^29.6.3"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
+ "os": [
+ "linux"
+ ]
},
- "node_modules/@jest/fake-timers": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz",
- "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==",
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.14.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.2.tgz",
+ "integrity": "sha512-Pg5TxxO2IVlMj79+c/9G0LREC9SY3HM+pfAwX7zj5/cAuwrbfj2Wv9JbMHIdPCfQpYsI4g9mE+2Bw/3aeSs2rQ==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
"optional": true,
- "peer": true,
- "dependencies": {
- "@jest/types": "^29.6.3",
- "@sinonjs/fake-timers": "^10.0.2",
- "@types/node": "*",
- "jest-message-util": "^29.7.0",
- "jest-mock": "^29.7.0",
- "jest-util": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
+ "os": [
+ "linux"
+ ]
},
- "node_modules/@jest/globals": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz",
- "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==",
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.14.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.2.tgz",
+ "integrity": "sha512-cAOTjGNm84gc6tS02D1EXtG7tDRsVSDTBVXOLbj31DkwfZwgTPYZ6aafSU7rD/4R2a34JOwlF9fQayuTSkoclA==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
"optional": true,
- "peer": true,
- "dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/expect": "^29.7.0",
- "@jest/types": "^29.6.3",
- "jest-mock": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
+ "os": [
+ "linux"
+ ]
},
- "node_modules/@jest/reporters": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz",
- "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==",
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.14.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.2.tgz",
+ "integrity": "sha512-4RyT6v1kXb7C0fn6zV33rvaX05P0zHoNzaXI/5oFHklfKm602j+N4mn2YvoezQViRLPnxP8M1NaY4s/5kXO5cw==",
+ "cpu": [
+ "ppc64"
+ ],
"dev": true,
"optional": true,
- "peer": true,
- "dependencies": {
- "@bcoe/v8-coverage": "^0.2.3",
- "@jest/console": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@jridgewell/trace-mapping": "^0.3.18",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "collect-v8-coverage": "^1.0.0",
- "exit": "^0.1.2",
- "glob": "^7.1.3",
- "graceful-fs": "^4.2.9",
- "istanbul-lib-coverage": "^3.0.0",
- "istanbul-lib-instrument": "^6.0.0",
- "istanbul-lib-report": "^3.0.0",
- "istanbul-lib-source-maps": "^4.0.0",
- "istanbul-reports": "^3.1.3",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-worker": "^29.7.0",
- "slash": "^3.0.0",
- "string-length": "^4.0.1",
- "strip-ansi": "^6.0.0",
- "v8-to-istanbul": "^9.0.1"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
- }
+ "os": [
+ "linux"
+ ]
},
- "node_modules/@jest/schemas": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
- "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.14.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.2.tgz",
+ "integrity": "sha512-KNUH6jC/vRGAKSorySTyc/yRYlCwN/5pnMjXylfBniwtJx5O7X17KG/0efj8XM3TZU7raYRXJFFReOzNmL1n1w==",
+ "cpu": [
+ "riscv64"
+ ],
"dev": true,
- "dependencies": {
- "@sinclair/typebox": "^0.27.8"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
+ "optional": true,
+ "os": [
+ "linux"
+ ]
},
- "node_modules/@jest/source-map": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz",
- "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==",
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.14.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.2.tgz",
+ "integrity": "sha512-xPV4y73IBEXToNPa3h5lbgXOi/v0NcvKxU0xejiFw6DtIYQqOTMhZ2DN18/HrrP0PmiL3rGtRG9gz1QE8vFKXQ==",
+ "cpu": [
+ "s390x"
+ ],
"dev": true,
"optional": true,
- "peer": true,
- "dependencies": {
- "@jridgewell/trace-mapping": "^0.3.18",
- "callsites": "^3.0.0",
- "graceful-fs": "^4.2.9"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
+ "os": [
+ "linux"
+ ]
},
- "node_modules/@jest/test-result": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz",
- "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==",
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.14.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.2.tgz",
+ "integrity": "sha512-QBhtr07iFGmF9egrPOWyO5wciwgtzKkYPNLVCFZTmr4TWmY0oY2Dm/bmhHjKRwZoGiaKdNcKhFtUMBKvlchH+Q==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
"optional": true,
- "peer": true,
- "dependencies": {
- "@jest/console": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/istanbul-lib-coverage": "^2.0.0",
- "collect-v8-coverage": "^1.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
+ "os": [
+ "linux"
+ ]
},
- "node_modules/@jest/test-sequencer": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz",
- "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==",
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.14.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.2.tgz",
+ "integrity": "sha512-8zfsQRQGH23O6qazZSFY5jP5gt4cFvRuKTpuBsC1ZnSWxV8ZKQpPqOZIUtdfMOugCcBvFGRa1pDC/tkf19EgBw==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
"optional": true,
- "peer": true,
- "dependencies": {
- "@jest/test-result": "^29.7.0",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.7.0",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
+ "os": [
+ "linux"
+ ]
},
- "node_modules/@jest/transform": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz",
- "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==",
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.14.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.2.tgz",
+ "integrity": "sha512-H4s8UjgkPnlChl6JF5empNvFHp77Jx+Wfy2EtmYPe9G22XV+PMuCinZVHurNe8ggtwoaohxARJZbaH/3xjB/FA==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
"optional": true,
- "peer": true,
- "dependencies": {
- "@babel/core": "^7.11.6",
- "@jest/types": "^29.6.3",
- "@jridgewell/trace-mapping": "^0.3.18",
- "babel-plugin-istanbul": "^6.1.1",
- "chalk": "^4.0.0",
- "convert-source-map": "^2.0.0",
- "fast-json-stable-stringify": "^2.1.0",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.7.0",
- "jest-regex-util": "^29.6.3",
- "jest-util": "^29.7.0",
- "micromatch": "^4.0.4",
- "pirates": "^4.0.4",
- "slash": "^3.0.0",
- "write-file-atomic": "^4.0.2"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
+ "os": [
+ "win32"
+ ]
},
- "node_modules/@jest/types": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
- "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.14.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.2.tgz",
+ "integrity": "sha512-djqpAjm/i8erWYF0K6UY4kRO3X5+T4TypIqw60Q8MTqSBaQNpNXDhxdjpZ3ikgb+wn99svA7jxcXpiyg9MUsdw==",
+ "cpu": [
+ "ia32"
+ ],
"dev": true,
"optional": true,
- "peer": true,
- "dependencies": {
- "@jest/schemas": "^29.6.3",
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^17.0.8",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
+ "os": [
+ "win32"
+ ]
},
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
- "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
- "dependencies": {
- "@jridgewell/set-array": "^1.2.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.24"
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.14.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.2.tgz",
+ "integrity": "sha512-teAqzLT0yTYZa8ZP7zhFKEx4cotS8Tkk5XiqNMJhD4CpaWB1BHARE4Qy+RzwnXvSAYv+Q3jAqCVBS+PS+Yee8Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@sentry-internal/browser-utils": {
+ "version": "8.22.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.22.0.tgz",
+ "integrity": "sha512-R0u8KPaSivueIwUOhmYxcisKaJq3gx+I0xOcWoluDB3OI1Ds/QOSP/vmTsMg/mjwG/nUJ8RRM8pj0s8vlqCrjg==",
+ "dependencies": {
+ "@sentry/core": "8.22.0",
+ "@sentry/types": "8.22.0",
+ "@sentry/utils": "8.22.0"
},
"engines": {
- "node": ">=6.0.0"
+ "node": ">=14.18"
}
},
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "node_modules/@sentry-internal/feedback": {
+ "version": "8.22.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.22.0.tgz",
+ "integrity": "sha512-Sy2+v0xBmVnZ5LQ48603CvLy5vVQvAZ+hc9xQSAHexts07NkvApMU1qv26YNwxlAWfDha1wXiW6ryd4YDzaoVA==",
+ "dependencies": {
+ "@sentry/core": "8.22.0",
+ "@sentry/types": "8.22.0",
+ "@sentry/utils": "8.22.0"
+ },
"engines": {
- "node": ">=6.0.0"
+ "node": ">=14.18"
}
},
- "node_modules/@jridgewell/set-array": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
- "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "node_modules/@sentry-internal/replay": {
+ "version": "8.22.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.22.0.tgz",
+ "integrity": "sha512-sF8RyMPJP1fSIyyBDAbtybvKCu0dy8ZAfMwLP7ZqEnWrhZqktVuqM7/++EAFMlD5YaWJXm1IDuOXjgSQjUtSIQ==",
+ "dependencies": {
+ "@sentry-internal/browser-utils": "8.22.0",
+ "@sentry/core": "8.22.0",
+ "@sentry/types": "8.22.0",
+ "@sentry/utils": "8.22.0"
+ },
"engines": {
- "node": ">=6.0.0"
+ "node": ">=14.18"
}
},
- "node_modules/@jridgewell/source-map": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
- "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
- "dev": true,
- "peer": true,
+ "node_modules/@sentry-internal/replay-canvas": {
+ "version": "8.22.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.22.0.tgz",
+ "integrity": "sha512-/gV8qN3JqWw0LXTMuCGB8RDI8Bx1VESNRBdh/7Cmc5+hxYBfcketuix3S8mHWcE/JO+Ed9g1Abzys6GphTB9LA==",
"dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.25"
+ "@sentry-internal/replay": "8.22.0",
+ "@sentry/core": "8.22.0",
+ "@sentry/types": "8.22.0",
+ "@sentry/utils": "8.22.0"
+ },
+ "engines": {
+ "node": ">=14.18"
}
},
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.25",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
- "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "node_modules/@sentry/browser": {
+ "version": "8.22.0",
+ "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.22.0.tgz",
+ "integrity": "sha512-t3b+/9WWcP9SQTWwrHrB57B33ENgmUjyFlW2+JSlCXkSJBSmAoquPZ/GPjOuPaSr3HIA0mu9uEr4A41d5diASQ==",
"dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
+ "@sentry-internal/browser-utils": "8.22.0",
+ "@sentry-internal/feedback": "8.22.0",
+ "@sentry-internal/replay": "8.22.0",
+ "@sentry-internal/replay-canvas": "8.22.0",
+ "@sentry/core": "8.22.0",
+ "@sentry/types": "8.22.0",
+ "@sentry/utils": "8.22.0"
+ },
+ "engines": {
+ "node": ">=14.18"
}
},
- "node_modules/@nicolo-ribaudo/chokidar-2": {
- "version": "2.1.8-no-fsevents.3",
- "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz",
- "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==",
- "dev": true,
- "optional": true
+ "node_modules/@sentry/core": {
+ "version": "8.22.0",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.22.0.tgz",
+ "integrity": "sha512-fYPnxp7UkY2tckaOtivIySxnJvlbekuxs+Qi6rkUv9JpF+TYKpt7OPNUAbgVIhS0xazAEN6iKTfmnmpUbFRLmQ==",
+ "dependencies": {
+ "@sentry/types": "8.22.0",
+ "@sentry/utils": "8.22.0"
+ },
+ "engines": {
+ "node": ">=14.18"
+ }
},
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
+ "node_modules/@sentry/react": {
+ "version": "8.22.0",
+ "resolved": "https://registry.npmjs.org/@sentry/react/-/react-8.22.0.tgz",
+ "integrity": "sha512-LcO8SPfjYsx3Zvg1mQwjreVvtriVxde+6njIJyXU9TArB0e8bFexvd4MGXdBExgW9aY449hNaStgKRWMNHeVHQ==",
"dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
+ "@sentry/browser": "8.22.0",
+ "@sentry/core": "8.22.0",
+ "@sentry/types": "8.22.0",
+ "@sentry/utils": "8.22.0",
+ "hoist-non-react-statics": "^3.3.2"
},
"engines": {
- "node": ">= 8"
+ "node": ">=14.18"
+ },
+ "peerDependencies": {
+ "react": "^16.14.0 || 17.x || 18.x || 19.x"
}
},
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true,
+ "node_modules/@sentry/types": {
+ "version": "8.22.0",
+ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.22.0.tgz",
+ "integrity": "sha512-1MLK3xO+uF2oJaa+M98aLIrQsEHzV7xnVWPfE3MhejYLNQebj4rQnQKTut/xZNIF9W0Q+bRcakLarC3ce2a74g==",
"engines": {
- "node": ">= 8"
+ "node": ">=14.18"
}
},
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
+ "node_modules/@sentry/utils": {
+ "version": "8.22.0",
+ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.22.0.tgz",
+ "integrity": "sha512-0ITG2+3EtyMtyc/nQG8aB9z9eIQ4L43nM/KuNgYSnM1vPl/zegbaLT0Ek/xkQB1OLIOLkEPQ6x9GWe+248/n3g==",
"dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
+ "@sentry/types": "8.22.0"
},
"engines": {
- "node": ">= 8"
+ "node": ">=14.18"
}
},
- "node_modules/@pandatix/js-cvss": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/@pandatix/js-cvss/-/js-cvss-0.4.4.tgz",
- "integrity": "sha512-hhBbQ7IKfoRoV3QKTP9hLKJT166/e0FkeiVSLZZIEVsO7DjxVmIWhJlPvbp+RXaM4w215xghtnXQv13Ebdlj/w==",
- "dev": true
- },
- "node_modules/@polka/url": {
- "version": "1.0.0-next.25",
- "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz",
- "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==",
+ "node_modules/@sinclair/typebox": {
+ "version": "0.27.8",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
+ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
"dev": true
},
- "node_modules/@reduxjs/toolkit": {
- "version": "2.2.6",
- "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.6.tgz",
- "integrity": "sha512-kH0r495c5z1t0g796eDQAkYbEQ3a1OLYN9o8jQQVZyKyw367pfRGS+qZLkHYvFHiUUdafpoSlQ2QYObIApjPWA==",
- "dependencies": {
- "immer": "^10.0.3",
- "redux": "^5.0.1",
- "redux-thunk": "^3.1.0",
- "reselect": "^5.1.0"
+ "node_modules/@svgr/babel-plugin-add-jsx-attribute": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz",
+ "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
},
- "peerDependencies": {
- "react": "^16.9.0 || ^17.0.0 || ^18",
- "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
},
- "peerDependenciesMeta": {
- "react": {
- "optional": true
- },
- "react-redux": {
- "optional": true
- }
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@rollup/pluginutils": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz",
- "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==",
+ "node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz",
+ "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==",
"dev": true,
- "dependencies": {
- "@types/estree": "^1.0.0",
- "estree-walker": "^2.0.2",
- "picomatch": "^2.3.1"
- },
"engines": {
- "node": ">=14.0.0"
+ "node": ">=14"
},
- "peerDependencies": {
- "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
},
- "peerDependenciesMeta": {
- "rollup": {
- "optional": true
- }
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.2.tgz",
- "integrity": "sha512-ahxSgCkAEk+P/AVO0vYr7DxOD3CwAQrT0Go9BJyGQ9Ef0QxVOfjDZMiF4Y2s3mLyPrjonchIMH/tbWHucJMykQ==",
- "cpu": [
- "arm"
- ],
+ "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz",
+ "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==",
"dev": true,
- "optional": true,
- "os": [
- "android"
- ]
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
},
- "node_modules/@rollup/rollup-android-arm64": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.2.tgz",
- "integrity": "sha512-lAarIdxZWbFSHFSDao9+I/F5jDaKyCqAPMq5HqnfpBw8dKDiCaaqM0lq5h1pQTLeIqueeay4PieGR5jGZMWprw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.2.tgz",
- "integrity": "sha512-SWsr8zEUk82KSqquIMgZEg2GE5mCSfr9sE/thDROkX6pb3QQWPp8Vw8zOq2GyxZ2t0XoSIUlvHDkrf5Gmf7x3Q==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.2.tgz",
- "integrity": "sha512-o/HAIrQq0jIxJAhgtIvV5FWviYK4WB0WwV91SLUnsliw1lSAoLsmgEEgRWzDguAFeUEUUoIWXiJrPqU7vGiVkA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.2.tgz",
- "integrity": "sha512-nwlJ65UY9eGq91cBi6VyDfArUJSKOYt5dJQBq8xyLhvS23qO+4Nr/RreibFHjP6t+5ap2ohZrUJcHv5zk5ju/g==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.2.tgz",
- "integrity": "sha512-Pg5TxxO2IVlMj79+c/9G0LREC9SY3HM+pfAwX7zj5/cAuwrbfj2Wv9JbMHIdPCfQpYsI4g9mE+2Bw/3aeSs2rQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.2.tgz",
- "integrity": "sha512-cAOTjGNm84gc6tS02D1EXtG7tDRsVSDTBVXOLbj31DkwfZwgTPYZ6aafSU7rD/4R2a34JOwlF9fQayuTSkoclA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.2.tgz",
- "integrity": "sha512-4RyT6v1kXb7C0fn6zV33rvaX05P0zHoNzaXI/5oFHklfKm602j+N4mn2YvoezQViRLPnxP8M1NaY4s/5kXO5cw==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.2.tgz",
- "integrity": "sha512-KNUH6jC/vRGAKSorySTyc/yRYlCwN/5pnMjXylfBniwtJx5O7X17KG/0efj8XM3TZU7raYRXJFFReOzNmL1n1w==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.2.tgz",
- "integrity": "sha512-xPV4y73IBEXToNPa3h5lbgXOi/v0NcvKxU0xejiFw6DtIYQqOTMhZ2DN18/HrrP0PmiL3rGtRG9gz1QE8vFKXQ==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.2.tgz",
- "integrity": "sha512-QBhtr07iFGmF9egrPOWyO5wciwgtzKkYPNLVCFZTmr4TWmY0oY2Dm/bmhHjKRwZoGiaKdNcKhFtUMBKvlchH+Q==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.2.tgz",
- "integrity": "sha512-8zfsQRQGH23O6qazZSFY5jP5gt4cFvRuKTpuBsC1ZnSWxV8ZKQpPqOZIUtdfMOugCcBvFGRa1pDC/tkf19EgBw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.2.tgz",
- "integrity": "sha512-H4s8UjgkPnlChl6JF5empNvFHp77Jx+Wfy2EtmYPe9G22XV+PMuCinZVHurNe8ggtwoaohxARJZbaH/3xjB/FA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.2.tgz",
- "integrity": "sha512-djqpAjm/i8erWYF0K6UY4kRO3X5+T4TypIqw60Q8MTqSBaQNpNXDhxdjpZ3ikgb+wn99svA7jxcXpiyg9MUsdw==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.2.tgz",
- "integrity": "sha512-teAqzLT0yTYZa8ZP7zhFKEx4cotS8Tkk5XiqNMJhD4CpaWB1BHARE4Qy+RzwnXvSAYv+Q3jAqCVBS+PS+Yee8Q==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@sentry-internal/browser-utils": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.22.0.tgz",
- "integrity": "sha512-R0u8KPaSivueIwUOhmYxcisKaJq3gx+I0xOcWoluDB3OI1Ds/QOSP/vmTsMg/mjwG/nUJ8RRM8pj0s8vlqCrjg==",
- "dependencies": {
- "@sentry/core": "8.22.0",
- "@sentry/types": "8.22.0",
- "@sentry/utils": "8.22.0"
- },
- "engines": {
- "node": ">=14.18"
- }
- },
- "node_modules/@sentry-internal/feedback": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.22.0.tgz",
- "integrity": "sha512-Sy2+v0xBmVnZ5LQ48603CvLy5vVQvAZ+hc9xQSAHexts07NkvApMU1qv26YNwxlAWfDha1wXiW6ryd4YDzaoVA==",
- "dependencies": {
- "@sentry/core": "8.22.0",
- "@sentry/types": "8.22.0",
- "@sentry/utils": "8.22.0"
- },
- "engines": {
- "node": ">=14.18"
- }
- },
- "node_modules/@sentry-internal/replay": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.22.0.tgz",
- "integrity": "sha512-sF8RyMPJP1fSIyyBDAbtybvKCu0dy8ZAfMwLP7ZqEnWrhZqktVuqM7/++EAFMlD5YaWJXm1IDuOXjgSQjUtSIQ==",
- "dependencies": {
- "@sentry-internal/browser-utils": "8.22.0",
- "@sentry/core": "8.22.0",
- "@sentry/types": "8.22.0",
- "@sentry/utils": "8.22.0"
- },
- "engines": {
- "node": ">=14.18"
- }
- },
- "node_modules/@sentry-internal/replay-canvas": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.22.0.tgz",
- "integrity": "sha512-/gV8qN3JqWw0LXTMuCGB8RDI8Bx1VESNRBdh/7Cmc5+hxYBfcketuix3S8mHWcE/JO+Ed9g1Abzys6GphTB9LA==",
- "dependencies": {
- "@sentry-internal/replay": "8.22.0",
- "@sentry/core": "8.22.0",
- "@sentry/types": "8.22.0",
- "@sentry/utils": "8.22.0"
- },
- "engines": {
- "node": ">=14.18"
- }
- },
- "node_modules/@sentry/browser": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.22.0.tgz",
- "integrity": "sha512-t3b+/9WWcP9SQTWwrHrB57B33ENgmUjyFlW2+JSlCXkSJBSmAoquPZ/GPjOuPaSr3HIA0mu9uEr4A41d5diASQ==",
- "dependencies": {
- "@sentry-internal/browser-utils": "8.22.0",
- "@sentry-internal/feedback": "8.22.0",
- "@sentry-internal/replay": "8.22.0",
- "@sentry-internal/replay-canvas": "8.22.0",
- "@sentry/core": "8.22.0",
- "@sentry/types": "8.22.0",
- "@sentry/utils": "8.22.0"
- },
- "engines": {
- "node": ">=14.18"
- }
- },
- "node_modules/@sentry/core": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.22.0.tgz",
- "integrity": "sha512-fYPnxp7UkY2tckaOtivIySxnJvlbekuxs+Qi6rkUv9JpF+TYKpt7OPNUAbgVIhS0xazAEN6iKTfmnmpUbFRLmQ==",
- "dependencies": {
- "@sentry/types": "8.22.0",
- "@sentry/utils": "8.22.0"
- },
- "engines": {
- "node": ">=14.18"
- }
- },
- "node_modules/@sentry/react": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry/react/-/react-8.22.0.tgz",
- "integrity": "sha512-LcO8SPfjYsx3Zvg1mQwjreVvtriVxde+6njIJyXU9TArB0e8bFexvd4MGXdBExgW9aY449hNaStgKRWMNHeVHQ==",
- "dependencies": {
- "@sentry/browser": "8.22.0",
- "@sentry/core": "8.22.0",
- "@sentry/types": "8.22.0",
- "@sentry/utils": "8.22.0",
- "hoist-non-react-statics": "^3.3.2"
- },
- "engines": {
- "node": ">=14.18"
- },
- "peerDependencies": {
- "react": "^16.14.0 || 17.x || 18.x || 19.x"
- }
- },
- "node_modules/@sentry/types": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.22.0.tgz",
- "integrity": "sha512-1MLK3xO+uF2oJaa+M98aLIrQsEHzV7xnVWPfE3MhejYLNQebj4rQnQKTut/xZNIF9W0Q+bRcakLarC3ce2a74g==",
- "engines": {
- "node": ">=14.18"
- }
- },
- "node_modules/@sentry/utils": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.22.0.tgz",
- "integrity": "sha512-0ITG2+3EtyMtyc/nQG8aB9z9eIQ4L43nM/KuNgYSnM1vPl/zegbaLT0Ek/xkQB1OLIOLkEPQ6x9GWe+248/n3g==",
- "dependencies": {
- "@sentry/types": "8.22.0"
- },
- "engines": {
- "node": ">=14.18"
- }
- },
- "node_modules/@sinclair/typebox": {
- "version": "0.27.8",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
- "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
- "dev": true
- },
- "node_modules/@sinonjs/commons": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
- "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "type-detect": "4.0.8"
- }
- },
- "node_modules/@sinonjs/fake-timers": {
- "version": "10.3.0",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
- "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@sinonjs/commons": "^3.0.0"
- }
- },
- "node_modules/@svgr/babel-plugin-add-jsx-attribute": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz",
- "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==",
- "dev": true,
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz",
- "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==",
- "dev": true,
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz",
- "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==",
- "dev": true,
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz",
- "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==",
- "dev": true,
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/babel-plugin-svg-dynamic-title": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz",
- "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==",
- "dev": true,
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/babel-plugin-svg-em-dimensions": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz",
- "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==",
- "dev": true,
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/babel-plugin-transform-react-native-svg": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz",
- "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==",
- "dev": true,
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/babel-plugin-transform-svg-component": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz",
- "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/babel-preset": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz",
- "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==",
- "dev": true,
- "dependencies": {
- "@svgr/babel-plugin-add-jsx-attribute": "8.0.0",
- "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0",
- "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0",
- "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0",
- "@svgr/babel-plugin-svg-dynamic-title": "8.0.0",
- "@svgr/babel-plugin-svg-em-dimensions": "8.0.0",
- "@svgr/babel-plugin-transform-react-native-svg": "8.1.0",
- "@svgr/babel-plugin-transform-svg-component": "8.0.0"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/core": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz",
- "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==",
- "dev": true,
- "dependencies": {
- "@babel/core": "^7.21.3",
- "@svgr/babel-preset": "8.1.0",
- "camelcase": "^6.2.0",
- "cosmiconfig": "^8.1.3",
- "snake-case": "^3.0.4"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- }
- },
- "node_modules/@svgr/hast-util-to-babel-ast": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz",
- "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.21.3",
- "entities": "^4.4.0"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- }
- },
- "node_modules/@svgr/plugin-jsx": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz",
- "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==",
- "dev": true,
- "dependencies": {
- "@babel/core": "^7.21.3",
- "@svgr/babel-preset": "8.1.0",
- "@svgr/hast-util-to-babel-ast": "8.0.0",
- "svg-parser": "^2.0.4"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@svgr/core": "*"
- }
- },
- "node_modules/@testing-library/dom": {
- "version": "10.0.0",
- "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.0.0.tgz",
- "integrity": "sha512-PmJPnogldqoVFf+EwbHvbBJ98MmqASV8kLrBYgsDNxQcFMeIS7JFL48sfyXvuMtgmWO/wMhh25odr+8VhDmn4g==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@babel/code-frame": "^7.10.4",
- "@babel/runtime": "^7.12.5",
- "@types/aria-query": "^5.0.1",
- "aria-query": "5.3.0",
- "chalk": "^4.1.0",
- "dom-accessibility-api": "^0.5.9",
- "lz-string": "^1.5.0",
- "pretty-format": "^27.0.2"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@testing-library/jest-dom": {
- "version": "6.4.6",
- "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.6.tgz",
- "integrity": "sha512-8qpnGVincVDLEcQXWaHOf6zmlbwTKc6Us6PPu4CRnPXCzo2OGBS5cwgMMOWdxDpEz1mkbvXHpEy99M5Yvt682w==",
- "dev": true,
- "dependencies": {
- "@adobe/css-tools": "^4.4.0",
- "@babel/runtime": "^7.9.2",
- "aria-query": "^5.0.0",
- "chalk": "^3.0.0",
- "css.escape": "^1.5.1",
- "dom-accessibility-api": "^0.6.3",
- "lodash": "^4.17.21",
- "redent": "^3.0.0"
- },
- "engines": {
- "node": ">=14",
- "npm": ">=6",
- "yarn": ">=1"
- },
- "peerDependencies": {
- "@jest/globals": ">= 28",
- "@types/bun": "latest",
- "@types/jest": ">= 28",
- "jest": ">= 28",
- "vitest": ">= 0.32"
- },
- "peerDependenciesMeta": {
- "@jest/globals": {
- "optional": true
- },
- "@types/bun": {
- "optional": true
- },
- "@types/jest": {
- "optional": true
- },
- "jest": {
- "optional": true
- },
- "vitest": {
- "optional": true
- }
- }
- },
- "node_modules/@testing-library/jest-dom/node_modules/chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz",
- "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==",
- "dev": true
- },
- "node_modules/@testing-library/react": {
- "version": "16.0.0",
- "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.0.tgz",
- "integrity": "sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.12.5"
- },
- "engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "@testing-library/dom": "^10.0.0",
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.0",
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@testing-library/user-event": {
- "version": "13.5.0",
- "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz",
- "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.12.5"
- },
- "engines": {
- "node": ">=10",
- "npm": ">=6"
- },
- "peerDependencies": {
- "@testing-library/dom": ">=7.21.4"
- }
- },
- "node_modules/@tootallnate/once": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
- "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@types/aria-query": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
- "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==",
- "dev": true,
- "peer": true
- },
- "node_modules/@types/babel__core": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
- "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
- "dev": true,
- "dependencies": {
- "@babel/parser": "^7.20.7",
- "@babel/types": "^7.20.7",
- "@types/babel__generator": "*",
- "@types/babel__template": "*",
- "@types/babel__traverse": "*"
- }
- },
- "node_modules/@types/babel__generator": {
- "version": "7.6.8",
- "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
- "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.0.0"
- }
- },
- "node_modules/@types/babel__template": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
- "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
- "dev": true,
- "dependencies": {
- "@babel/parser": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
- },
- "node_modules/@types/babel__traverse": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz",
- "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.20.7"
- }
- },
- "node_modules/@types/d3-array": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.3.tgz",
- "integrity": "sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ=="
- },
- "node_modules/@types/d3-color": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz",
- "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA=="
- },
- "node_modules/@types/d3-delaunay": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz",
- "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ=="
- },
- "node_modules/@types/d3-format": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz",
- "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg=="
- },
- "node_modules/@types/d3-geo": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz",
- "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==",
- "dependencies": {
- "@types/geojson": "*"
- }
- },
- "node_modules/@types/d3-interpolate": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
- "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==",
- "dependencies": {
- "@types/d3-color": "*"
- }
- },
- "node_modules/@types/d3-path": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.11.tgz",
- "integrity": "sha512-4pQMp8ldf7UaB/gR8Fvvy69psNHkTpD/pVw3vmEi8iZAB9EPMBruB1JvHO4BIq9QkUUd2lV1F5YXpMNj7JPBpw=="
- },
- "node_modules/@types/d3-scale": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.2.tgz",
- "integrity": "sha512-Yk4htunhPAwN0XGlIwArRomOjdoBFXC3+kCxK2Ubg7I9shQlVSJy/pG/Ht5ASN+gdMIalpk8TJ5xV74jFsetLA==",
- "dependencies": {
- "@types/d3-time": "*"
- }
- },
- "node_modules/@types/d3-shape": {
- "version": "1.3.12",
- "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.12.tgz",
- "integrity": "sha512-8oMzcd4+poSLGgV0R1Q1rOlx/xdmozS4Xab7np0eamFFUYq71AU9pOCJEFnkXW2aI/oXdVYJzw6pssbSut7Z9Q==",
- "dependencies": {
- "@types/d3-path": "^1"
- }
- },
- "node_modules/@types/d3-time": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz",
- "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg=="
- },
- "node_modules/@types/d3-time-format": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-2.1.0.tgz",
- "integrity": "sha512-/myT3I7EwlukNOX2xVdMzb8FRgNzRMpsZddwst9Ld/VFe6LyJyRp0s32l/V9XoUzk+Gqu56F/oGk6507+8BxrA=="
- },
- "node_modules/@types/eslint": {
- "version": "8.56.9",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.9.tgz",
- "integrity": "sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg==",
- "dev": true,
- "dependencies": {
- "@types/estree": "*",
- "@types/json-schema": "*"
- }
- },
- "node_modules/@types/estree": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
- "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
- "dev": true
- },
- "node_modules/@types/geojson": {
- "version": "7946.0.14",
- "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz",
- "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg=="
- },
- "node_modules/@types/graceful-fs": {
- "version": "4.1.9",
- "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
- "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/hoist-non-react-statics": {
- "version": "3.3.5",
- "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz",
- "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==",
- "dependencies": {
- "@types/react": "*",
- "hoist-non-react-statics": "^3.3.0"
- }
- },
- "node_modules/@types/istanbul-lib-coverage": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
- "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
- "dev": true,
- "optional": true,
- "peer": true
- },
- "node_modules/@types/istanbul-lib-report": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
- "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@types/istanbul-lib-coverage": "*"
- }
- },
- "node_modules/@types/istanbul-reports": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
- "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@types/istanbul-lib-report": "*"
- }
- },
- "node_modules/@types/jest": {
- "version": "29.5.12",
- "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz",
- "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "expect": "^29.0.0",
- "pretty-format": "^29.0.0"
- }
- },
- "node_modules/@types/jest/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/@types/jest/node_modules/pretty-format": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
- "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@jest/schemas": "^29.6.3",
- "ansi-styles": "^5.0.0",
- "react-is": "^18.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@types/json-schema": {
- "version": "7.0.15",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
- "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
- "dev": true
- },
- "node_modules/@types/lodash": {
- "version": "4.17.0",
- "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz",
- "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA=="
- },
- "node_modules/@types/node": {
- "version": "20.12.7",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz",
- "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "undici-types": "~5.26.4"
- }
- },
- "node_modules/@types/normalize-package-data": {
- "version": "2.4.4",
- "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
- "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
- "dev": true
- },
- "node_modules/@types/parse-json": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
- "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="
- },
- "node_modules/@types/prop-types": {
- "version": "15.7.12",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz",
- "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q=="
- },
- "node_modules/@types/react": {
- "version": "18.3.3",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz",
- "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==",
- "dependencies": {
- "@types/prop-types": "*",
- "csstype": "^3.0.2"
- }
- },
- "node_modules/@types/react-dom": {
- "version": "18.3.0",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz",
- "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==",
- "dev": true,
- "dependencies": {
- "@types/react": "*"
- }
- },
- "node_modules/@types/react-redux": {
- "version": "7.1.33",
- "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.33.tgz",
- "integrity": "sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==",
- "dependencies": {
- "@types/hoist-non-react-statics": "^3.3.0",
- "@types/react": "*",
- "hoist-non-react-statics": "^3.3.0",
- "redux": "^4.0.0"
- }
- },
- "node_modules/@types/react-redux/node_modules/redux": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz",
- "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==",
- "dependencies": {
- "@babel/runtime": "^7.9.2"
- }
- },
- "node_modules/@types/stack-utils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
- "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
- "dev": true,
- "optional": true,
- "peer": true
- },
- "node_modules/@types/stylis": {
- "version": "4.2.5",
- "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz",
- "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw=="
- },
- "node_modules/@types/use-sync-external-store": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz",
- "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA=="
- },
- "node_modules/@types/yargs": {
- "version": "17.0.32",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz",
- "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/@types/yargs-parser": {
- "version": "21.0.3",
- "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
- "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
- "dev": true,
- "optional": true,
- "peer": true
- },
- "node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.0.0.tgz",
- "integrity": "sha512-STIZdwEQRXAHvNUS6ILDf5z3u95Gc8jzywunxSNqX00OooIemaaNIA0vEgynJlycL5AjabYLLrIyHd4iazyvtg==",
- "dev": true,
- "dependencies": {
- "@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.0.0",
- "@typescript-eslint/type-utils": "8.0.0",
- "@typescript-eslint/utils": "8.0.0",
- "@typescript-eslint/visitor-keys": "8.0.0",
- "graphemer": "^1.4.0",
- "ignore": "^5.3.1",
- "natural-compare": "^1.4.0",
- "ts-api-utils": "^1.3.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0",
- "eslint": "^8.57.0 || ^9.0.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/parser": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.0.0.tgz",
- "integrity": "sha512-pS1hdZ+vnrpDIxuFXYQpLTILglTjSYJ9MbetZctrUawogUsPdz31DIIRZ9+rab0LhYNTsk88w4fIzVheiTbWOQ==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/scope-manager": "8.0.0",
- "@typescript-eslint/types": "8.0.0",
- "@typescript-eslint/typescript-estree": "8.0.0",
- "@typescript-eslint/visitor-keys": "8.0.0",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/scope-manager": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.0.tgz",
- "integrity": "sha512-V0aa9Csx/ZWWv2IPgTfY7T4agYwJyILESu/PVqFtTFz9RIS823mAze+NbnBI8xiwdX3iqeQbcTYlvB04G9wyQw==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "8.0.0",
- "@typescript-eslint/visitor-keys": "8.0.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/type-utils": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.0.0.tgz",
- "integrity": "sha512-mJAFP2mZLTBwAn5WI4PMakpywfWFH5nQZezUQdSKV23Pqo6o9iShQg1hP2+0hJJXP2LnZkWPphdIq4juYYwCeg==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/typescript-estree": "8.0.0",
- "@typescript-eslint/utils": "8.0.0",
- "debug": "^4.3.4",
- "ts-api-utils": "^1.3.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/types": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.0.tgz",
- "integrity": "sha512-wgdSGs9BTMWQ7ooeHtu5quddKKs5Z5dS+fHLbrQI+ID0XWJLODGMHRfhwImiHoeO2S5Wir2yXuadJN6/l4JRxw==",
- "dev": true,
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.0.tgz",
- "integrity": "sha512-5b97WpKMX+Y43YKi4zVcCVLtK5F98dFls3Oxui8LbnmRsseKenbbDinmvxrWegKDMmlkIq/XHuyy0UGLtpCDKg==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "8.0.0",
- "@typescript-eslint/visitor-keys": "8.0.0",
- "debug": "^4.3.4",
- "globby": "^11.1.0",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^1.3.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/utils": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.0.0.tgz",
- "integrity": "sha512-k/oS/A/3QeGLRvOWCg6/9rATJL5rec7/5s1YmdS0ZU6LHveJyGFwBvLhSRBv6i9xaj7etmosp+l+ViN1I9Aj/Q==",
- "dev": true,
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "8.0.0",
- "@typescript-eslint/types": "8.0.0",
- "@typescript-eslint/typescript-estree": "8.0.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0"
- }
- },
- "node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.0.tgz",
- "integrity": "sha512-oN0K4nkHuOyF3PVMyETbpP5zp6wfyOvm7tWhTMfoqxSSsPmJIh6JNASuZDlODE8eE+0EB9uar+6+vxr9DBTYOA==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "8.0.0",
- "eslint-visitor-keys": "^3.4.3"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@ungap/structured-clone": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
- "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
- "dev": true
- },
- "node_modules/@visx/axis": {
- "version": "3.10.1",
- "resolved": "https://registry.npmjs.org/@visx/axis/-/axis-3.10.1.tgz",
- "integrity": "sha512-HBEDLcpZoJ16hFbkYu3S6mN5mbwlFmUWY5yN967X06RdIL4LmAG3gnZ7u4F9buA3LQo+trJXW78moN005odD4Q==",
- "dependencies": {
- "@types/react": "*",
- "@visx/group": "3.3.0",
- "@visx/point": "3.3.0",
- "@visx/scale": "3.5.0",
- "@visx/shape": "3.5.0",
- "@visx/text": "3.3.0",
- "classnames": "^2.3.1",
- "prop-types": "^15.6.0"
- },
- "peerDependencies": {
- "react": "^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0"
- }
- },
- "node_modules/@visx/curve": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/@visx/curve/-/curve-3.3.0.tgz",
- "integrity": "sha512-G1l1rzGWwIs8ka3mBhO/gj8uYK6XdU/3bwRSoiZ+MockMahQFPog0bUkuVgPwwzPSJfsA/E5u53Y/DNesnHQxg==",
- "dependencies": {
- "@types/d3-shape": "^1.3.1",
- "d3-shape": "^1.0.6"
- }
- },
- "node_modules/@visx/curve/node_modules/d3-shape": {
- "version": "1.3.7",
- "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz",
- "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",
- "dependencies": {
- "d3-path": "1"
- }
- },
- "node_modules/@visx/gradient": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/@visx/gradient/-/gradient-3.3.0.tgz",
- "integrity": "sha512-t3vqukahDQsJ64/fcm85woFm2XPpSPMBz92gFvaY4J8EJY3e6rFOg382v5Dm17fgNsLRKJA0Vqo7mUtDe2pWOw==",
- "dependencies": {
- "@types/react": "*",
- "prop-types": "^15.5.7"
- },
- "peerDependencies": {
- "react": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0"
- }
- },
- "node_modules/@visx/group": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/@visx/group/-/group-3.3.0.tgz",
- "integrity": "sha512-yKepDKwJqlzvnvPS0yDuW13XNrYJE4xzT6xM7J++441nu6IybWWwextyap8ey+kU651cYDb+q1Oi6aHvQwyEyw==",
- "dependencies": {
- "@types/react": "*",
- "classnames": "^2.3.1",
- "prop-types": "^15.6.2"
- },
- "peerDependencies": {
- "react": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0"
- }
- },
- "node_modules/@visx/point": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/@visx/point/-/point-3.3.0.tgz",
- "integrity": "sha512-03eBBIJarkmX79WbeEGTUZwmS5/MUuabbiM9KfkGS9pETBTWkp1DZtEHZdp5z34x5TDQVLSi0rk1Plg3/8RtDg=="
- },
- "node_modules/@visx/scale": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/@visx/scale/-/scale-3.5.0.tgz",
- "integrity": "sha512-xo3zrXV2IZxrMq9Y9RUVJUpd93h3NO/r/y3GVi5F9AsbOzOhsLIbsPkunhO9mpUSR8LZ9TiumLEBrY+3frRBSg==",
- "dependencies": {
- "@visx/vendor": "3.5.0"
- }
- },
- "node_modules/@visx/shape": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/@visx/shape/-/shape-3.5.0.tgz",
- "integrity": "sha512-DP3t9jBQ7dSE3e6ptA1xO4QAIGxO55GrY/6P+S6YREuQGjZgq20TLYLAsiaoPEzFSS4tp0m12ZTPivWhU2VBTw==",
- "dependencies": {
- "@types/d3-path": "^1.0.8",
- "@types/d3-shape": "^1.3.1",
- "@types/lodash": "^4.14.172",
- "@types/react": "*",
- "@visx/curve": "3.3.0",
- "@visx/group": "3.3.0",
- "@visx/scale": "3.5.0",
- "classnames": "^2.3.1",
- "d3-path": "^1.0.5",
- "d3-shape": "^1.2.0",
- "lodash": "^4.17.21",
- "prop-types": "^15.5.10"
- },
- "peerDependencies": {
- "react": "^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0"
- }
- },
- "node_modules/@visx/shape/node_modules/d3-shape": {
- "version": "1.3.7",
- "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz",
- "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",
- "dependencies": {
- "d3-path": "1"
- }
- },
- "node_modules/@visx/text": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/@visx/text/-/text-3.3.0.tgz",
- "integrity": "sha512-fOimcsf0GtQE9whM5MdA/xIkHMaV29z7qNqNXysUDE8znSMKsN+ott7kSg2ljAEE89CQo3WKHkPNettoVsa84w==",
- "dependencies": {
- "@types/lodash": "^4.14.172",
- "@types/react": "*",
- "classnames": "^2.3.1",
- "lodash": "^4.17.21",
- "prop-types": "^15.7.2",
- "reduce-css-calc": "^1.3.0"
- },
- "peerDependencies": {
- "react": "^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0"
- }
- },
- "node_modules/@visx/vendor": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/@visx/vendor/-/vendor-3.5.0.tgz",
- "integrity": "sha512-yt3SEZRVmt36+APsCISSO9eSOtzQkBjt+QRxNRzcTWuzwMAaF3PHCCSe31++kkpgY9yFoF+Gfes1TBe5NlETiQ==",
- "dependencies": {
- "@types/d3-array": "3.0.3",
- "@types/d3-color": "3.1.0",
- "@types/d3-delaunay": "6.0.1",
- "@types/d3-format": "3.0.1",
- "@types/d3-geo": "3.1.0",
- "@types/d3-interpolate": "3.0.1",
- "@types/d3-scale": "4.0.2",
- "@types/d3-time": "3.0.0",
- "@types/d3-time-format": "2.1.0",
- "d3-array": "3.2.1",
- "d3-color": "3.1.0",
- "d3-delaunay": "6.0.2",
- "d3-format": "3.1.0",
- "d3-geo": "3.1.0",
- "d3-interpolate": "3.0.1",
- "d3-scale": "4.0.2",
- "d3-time": "3.1.0",
- "d3-time-format": "4.1.0",
- "internmap": "2.0.3"
- }
- },
- "node_modules/@vitejs/plugin-legacy": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-5.4.1.tgz",
- "integrity": "sha512-kee0l7dVevCNs1l3u2PnihVunvQ0WTJL2UJ/siQGD3Iht546mR9NO16tCv32uCP6lcGO1QDLqlPqInJtV1FE7A==",
- "dev": true,
- "dependencies": {
- "@babel/core": "^7.24.6",
- "@babel/preset-env": "^7.24.6",
- "browserslist": "^4.23.0",
- "browserslist-to-esbuild": "^2.1.1",
- "core-js": "^3.37.1",
- "magic-string": "^0.30.10",
- "regenerator-runtime": "^0.14.1",
- "systemjs": "^6.15.1"
- },
- "engines": {
- "node": "^18.0.0 || >=20.0.0"
- },
- "funding": {
- "url": "https://github.com/vitejs/vite?sponsor=1"
- },
- "peerDependencies": {
- "terser": "^5.4.0",
- "vite": "^5.0.0"
- }
- },
- "node_modules/@vitejs/plugin-react": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz",
- "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==",
- "dev": true,
- "dependencies": {
- "@babel/core": "^7.24.5",
- "@babel/plugin-transform-react-jsx-self": "^7.24.5",
- "@babel/plugin-transform-react-jsx-source": "^7.24.1",
- "@types/babel__core": "^7.20.5",
- "react-refresh": "^0.14.2"
- },
- "engines": {
- "node": "^14.18.0 || >=16.0.0"
- },
- "peerDependencies": {
- "vite": "^4.2.0 || ^5.0.0"
- }
- },
- "node_modules/@vitest/coverage-v8": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.6.0.tgz",
- "integrity": "sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==",
- "dev": true,
- "dependencies": {
- "@ampproject/remapping": "^2.2.1",
- "@bcoe/v8-coverage": "^0.2.3",
- "debug": "^4.3.4",
- "istanbul-lib-coverage": "^3.2.2",
- "istanbul-lib-report": "^3.0.1",
- "istanbul-lib-source-maps": "^5.0.4",
- "istanbul-reports": "^3.1.6",
- "magic-string": "^0.30.5",
- "magicast": "^0.3.3",
- "picocolors": "^1.0.0",
- "std-env": "^3.5.0",
- "strip-literal": "^2.0.0",
- "test-exclude": "^6.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- },
- "peerDependencies": {
- "vitest": "1.6.0"
- }
- },
- "node_modules/@vitest/coverage-v8/node_modules/istanbul-lib-source-maps": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.4.tgz",
- "integrity": "sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==",
- "dev": true,
- "dependencies": {
- "@jridgewell/trace-mapping": "^0.3.23",
- "debug": "^4.1.1",
- "istanbul-lib-coverage": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@vitest/expect": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz",
- "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==",
- "dev": true,
- "dependencies": {
- "@vitest/spy": "1.6.0",
- "@vitest/utils": "1.6.0",
- "chai": "^4.3.10"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- }
- },
- "node_modules/@vitest/runner": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz",
- "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==",
- "dev": true,
- "dependencies": {
- "@vitest/utils": "1.6.0",
- "p-limit": "^5.0.0",
- "pathe": "^1.1.1"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- }
- },
- "node_modules/@vitest/runner/node_modules/p-limit": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz",
- "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==",
- "dev": true,
- "dependencies": {
- "yocto-queue": "^1.0.0"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@vitest/runner/node_modules/yocto-queue": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz",
- "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==",
- "dev": true,
- "engines": {
- "node": ">=12.20"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@vitest/snapshot": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz",
- "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==",
- "dev": true,
- "dependencies": {
- "magic-string": "^0.30.5",
- "pathe": "^1.1.1",
- "pretty-format": "^29.7.0"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- }
- },
- "node_modules/@vitest/snapshot/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/@vitest/snapshot/node_modules/pretty-format": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
- "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
- "dev": true,
- "dependencies": {
- "@jest/schemas": "^29.6.3",
- "ansi-styles": "^5.0.0",
- "react-is": "^18.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@vitest/spy": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz",
- "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==",
- "dev": true,
- "dependencies": {
- "tinyspy": "^2.2.0"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- }
- },
- "node_modules/@vitest/ui": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-1.6.0.tgz",
- "integrity": "sha512-k3Lyo+ONLOgylctiGovRKy7V4+dIN2yxstX3eY5cWFXH6WP+ooVX79YSyi0GagdTQzLmT43BF27T0s6dOIPBXA==",
- "dev": true,
- "dependencies": {
- "@vitest/utils": "1.6.0",
- "fast-glob": "^3.3.2",
- "fflate": "^0.8.1",
- "flatted": "^3.2.9",
- "pathe": "^1.1.1",
- "picocolors": "^1.0.0",
- "sirv": "^2.0.4"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- },
- "peerDependencies": {
- "vitest": "1.6.0"
- }
- },
- "node_modules/@vitest/utils": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz",
- "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==",
- "dev": true,
- "dependencies": {
- "diff-sequences": "^29.6.3",
- "estree-walker": "^3.0.3",
- "loupe": "^2.3.7",
- "pretty-format": "^29.7.0"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- }
- },
- "node_modules/@vitest/utils/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/@vitest/utils/node_modules/estree-walker": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
- "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
- "dev": true,
- "dependencies": {
- "@types/estree": "^1.0.0"
- }
- },
- "node_modules/@vitest/utils/node_modules/pretty-format": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
- "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
- "dev": true,
- "dependencies": {
- "@jest/schemas": "^29.6.3",
- "ansi-styles": "^5.0.0",
- "react-is": "^18.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/abab": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
- "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
- "deprecated": "Use your platform's native atob() and btoa() methods instead",
- "dev": true,
- "optional": true,
- "peer": true
- },
- "node_modules/acorn": {
- "version": "8.11.3",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
- "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
- "dev": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-globals": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz",
- "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "acorn": "^8.1.0",
- "acorn-walk": "^8.0.2"
- }
- },
- "node_modules/acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "dev": true,
- "peerDependencies": {
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/acorn-walk": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz",
- "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==",
- "dev": true,
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "debug": "4"
- },
- "engines": {
- "node": ">= 6.0.0"
- }
- },
- "node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ansi-escapes": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz",
- "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==",
- "dev": true,
- "dependencies": {
- "type-fest": "^1.0.2"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/ansi-escapes/node_modules/type-fest": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
- "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/anymatch": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
- "dev": true,
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true
- },
- "node_modules/aria-query": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
- "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
- "dev": true,
- "dependencies": {
- "dequal": "^2.0.3"
- }
- },
- "node_modules/array-buffer-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
- "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.5",
- "is-array-buffer": "^3.0.4"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array-includes": {
- "version": "3.1.8",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz",
- "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.2",
- "es-object-atoms": "^1.0.0",
- "get-intrinsic": "^1.2.4",
- "is-string": "^1.0.7"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/array.prototype.findlast": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
- "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.2",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
- "es-shim-unscopables": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.flat": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
- "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.flatmap": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
- "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.tosorted": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
- "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.3",
- "es-errors": "^1.3.0",
- "es-shim-unscopables": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/arraybuffer.prototype.slice": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
- "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
- "dev": true,
- "dependencies": {
- "array-buffer-byte-length": "^1.0.1",
- "call-bind": "^1.0.5",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.22.3",
- "es-errors": "^1.2.1",
- "get-intrinsic": "^1.2.3",
- "is-array-buffer": "^3.0.4",
- "is-shared-array-buffer": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/assertion-error": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
- "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
- "dev": true,
- "optional": true,
- "peer": true
- },
- "node_modules/available-typed-arrays": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
- "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz",
+ "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==",
"dev": true,
- "dependencies": {
- "possible-typed-array-names": "^1.0.0"
- },
"engines": {
- "node": ">= 0.4"
+ "node": ">=14"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/babel-jest": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz",
- "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@jest/transform": "^29.7.0",
- "@types/babel__core": "^7.1.14",
- "babel-plugin-istanbul": "^6.1.1",
- "babel-preset-jest": "^29.6.3",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.8.0"
- }
- },
- "node_modules/babel-plugin-i18next-extract": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-i18next-extract/-/babel-plugin-i18next-extract-0.10.0.tgz",
- "integrity": "sha512-hHOhHFOyYnUBoUxCZyLxjjvPshknnUj4m0fgRU8dZSUfByvDIacoZOX5Eyce8YHgVxRFtpa9he51Z/BBlH/9FQ==",
- "dev": true,
- "dependencies": {
- "@babel/core": "^7.23.3",
- "@babel/types": "7.23.6",
- "deepmerge": "^4.3.1",
- "i18next": "^23.6.0",
- "json-stable-stringify": "^1.0.2"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/babel-plugin-i18next-extract/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==",
- "dev": true,
- "dependencies": {
- "@babel/helper-string-parser": "^7.23.4",
- "@babel/helper-validator-identifier": "^7.22.20",
- "to-fast-properties": "^2.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/babel-plugin-istanbul": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
- "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@istanbuljs/load-nyc-config": "^1.0.0",
- "@istanbuljs/schema": "^0.1.2",
- "istanbul-lib-instrument": "^5.0.4",
- "test-exclude": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
- "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@babel/core": "^7.12.3",
- "@babel/parser": "^7.14.7",
- "@istanbuljs/schema": "^0.1.2",
- "istanbul-lib-coverage": "^3.2.0",
- "semver": "^6.3.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/babel-plugin-istanbul/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "optional": true,
- "peer": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/babel-plugin-jest-hoist": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz",
- "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@babel/template": "^7.3.3",
- "@babel/types": "^7.3.3",
- "@types/babel__core": "^7.1.14",
- "@types/babel__traverse": "^7.0.6"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/babel-plugin-macros": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
- "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
- "dependencies": {
- "@babel/runtime": "^7.12.5",
- "cosmiconfig": "^7.0.0",
- "resolve": "^1.19.0"
- },
- "engines": {
- "node": ">=10",
- "npm": ">=6"
- }
- },
- "node_modules/babel-plugin-macros/node_modules/cosmiconfig": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
- "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
- "dependencies": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.2.1",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.10.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/babel-plugin-macros/node_modules/yaml": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
- "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/babel-plugin-polyfill-corejs2": {
- "version": "0.4.10",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz",
- "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==",
- "dependencies": {
- "@babel/compat-data": "^7.22.6",
- "@babel/helper-define-polyfill-provider": "^0.6.1",
- "semver": "^6.3.1"
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
},
"peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "bin": {
- "semver": "bin/semver.js"
+ "node_modules/@svgr/babel-plugin-svg-dynamic-title": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz",
+ "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/babel-plugin-polyfill-corejs3": {
- "version": "0.10.4",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz",
- "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==",
- "dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.6.1",
- "core-js-compat": "^3.36.1"
+ "node_modules/@svgr/babel-plugin-svg-em-dimensions": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz",
+ "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
},
"peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/babel-plugin-polyfill-regenerator": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz",
- "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==",
- "dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.6.1"
+ "node_modules/@svgr/babel-plugin-transform-react-native-svg": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz",
+ "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
},
"peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/babel-plugin-transform-react-remove-prop-types": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz",
- "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA=="
- },
- "node_modules/babel-preset-current-node-syntax": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
- "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==",
+ "node_modules/@svgr/babel-plugin-transform-svg-component": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz",
+ "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==",
"dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@babel/plugin-syntax-async-generators": "^7.8.4",
- "@babel/plugin-syntax-bigint": "^7.8.3",
- "@babel/plugin-syntax-class-properties": "^7.8.3",
- "@babel/plugin-syntax-import-meta": "^7.8.3",
- "@babel/plugin-syntax-json-strings": "^7.8.3",
- "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
- "@babel/plugin-syntax-numeric-separator": "^7.8.3",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
- "@babel/plugin-syntax-optional-chaining": "^7.8.3",
- "@babel/plugin-syntax-top-level-await": "^7.8.3"
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
},
"peerDependencies": {
- "@babel/core": "^7.0.0"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/babel-preset-jest": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz",
- "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==",
+ "node_modules/@svgr/babel-preset": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz",
+ "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "babel-plugin-jest-hoist": "^29.6.3",
- "babel-preset-current-node-syntax": "^1.0.0"
+ "@svgr/babel-plugin-add-jsx-attribute": "8.0.0",
+ "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0",
+ "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0",
+ "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0",
+ "@svgr/babel-plugin-svg-dynamic-title": "8.0.0",
+ "@svgr/babel-plugin-svg-em-dimensions": "8.0.0",
+ "@svgr/babel-plugin-transform-react-native-svg": "8.1.0",
+ "@svgr/babel-plugin-transform-svg-component": "8.0.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
},
"peerDependencies": {
- "@babel/core": "^7.0.0"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/babel-preset-react-app": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz",
- "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==",
+ "node_modules/@svgr/core": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz",
+ "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==",
+ "dev": true,
"dependencies": {
- "@babel/core": "^7.16.0",
- "@babel/plugin-proposal-class-properties": "^7.16.0",
- "@babel/plugin-proposal-decorators": "^7.16.4",
- "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0",
- "@babel/plugin-proposal-numeric-separator": "^7.16.0",
- "@babel/plugin-proposal-optional-chaining": "^7.16.0",
- "@babel/plugin-proposal-private-methods": "^7.16.0",
- "@babel/plugin-transform-flow-strip-types": "^7.16.0",
- "@babel/plugin-transform-react-display-name": "^7.16.0",
- "@babel/plugin-transform-runtime": "^7.16.4",
- "@babel/preset-env": "^7.16.4",
- "@babel/preset-react": "^7.16.0",
- "@babel/preset-typescript": "^7.16.0",
- "@babel/runtime": "^7.16.3",
- "babel-plugin-macros": "^3.1.0",
- "babel-plugin-transform-react-remove-prop-types": "^0.4.24"
+ "@babel/core": "^7.21.3",
+ "@svgr/babel-preset": "8.1.0",
+ "camelcase": "^6.2.0",
+ "cosmiconfig": "^8.1.3",
+ "snake-case": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
}
},
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
- },
- "node_modules/binary-extensions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
- "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "node_modules/@svgr/hast-util-to-babel-ast": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz",
+ "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==",
"dev": true,
+ "dependencies": {
+ "@babel/types": "^7.21.3",
+ "entities": "^4.4.0"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=14"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
}
},
- "node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "node_modules/@svgr/plugin-jsx": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz",
+ "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==",
"dev": true,
"dependencies": {
- "balanced-match": "^1.0.0"
+ "@babel/core": "^7.21.3",
+ "@svgr/babel-preset": "8.1.0",
+ "@svgr/hast-util-to-babel-ast": "8.0.0",
+ "svg-parser": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@svgr/core": "*"
}
},
- "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==",
+ "node_modules/@testing-library/dom": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.0.0.tgz",
+ "integrity": "sha512-PmJPnogldqoVFf+EwbHvbBJ98MmqASV8kLrBYgsDNxQcFMeIS7JFL48sfyXvuMtgmWO/wMhh25odr+8VhDmn4g==",
"dev": true,
+ "peer": true,
"dependencies": {
- "fill-range": "^7.1.1"
+ "@babel/code-frame": "^7.10.4",
+ "@babel/runtime": "^7.12.5",
+ "@types/aria-query": "^5.0.1",
+ "aria-query": "5.3.0",
+ "chalk": "^4.1.0",
+ "dom-accessibility-api": "^0.5.9",
+ "lz-string": "^1.5.0",
+ "pretty-format": "^27.0.2"
},
"engines": {
- "node": ">=8"
+ "node": ">=18"
}
},
- "node_modules/browserslist": {
- "version": "4.23.0",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
- "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
+ "node_modules/@testing-library/jest-dom": {
+ "version": "6.4.8",
+ "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.8.tgz",
+ "integrity": "sha512-JD0G+Zc38f5MBHA4NgxQMR5XtO5Jx9g86jqturNTt2WUfRmLDIY7iKkWHDCCTiDuFMre6nxAD5wHw9W5kI4rGw==",
+ "dev": true,
"dependencies": {
- "caniuse-lite": "^1.0.30001587",
- "electron-to-chromium": "^1.4.668",
- "node-releases": "^2.0.14",
- "update-browserslist-db": "^1.0.13"
+ "@adobe/css-tools": "^4.4.0",
+ "@babel/runtime": "^7.9.2",
+ "aria-query": "^5.0.0",
+ "chalk": "^3.0.0",
+ "css.escape": "^1.5.1",
+ "dom-accessibility-api": "^0.6.3",
+ "lodash": "^4.17.21",
+ "redent": "^3.0.0"
},
- "bin": {
- "browserslist": "cli.js"
+ "engines": {
+ "node": ">=14",
+ "npm": ">=6",
+ "yarn": ">=1"
+ }
+ },
+ "node_modules/@testing-library/jest-dom/node_modules/chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
},
"engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ "node": ">=8"
}
},
- "node_modules/browserslist-to-esbuild": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/browserslist-to-esbuild/-/browserslist-to-esbuild-2.1.1.tgz",
- "integrity": "sha512-KN+mty6C3e9AN8Z5dI1xeN15ExcRNeISoC3g7V0Kax/MMF9MSoYA2G7lkTTcVUFntiEjkpI0HNgqJC1NjdyNUw==",
+ "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz",
+ "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==",
+ "dev": true
+ },
+ "node_modules/@testing-library/react": {
+ "version": "16.0.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.0.tgz",
+ "integrity": "sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==",
"dev": true,
"dependencies": {
- "meow": "^13.0.0"
- },
- "bin": {
- "browserslist-to-esbuild": "cli/index.js"
+ "@babel/runtime": "^7.12.5"
},
"engines": {
"node": ">=18"
},
"peerDependencies": {
- "browserslist": "*"
+ "@testing-library/dom": "^10.0.0",
+ "@types/react": "^18.0.0",
+ "@types/react-dom": "^18.0.0",
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/bser": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
- "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+ "node_modules/@testing-library/user-event": {
+ "version": "13.5.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz",
+ "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.12.5"
+ },
+ "engines": {
+ "node": ">=10",
+ "npm": ">=6"
+ },
+ "peerDependencies": {
+ "@testing-library/dom": ">=7.21.4"
+ }
+ },
+ "node_modules/@tootallnate/once": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
+ "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
"dev": true,
"optional": true,
"peer": true,
- "dependencies": {
- "node-int64": "^0.4.0"
+ "engines": {
+ "node": ">= 10"
}
},
- "node_modules/buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "node_modules/@types/aria-query": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
+ "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==",
"dev": true,
"peer": true
},
- "node_modules/cac": {
- "version": "6.7.14",
- "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
- "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
"dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/call-bind": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
- "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
"dependencies": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "set-function-length": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
}
},
- "node_modules/caller-callsite": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
- "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==",
+ "node_modules/@types/babel__generator": {
+ "version": "7.6.8",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
+ "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
"dev": true,
"dependencies": {
- "callsites": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
+ "@babel/types": "^7.0.0"
}
},
- "node_modules/caller-callsite/node_modules/callsites": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
- "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==",
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
"dev": true,
- "engines": {
- "node": ">=4"
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
}
},
- "node_modules/caller-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
- "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==",
+ "node_modules/@types/babel__traverse": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz",
+ "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==",
"dev": true,
"dependencies": {
- "caller-callsite": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
+ "@babel/types": "^7.20.7"
}
},
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "engines": {
- "node": ">=6"
- }
+ "node_modules/@types/d3-array": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.3.tgz",
+ "integrity": "sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ=="
},
- "node_modules/camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
+ "node_modules/@types/d3-color": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz",
+ "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA=="
},
- "node_modules/camelize": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz",
- "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
+ "node_modules/@types/d3-delaunay": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz",
+ "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ=="
},
- "node_modules/caniuse-lite": {
- "version": "1.0.30001609",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001609.tgz",
- "integrity": "sha512-JFPQs34lHKx1B5t1EpQpWH4c+29zIyn/haGsbpfq3suuV9v56enjFt23zqijxGTMwy1p/4H2tjnQMY+p1WoAyA==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ]
+ "node_modules/@types/d3-format": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz",
+ "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg=="
},
- "node_modules/chai": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz",
- "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==",
- "dev": true,
+ "node_modules/@types/d3-geo": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz",
+ "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==",
"dependencies": {
- "assertion-error": "^1.1.0",
- "check-error": "^1.0.3",
- "deep-eql": "^4.1.3",
- "get-func-name": "^2.0.2",
- "loupe": "^2.3.6",
- "pathval": "^1.1.1",
- "type-detect": "^4.0.8"
- },
- "engines": {
- "node": ">=4"
+ "@types/geojson": "*"
}
},
- "node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
+ "node_modules/@types/d3-interpolate": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
+ "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==",
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "@types/d3-color": "*"
}
},
- "node_modules/char-regex": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
- "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=10"
- }
+ "node_modules/@types/d3-path": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.11.tgz",
+ "integrity": "sha512-4pQMp8ldf7UaB/gR8Fvvy69psNHkTpD/pVw3vmEi8iZAB9EPMBruB1JvHO4BIq9QkUUd2lV1F5YXpMNj7JPBpw=="
},
- "node_modules/check-error": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
- "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
- "dev": true,
+ "node_modules/@types/d3-scale": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.2.tgz",
+ "integrity": "sha512-Yk4htunhPAwN0XGlIwArRomOjdoBFXC3+kCxK2Ubg7I9shQlVSJy/pG/Ht5ASN+gdMIalpk8TJ5xV74jFsetLA==",
"dependencies": {
- "get-func-name": "^2.0.2"
- },
- "engines": {
- "node": "*"
+ "@types/d3-time": "*"
}
},
- "node_modules/chokidar": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
- "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
- "dev": true,
+ "node_modules/@types/d3-shape": {
+ "version": "1.3.12",
+ "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.12.tgz",
+ "integrity": "sha512-8oMzcd4+poSLGgV0R1Q1rOlx/xdmozS4Xab7np0eamFFUYq71AU9pOCJEFnkXW2aI/oXdVYJzw6pssbSut7Z9Q==",
"dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
+ "@types/d3-path": "^1"
}
},
- "node_modules/chokidar/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "node_modules/@types/d3-time": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz",
+ "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg=="
+ },
+ "node_modules/@types/d3-time-format": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-2.1.0.tgz",
+ "integrity": "sha512-/myT3I7EwlukNOX2xVdMzb8FRgNzRMpsZddwst9Ld/VFe6LyJyRp0s32l/V9XoUzk+Gqu56F/oGk6507+8BxrA=="
+ },
+ "node_modules/@types/eslint": {
+ "version": "8.56.9",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.9.tgz",
+ "integrity": "sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg==",
"dev": true,
"dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
+ "@types/estree": "*",
+ "@types/json-schema": "*"
}
},
- "node_modules/ci-info": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
- "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+ "node_modules/@types/estree": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
+ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
"dev": true
},
- "node_modules/cjs-module-lexer": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz",
- "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==",
- "dev": true,
- "optional": true,
- "peer": true
- },
- "node_modules/classnames": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
- "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
+ "node_modules/@types/geojson": {
+ "version": "7946.0.14",
+ "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz",
+ "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg=="
},
- "node_modules/cli-cursor": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz",
- "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==",
- "dev": true,
+ "node_modules/@types/hoist-non-react-statics": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz",
+ "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==",
"dependencies": {
- "restore-cursor": "^4.0.0"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0"
}
},
- "node_modules/cli-truncate": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz",
- "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==",
- "dev": true,
- "dependencies": {
- "slice-ansi": "^5.0.0",
- "string-width": "^5.0.0"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true
},
- "node_modules/cliui": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
- "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "node_modules/@types/lodash": {
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz",
+ "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA=="
+ },
+ "node_modules/@types/node": {
+ "version": "20.12.7",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz",
+ "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==",
"dev": true,
"optional": true,
"peer": true,
"dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.1",
- "wrap-ansi": "^7.0.0"
- },
- "engines": {
- "node": ">=12"
+ "undici-types": "~5.26.4"
}
},
- "node_modules/cliui/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true,
- "optional": true,
- "peer": true
+ "node_modules/@types/normalize-package-data": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
+ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
+ "dev": true
},
- "node_modules/cliui/node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
+ "node_modules/@types/parse-json": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
+ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="
},
- "node_modules/cliui/node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "optional": true,
- "peer": true,
+ "node_modules/@types/prop-types": {
+ "version": "15.7.12",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz",
+ "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q=="
+ },
+ "node_modules/@types/react": {
+ "version": "18.3.3",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz",
+ "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==",
"dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
+ "@types/prop-types": "*",
+ "csstype": "^3.0.2"
}
},
- "node_modules/cliui/node_modules/wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "node_modules/@types/react-dom": {
+ "version": "18.3.0",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz",
+ "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ "@types/react": "*"
}
},
- "node_modules/clsx": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz",
- "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==",
- "engines": {
- "node": ">=6"
+ "node_modules/@types/react-redux": {
+ "version": "7.1.33",
+ "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.33.tgz",
+ "integrity": "sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==",
+ "dependencies": {
+ "@types/hoist-non-react-statics": "^3.3.0",
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0",
+ "redux": "^4.0.0"
}
},
- "node_modules/co": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
- "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "iojs": ">= 1.0.0",
- "node": ">= 0.12.0"
+ "node_modules/@types/react-redux/node_modules/redux": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz",
+ "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==",
+ "dependencies": {
+ "@babel/runtime": "^7.9.2"
}
},
- "node_modules/collect-v8-coverage": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz",
- "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==",
- "dev": true,
- "optional": true,
- "peer": true
+ "node_modules/@types/stylis": {
+ "version": "4.2.5",
+ "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz",
+ "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw=="
},
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "node_modules/@types/use-sync-external-store": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz",
+ "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA=="
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.0.0.tgz",
+ "integrity": "sha512-STIZdwEQRXAHvNUS6ILDf5z3u95Gc8jzywunxSNqX00OooIemaaNIA0vEgynJlycL5AjabYLLrIyHd4iazyvtg==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.10.0",
+ "@typescript-eslint/scope-manager": "8.0.0",
+ "@typescript-eslint/type-utils": "8.0.0",
+ "@typescript-eslint/utils": "8.0.0",
+ "@typescript-eslint/visitor-keys": "8.0.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.3.1",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0",
+ "eslint": "^8.57.0 || ^9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.0.0.tgz",
+ "integrity": "sha512-pS1hdZ+vnrpDIxuFXYQpLTILglTjSYJ9MbetZctrUawogUsPdz31DIIRZ9+rab0LhYNTsk88w4fIzVheiTbWOQ==",
"dev": true,
"dependencies": {
- "color-name": "~1.1.4"
+ "@typescript-eslint/scope-manager": "8.0.0",
+ "@typescript-eslint/types": "8.0.0",
+ "@typescript-eslint/typescript-estree": "8.0.0",
+ "@typescript-eslint/visitor-keys": "8.0.0",
+ "debug": "^4.3.4"
},
"engines": {
- "node": ">=7.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
}
},
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/colorette": {
- "version": "2.0.20",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
- "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
- "dev": true
- },
- "node_modules/combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.0.tgz",
+ "integrity": "sha512-V0aa9Csx/ZWWv2IPgTfY7T4agYwJyILESu/PVqFtTFz9RIS823mAze+NbnBI8xiwdX3iqeQbcTYlvB04G9wyQw==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "delayed-stream": "~1.0.0"
+ "@typescript-eslint/types": "8.0.0",
+ "@typescript-eslint/visitor-keys": "8.0.0"
},
"engines": {
- "node": ">= 0.8"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.0.0.tgz",
+ "integrity": "sha512-mJAFP2mZLTBwAn5WI4PMakpywfWFH5nQZezUQdSKV23Pqo6o9iShQg1hP2+0hJJXP2LnZkWPphdIq4juYYwCeg==",
"dev": true,
- "peer": true
- },
- "node_modules/compute-scroll-into-view": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz",
- "integrity": "sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg=="
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true
- },
- "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=="
- },
- "node_modules/core-js": {
- "version": "3.37.1",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz",
- "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==",
- "hasInstallScript": true,
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "8.0.0",
+ "@typescript-eslint/utils": "8.0.0",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
"funding": {
"type": "opencollective",
- "url": "https://opencollective.com/core-js"
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
}
},
- "node_modules/core-js-compat": {
- "version": "3.36.1",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz",
- "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==",
- "dependencies": {
- "browserslist": "^4.23.0"
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.0.tgz",
+ "integrity": "sha512-wgdSGs9BTMWQ7ooeHtu5quddKKs5Z5dS+fHLbrQI+ID0XWJLODGMHRfhwImiHoeO2S5Wir2yXuadJN6/l4JRxw==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
- "url": "https://opencollective.com/core-js"
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/cosmiconfig": {
- "version": "8.3.6",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
- "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.0.tgz",
+ "integrity": "sha512-5b97WpKMX+Y43YKi4zVcCVLtK5F98dFls3Oxui8LbnmRsseKenbbDinmvxrWegKDMmlkIq/XHuyy0UGLtpCDKg==",
"dev": true,
"dependencies": {
- "import-fresh": "^3.3.0",
- "js-yaml": "^4.1.0",
- "parse-json": "^5.2.0",
- "path-type": "^4.0.0"
+ "@typescript-eslint/types": "8.0.0",
+ "@typescript-eslint/visitor-keys": "8.0.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^1.3.0"
},
"engines": {
- "node": ">=14"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://github.com/sponsors/d-fischer"
- },
- "peerDependencies": {
- "typescript": ">=4.9.5"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
},
"peerDependenciesMeta": {
"typescript": {
@@ -6232,701 +3950,751 @@
}
}
},
- "node_modules/create-jest": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz",
- "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==",
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.0.0.tgz",
+ "integrity": "sha512-k/oS/A/3QeGLRvOWCg6/9rATJL5rec7/5s1YmdS0ZU6LHveJyGFwBvLhSRBv6i9xaj7etmosp+l+ViN1I9Aj/Q==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "@jest/types": "^29.6.3",
- "chalk": "^4.0.0",
- "exit": "^0.1.2",
- "graceful-fs": "^4.2.9",
- "jest-config": "^29.7.0",
- "jest-util": "^29.7.0",
- "prompts": "^2.0.1"
- },
- "bin": {
- "create-jest": "bin/create-jest.js"
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@typescript-eslint/scope-manager": "8.0.0",
+ "@typescript-eslint/types": "8.0.0",
+ "@typescript-eslint/typescript-estree": "8.0.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/cross-fetch": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz",
- "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==",
- "dependencies": {
- "node-fetch": "^2.6.12"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0"
}
},
- "node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.0.tgz",
+ "integrity": "sha512-oN0K4nkHuOyF3PVMyETbpP5zp6wfyOvm7tWhTMfoqxSSsPmJIh6JNASuZDlODE8eE+0EB9uar+6+vxr9DBTYOA==",
"dev": true,
"dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
+ "@typescript-eslint/types": "8.0.0",
+ "eslint-visitor-keys": "^3.4.3"
},
"engines": {
- "node": ">= 8"
- }
- },
- "node_modules/css-box-model": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz",
- "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==",
- "dependencies": {
- "tiny-invariant": "^1.0.6"
- }
- },
- "node_modules/css-color-keywords": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz",
- "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/css-to-react-native": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz",
- "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==",
- "dependencies": {
- "camelize": "^1.0.0",
- "css-color-keywords": "^1.0.0",
- "postcss-value-parser": "^4.0.2"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/css.escape": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
- "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==",
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
+ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
"dev": true
},
- "node_modules/cssom": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
- "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==",
- "dev": true,
- "optional": true,
- "peer": true
- },
- "node_modules/cssstyle": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
- "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
- "dev": true,
- "optional": true,
- "peer": true,
+ "node_modules/@visx/axis": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/@visx/axis/-/axis-3.10.1.tgz",
+ "integrity": "sha512-HBEDLcpZoJ16hFbkYu3S6mN5mbwlFmUWY5yN967X06RdIL4LmAG3gnZ7u4F9buA3LQo+trJXW78moN005odD4Q==",
"dependencies": {
- "cssom": "~0.3.6"
+ "@types/react": "*",
+ "@visx/group": "3.3.0",
+ "@visx/point": "3.3.0",
+ "@visx/scale": "3.5.0",
+ "@visx/shape": "3.5.0",
+ "@visx/text": "3.3.0",
+ "classnames": "^2.3.1",
+ "prop-types": "^15.6.0"
},
- "engines": {
- "node": ">=8"
+ "peerDependencies": {
+ "react": "^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0"
}
},
- "node_modules/cssstyle/node_modules/cssom": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
- "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
- "dev": true,
- "optional": true,
- "peer": true
+ "node_modules/@visx/curve": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/@visx/curve/-/curve-3.3.0.tgz",
+ "integrity": "sha512-G1l1rzGWwIs8ka3mBhO/gj8uYK6XdU/3bwRSoiZ+MockMahQFPog0bUkuVgPwwzPSJfsA/E5u53Y/DNesnHQxg==",
+ "dependencies": {
+ "@types/d3-shape": "^1.3.1",
+ "d3-shape": "^1.0.6"
+ }
},
- "node_modules/csstype": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
- "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+ "node_modules/@visx/curve/node_modules/d3-shape": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz",
+ "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",
+ "dependencies": {
+ "d3-path": "1"
+ }
},
- "node_modules/d3-array": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.1.tgz",
- "integrity": "sha512-gUY/qeHq/yNqqoCKNq4vtpFLdoCdvyNpWoC/KNjhGbhDuQpAM9sIQQKkXSNpXa9h5KySs/gzm7R88WkUutgwWQ==",
+ "node_modules/@visx/gradient": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/@visx/gradient/-/gradient-3.3.0.tgz",
+ "integrity": "sha512-t3vqukahDQsJ64/fcm85woFm2XPpSPMBz92gFvaY4J8EJY3e6rFOg382v5Dm17fgNsLRKJA0Vqo7mUtDe2pWOw==",
"dependencies": {
- "internmap": "1 - 2"
+ "@types/react": "*",
+ "prop-types": "^15.5.7"
},
- "engines": {
- "node": ">=12"
+ "peerDependencies": {
+ "react": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0"
}
},
- "node_modules/d3-cloud": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/d3-cloud/-/d3-cloud-1.2.7.tgz",
- "integrity": "sha512-8TrgcgwRIpoZYQp7s3fGB7tATWfhckRb8KcVd1bOgqkNdkJRDGWfdSf4HkHHzZxSczwQJdSxvfPudwir5IAJ3w==",
+ "node_modules/@visx/group": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/@visx/group/-/group-3.3.0.tgz",
+ "integrity": "sha512-yKepDKwJqlzvnvPS0yDuW13XNrYJE4xzT6xM7J++441nu6IybWWwextyap8ey+kU651cYDb+q1Oi6aHvQwyEyw==",
"dependencies": {
- "d3-dispatch": "^1.0.3"
+ "@types/react": "*",
+ "classnames": "^2.3.1",
+ "prop-types": "^15.6.2"
+ },
+ "peerDependencies": {
+ "react": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0"
}
},
- "node_modules/d3-color": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
- "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
- "engines": {
- "node": ">=12"
+ "node_modules/@visx/point": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/@visx/point/-/point-3.3.0.tgz",
+ "integrity": "sha512-03eBBIJarkmX79WbeEGTUZwmS5/MUuabbiM9KfkGS9pETBTWkp1DZtEHZdp5z34x5TDQVLSi0rk1Plg3/8RtDg=="
+ },
+ "node_modules/@visx/scale": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/@visx/scale/-/scale-3.5.0.tgz",
+ "integrity": "sha512-xo3zrXV2IZxrMq9Y9RUVJUpd93h3NO/r/y3GVi5F9AsbOzOhsLIbsPkunhO9mpUSR8LZ9TiumLEBrY+3frRBSg==",
+ "dependencies": {
+ "@visx/vendor": "3.5.0"
}
},
- "node_modules/d3-delaunay": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz",
- "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==",
+ "node_modules/@visx/shape": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/@visx/shape/-/shape-3.5.0.tgz",
+ "integrity": "sha512-DP3t9jBQ7dSE3e6ptA1xO4QAIGxO55GrY/6P+S6YREuQGjZgq20TLYLAsiaoPEzFSS4tp0m12ZTPivWhU2VBTw==",
"dependencies": {
- "delaunator": "5"
+ "@types/d3-path": "^1.0.8",
+ "@types/d3-shape": "^1.3.1",
+ "@types/lodash": "^4.14.172",
+ "@types/react": "*",
+ "@visx/curve": "3.3.0",
+ "@visx/group": "3.3.0",
+ "@visx/scale": "3.5.0",
+ "classnames": "^2.3.1",
+ "d3-path": "^1.0.5",
+ "d3-shape": "^1.2.0",
+ "lodash": "^4.17.21",
+ "prop-types": "^15.5.10"
},
- "engines": {
- "node": ">=12"
+ "peerDependencies": {
+ "react": "^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0"
}
},
- "node_modules/d3-dispatch": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz",
- "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA=="
+ "node_modules/@visx/shape/node_modules/d3-shape": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz",
+ "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",
+ "dependencies": {
+ "d3-path": "1"
+ }
},
- "node_modules/d3-force": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz",
- "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==",
+ "node_modules/@visx/text": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/@visx/text/-/text-3.3.0.tgz",
+ "integrity": "sha512-fOimcsf0GtQE9whM5MdA/xIkHMaV29z7qNqNXysUDE8znSMKsN+ott7kSg2ljAEE89CQo3WKHkPNettoVsa84w==",
"dependencies": {
- "d3-dispatch": "1 - 3",
- "d3-quadtree": "1 - 3",
- "d3-timer": "1 - 3"
+ "@types/lodash": "^4.14.172",
+ "@types/react": "*",
+ "classnames": "^2.3.1",
+ "lodash": "^4.17.21",
+ "prop-types": "^15.7.2",
+ "reduce-css-calc": "^1.3.0"
},
- "engines": {
- "node": ">=12"
+ "peerDependencies": {
+ "react": "^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0"
}
},
- "node_modules/d3-format": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
- "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==",
- "engines": {
- "node": ">=12"
+ "node_modules/@visx/vendor": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/@visx/vendor/-/vendor-3.5.0.tgz",
+ "integrity": "sha512-yt3SEZRVmt36+APsCISSO9eSOtzQkBjt+QRxNRzcTWuzwMAaF3PHCCSe31++kkpgY9yFoF+Gfes1TBe5NlETiQ==",
+ "dependencies": {
+ "@types/d3-array": "3.0.3",
+ "@types/d3-color": "3.1.0",
+ "@types/d3-delaunay": "6.0.1",
+ "@types/d3-format": "3.0.1",
+ "@types/d3-geo": "3.1.0",
+ "@types/d3-interpolate": "3.0.1",
+ "@types/d3-scale": "4.0.2",
+ "@types/d3-time": "3.0.0",
+ "@types/d3-time-format": "2.1.0",
+ "d3-array": "3.2.1",
+ "d3-color": "3.1.0",
+ "d3-delaunay": "6.0.2",
+ "d3-format": "3.1.0",
+ "d3-geo": "3.1.0",
+ "d3-interpolate": "3.0.1",
+ "d3-scale": "4.0.2",
+ "d3-time": "3.1.0",
+ "d3-time-format": "4.1.0",
+ "internmap": "2.0.3"
}
},
- "node_modules/d3-geo": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz",
- "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==",
+ "node_modules/@vitejs/plugin-legacy": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-5.4.1.tgz",
+ "integrity": "sha512-kee0l7dVevCNs1l3u2PnihVunvQ0WTJL2UJ/siQGD3Iht546mR9NO16tCv32uCP6lcGO1QDLqlPqInJtV1FE7A==",
+ "dev": true,
"dependencies": {
- "d3-array": "2.5.0 - 3"
+ "@babel/core": "^7.24.6",
+ "@babel/preset-env": "^7.24.6",
+ "browserslist": "^4.23.0",
+ "browserslist-to-esbuild": "^2.1.1",
+ "core-js": "^3.37.1",
+ "magic-string": "^0.30.10",
+ "regenerator-runtime": "^0.14.1",
+ "systemjs": "^6.15.1"
},
"engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-hierarchy": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",
- "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==",
- "engines": {
- "node": ">=12"
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "peerDependencies": {
+ "terser": "^5.4.0",
+ "vite": "^5.0.0"
}
},
- "node_modules/d3-interpolate": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
- "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
+ "node_modules/@vitejs/plugin-react": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz",
+ "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==",
+ "dev": true,
"dependencies": {
- "d3-color": "1 - 3"
+ "@babel/core": "^7.24.5",
+ "@babel/plugin-transform-react-jsx-self": "^7.24.5",
+ "@babel/plugin-transform-react-jsx-source": "^7.24.1",
+ "@types/babel__core": "^7.20.5",
+ "react-refresh": "^0.14.2"
},
"engines": {
- "node": ">=12"
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.2.0 || ^5.0.0"
}
},
- "node_modules/d3-path": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz",
- "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="
- },
- "node_modules/d3-quadtree": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz",
- "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==",
- "engines": {
- "node": ">=12"
+ "node_modules/@vitest/coverage-v8": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.6.0.tgz",
+ "integrity": "sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.1",
+ "@bcoe/v8-coverage": "^0.2.3",
+ "debug": "^4.3.4",
+ "istanbul-lib-coverage": "^3.2.2",
+ "istanbul-lib-report": "^3.0.1",
+ "istanbul-lib-source-maps": "^5.0.4",
+ "istanbul-reports": "^3.1.6",
+ "magic-string": "^0.30.5",
+ "magicast": "^0.3.3",
+ "picocolors": "^1.0.0",
+ "std-env": "^3.5.0",
+ "strip-literal": "^2.0.0",
+ "test-exclude": "^6.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "vitest": "1.6.0"
}
},
- "node_modules/d3-scale": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
- "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
+ "node_modules/@vitest/coverage-v8/node_modules/istanbul-lib-source-maps": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.4.tgz",
+ "integrity": "sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==",
+ "dev": true,
"dependencies": {
- "d3-array": "2.10.0 - 3",
- "d3-format": "1 - 3",
- "d3-interpolate": "1.2.0 - 3",
- "d3-time": "2.1.1 - 3",
- "d3-time-format": "2 - 4"
+ "@jridgewell/trace-mapping": "^0.3.23",
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=10"
}
},
- "node_modules/d3-shape": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
- "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
+ "node_modules/@vitest/expect": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz",
+ "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==",
+ "dev": true,
"dependencies": {
- "d3-path": "^3.1.0"
+ "@vitest/spy": "1.6.0",
+ "@vitest/utils": "1.6.0",
+ "chai": "^4.3.10"
},
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-shape/node_modules/d3-path": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
- "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
- "engines": {
- "node": ">=12"
+ "funding": {
+ "url": "https://opencollective.com/vitest"
}
},
- "node_modules/d3-time": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
- "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
+ "node_modules/@vitest/runner": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz",
+ "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==",
+ "dev": true,
"dependencies": {
- "d3-array": "2 - 3"
+ "@vitest/utils": "1.6.0",
+ "p-limit": "^5.0.0",
+ "pathe": "^1.1.1"
},
- "engines": {
- "node": ">=12"
+ "funding": {
+ "url": "https://opencollective.com/vitest"
}
},
- "node_modules/d3-time-format": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
- "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
+ "node_modules/@vitest/runner/node_modules/p-limit": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz",
+ "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==",
+ "dev": true,
"dependencies": {
- "d3-time": "1 - 3"
+ "yocto-queue": "^1.0.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/d3-timer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
- "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
+ "node_modules/@vitest/runner/node_modules/yocto-queue": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz",
+ "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==",
+ "dev": true,
"engines": {
- "node": ">=12"
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/data-urls": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz",
- "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==",
+ "node_modules/@vitest/snapshot": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz",
+ "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "abab": "^2.0.6",
- "whatwg-mimetype": "^3.0.0",
- "whatwg-url": "^11.0.0"
+ "magic-string": "^0.30.5",
+ "pathe": "^1.1.1",
+ "pretty-format": "^29.7.0"
},
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/snapshot/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
"engines": {
- "node": ">=12"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/data-view-buffer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
- "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
+ "node_modules/@vitest/snapshot/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.6",
- "es-errors": "^1.3.0",
- "is-data-view": "^1.0.1"
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@vitest/spy": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz",
+ "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==",
+ "dev": true,
+ "dependencies": {
+ "tinyspy": "^2.2.0"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://opencollective.com/vitest"
}
},
- "node_modules/data-view-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
- "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
+ "node_modules/@vitest/ui": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-1.6.0.tgz",
+ "integrity": "sha512-k3Lyo+ONLOgylctiGovRKy7V4+dIN2yxstX3eY5cWFXH6WP+ooVX79YSyi0GagdTQzLmT43BF27T0s6dOIPBXA==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.7",
- "es-errors": "^1.3.0",
- "is-data-view": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
+ "@vitest/utils": "1.6.0",
+ "fast-glob": "^3.3.2",
+ "fflate": "^0.8.1",
+ "flatted": "^3.2.9",
+ "pathe": "^1.1.1",
+ "picocolors": "^1.0.0",
+ "sirv": "^2.0.4"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "vitest": "1.6.0"
}
},
- "node_modules/data-view-byte-offset": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
- "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
+ "node_modules/@vitest/utils": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz",
+ "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.6",
- "es-errors": "^1.3.0",
- "is-data-view": "^1.0.1"
+ "diff-sequences": "^29.6.3",
+ "estree-walker": "^3.0.3",
+ "loupe": "^2.3.7",
+ "pretty-format": "^29.7.0"
},
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/utils/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
"engines": {
- "node": ">= 0.4"
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/date-fns": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz",
- "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/kossnocorp"
+ "node_modules/@vitest/utils/node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "^1.0.0"
}
},
- "node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "node_modules/@vitest/utils/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
"dependencies": {
- "ms": "2.1.2"
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
},
"engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/decimal.js": {
- "version": "10.4.3",
- "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
- "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
+ "node_modules/abab": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
+ "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
+ "deprecated": "Use your platform's native atob() and btoa() methods instead",
"dev": true,
"optional": true,
"peer": true
},
- "node_modules/dedent": {
- "version": "1.5.3",
- "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz",
- "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==",
+ "node_modules/acorn": {
+ "version": "8.11.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
+ "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-globals": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz",
+ "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==",
"dev": true,
"optional": true,
"peer": true,
- "peerDependencies": {
- "babel-plugin-macros": "^3.1.0"
- },
- "peerDependenciesMeta": {
- "babel-plugin-macros": {
- "optional": true
- }
+ "dependencies": {
+ "acorn": "^8.1.0",
+ "acorn-walk": "^8.0.2"
}
},
- "node_modules/deep-diff": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz",
- "integrity": "sha512-yVn6RZmHiGnxRKR9sJb3iVV2XTF1Ghh2DiWRZ3dMnGc43yUdWWF/kX6lQyk3+P84iprfWKU/8zFTrlkvtFm1ug=="
- },
- "node_modules/deep-eql": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
- "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
"dev": true,
- "dependencies": {
- "type-detect": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
- "node_modules/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true
- },
- "node_modules/deepmerge": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
- "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "node_modules/acorn-walk": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz",
+ "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==",
"dev": true,
"engines": {
- "node": ">=0.10.0"
+ "node": ">=0.4.0"
}
},
- "node_modules/define-data-property": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
- "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
"dependencies": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "gopd": "^1.0.1"
+ "debug": "4"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">= 6.0.0"
}
},
- "node_modules/define-properties": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
- "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"dependencies": {
- "define-data-property": "^1.0.1",
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/delaunator": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz",
- "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==",
- "dependencies": {
- "robust-predicates": "^3.0.2"
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
}
},
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "node_modules/ansi-escapes": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz",
+ "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==",
"dev": true,
- "optional": true,
- "peer": true,
+ "dependencies": {
+ "type-fest": "^1.0.2"
+ },
"engines": {
- "node": ">=0.4.0"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/dequal": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
- "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "node_modules/ansi-escapes/node_modules/type-fest": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
+ "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
"dev": true,
"engines": {
- "node": ">=6"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/detect-newline": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
- "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
- "optional": true,
- "peer": true,
"engines": {
"node": ">=8"
}
},
- "node_modules/diff-sequences": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
- "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
- "dev": true,
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"dependencies": {
- "path-type": "^4.0.0"
+ "color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
"dev": true,
"dependencies": {
- "esutils": "^2.0.2"
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
},
"engines": {
- "node": ">=6.0.0"
+ "node": ">= 8"
}
},
- "node_modules/dom-accessibility-api": {
- "version": "0.5.16",
- "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz",
- "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==",
- "dev": true,
- "peer": true
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
},
- "node_modules/domexception": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
- "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
- "deprecated": "Use your platform's native DOMException instead",
+ "node_modules/aria-query": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
+ "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "webidl-conversions": "^7.0.0"
- },
- "engines": {
- "node": ">=12"
+ "dequal": "^2.0.3"
}
},
- "node_modules/dot-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
- "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
+ "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
"dev": true,
"dependencies": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/downshift": {
- "version": "9.0.6",
- "resolved": "https://registry.npmjs.org/downshift/-/downshift-9.0.6.tgz",
- "integrity": "sha512-lkqWh0eb34XuH+3z3/BH/LGVRV7ur0rielSlxtlQKsjAFF/wc/c0wsM9phUGXyzK2g1QWHoNHQyc+vVAheI17Q==",
- "dependencies": {
- "@babel/runtime": "^7.24.5",
- "compute-scroll-into-view": "^3.1.0",
- "prop-types": "^15.8.1",
- "react-is": "18.2.0",
- "tslib": "^2.6.2"
+ "call-bind": "^1.0.5",
+ "is-array-buffer": "^3.0.4"
},
- "peerDependencies": {
- "react": ">=16.12.0"
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/eastasianwidth": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
- "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
- "dev": true
- },
- "node_modules/electron-to-chromium": {
- "version": "1.4.736",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz",
- "integrity": "sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q=="
- },
- "node_modules/emittery": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
- "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
+ "node_modules/array-includes": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz",
+ "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==",
"dev": true,
- "optional": true,
- "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "is-string": "^1.0.7"
+ },
"engines": {
- "node": ">=12"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sindresorhus/emittery?sponsor=1"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "dev": true
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/end-of-stream": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
- "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "node_modules/array.prototype.findlast": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+ "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
"dev": true,
"dependencies": {
- "once": "^1.4.0"
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/entities": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
- "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
+ "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
"dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ },
"engines": {
- "node": ">=0.12"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/error-ex": {
+ "node_modules/array.prototype.flatmap": {
"version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
+ "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
+ "dev": true,
"dependencies": {
- "is-arrayish": "^0.2.1"
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/es-abstract": {
- "version": "1.23.3",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
- "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==",
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
+ "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
"dev": true,
"dependencies": {
- "array-buffer-byte-length": "^1.0.1",
- "arraybuffer.prototype.slice": "^1.0.3",
- "available-typed-arrays": "^1.0.7",
"call-bind": "^1.0.7",
- "data-view-buffer": "^1.0.1",
- "data-view-byte-length": "^1.0.1",
- "data-view-byte-offset": "^1.0.0",
- "es-define-property": "^1.0.0",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3",
"es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
- "es-set-tostringtag": "^2.0.3",
- "es-to-primitive": "^1.2.1",
- "function.prototype.name": "^1.1.6",
- "get-intrinsic": "^1.2.4",
- "get-symbol-description": "^1.0.2",
- "globalthis": "^1.0.3",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.2",
- "has-proto": "^1.0.3",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.2",
- "internal-slot": "^1.0.7",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
+ "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
+ "dev": true,
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.22.3",
+ "es-errors": "^1.2.1",
+ "get-intrinsic": "^1.2.3",
"is-array-buffer": "^3.0.4",
- "is-callable": "^1.2.7",
- "is-data-view": "^1.0.1",
- "is-negative-zero": "^2.0.3",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.3",
- "is-string": "^1.0.7",
- "is-typed-array": "^1.1.13",
- "is-weakref": "^1.0.2",
- "object-inspect": "^1.13.1",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.5",
- "regexp.prototype.flags": "^1.5.2",
- "safe-array-concat": "^1.1.2",
- "safe-regex-test": "^1.0.3",
- "string.prototype.trim": "^1.2.9",
- "string.prototype.trimend": "^1.0.8",
- "string.prototype.trimstart": "^1.0.8",
- "typed-array-buffer": "^1.0.2",
- "typed-array-byte-length": "^1.0.1",
- "typed-array-byte-offset": "^1.0.2",
- "typed-array-length": "^1.0.6",
- "unbox-primitive": "^1.0.2",
- "which-typed-array": "^1.1.15"
+ "is-shared-array-buffer": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -6935,861 +4703,921 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/es-define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
- "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+ "node_modules/assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "dev": true,
"dependencies": {
- "get-intrinsic": "^1.2.4"
+ "possible-typed-array-names": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/es-errors": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "node_modules/babel-plugin-i18next-extract": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-i18next-extract/-/babel-plugin-i18next-extract-0.10.0.tgz",
+ "integrity": "sha512-hHOhHFOyYnUBoUxCZyLxjjvPshknnUj4m0fgRU8dZSUfByvDIacoZOX5Eyce8YHgVxRFtpa9he51Z/BBlH/9FQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.23.3",
+ "@babel/types": "7.23.6",
+ "deepmerge": "^4.3.1",
+ "i18next": "^23.6.0",
+ "json-stable-stringify": "^1.0.2"
+ },
"engines": {
- "node": ">= 0.4"
+ "node": ">=10.0.0"
}
},
- "node_modules/es-iterator-helpers": {
- "version": "1.0.19",
- "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz",
- "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==",
+ "node_modules/babel-plugin-i18next-extract/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==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.3",
- "es-errors": "^1.3.0",
- "es-set-tostringtag": "^2.0.3",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "globalthis": "^1.0.3",
- "has-property-descriptors": "^1.0.2",
- "has-proto": "^1.0.3",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.7",
- "iterator.prototype": "^1.1.2",
- "safe-array-concat": "^1.1.2"
+ "@babel/helper-string-parser": "^7.23.4",
+ "@babel/helper-validator-identifier": "^7.22.20",
+ "to-fast-properties": "^2.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/babel-plugin-macros": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
+ "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "cosmiconfig": "^7.0.0",
+ "resolve": "^1.19.0"
+ },
+ "engines": {
+ "node": ">=10",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/babel-plugin-macros/node_modules/cosmiconfig": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+ "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/babel-plugin-macros/node_modules/yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "engines": {
+ "node": ">= 6"
}
},
- "node_modules/es-object-atoms": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
- "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
- "dev": true,
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.10",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz",
+ "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==",
"dependencies": {
- "es-errors": "^1.3.0"
+ "@babel/compat-data": "^7.22.6",
+ "@babel/helper-define-polyfill-provider": "^0.6.1",
+ "semver": "^6.3.1"
},
- "engines": {
- "node": ">= 0.4"
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
}
},
- "node_modules/es-set-tostringtag": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
- "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
- "dev": true,
+ "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.10.4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz",
+ "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==",
"dependencies": {
- "get-intrinsic": "^1.2.4",
- "has-tostringtag": "^1.0.2",
- "hasown": "^2.0.1"
+ "@babel/helper-define-polyfill-provider": "^0.6.1",
+ "core-js-compat": "^3.36.1"
},
- "engines": {
- "node": ">= 0.4"
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
}
},
- "node_modules/es-shim-unscopables": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
- "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
- "dev": true,
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz",
+ "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==",
"dependencies": {
- "hasown": "^2.0.0"
+ "@babel/helper-define-polyfill-provider": "^0.6.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
}
},
- "node_modules/es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "dev": true,
+ "node_modules/babel-plugin-transform-react-remove-prop-types": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz",
+ "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA=="
+ },
+ "node_modules/babel-preset-react-app": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz",
+ "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==",
"dependencies": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "@babel/core": "^7.16.0",
+ "@babel/plugin-proposal-class-properties": "^7.16.0",
+ "@babel/plugin-proposal-decorators": "^7.16.4",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0",
+ "@babel/plugin-proposal-numeric-separator": "^7.16.0",
+ "@babel/plugin-proposal-optional-chaining": "^7.16.0",
+ "@babel/plugin-proposal-private-methods": "^7.16.0",
+ "@babel/plugin-transform-flow-strip-types": "^7.16.0",
+ "@babel/plugin-transform-react-display-name": "^7.16.0",
+ "@babel/plugin-transform-runtime": "^7.16.4",
+ "@babel/preset-env": "^7.16.4",
+ "@babel/preset-react": "^7.16.0",
+ "@babel/preset-typescript": "^7.16.0",
+ "@babel/runtime": "^7.16.3",
+ "babel-plugin-macros": "^3.1.0",
+ "babel-plugin-transform-react-remove-prop-types": "^0.4.24"
}
},
- "node_modules/esbuild": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
- "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
"dev": true,
- "hasInstallScript": true,
- "bin": {
- "esbuild": "bin/esbuild"
- },
"engines": {
- "node": ">=12"
+ "node": ">=8"
},
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.21.5",
- "@esbuild/android-arm": "0.21.5",
- "@esbuild/android-arm64": "0.21.5",
- "@esbuild/android-x64": "0.21.5",
- "@esbuild/darwin-arm64": "0.21.5",
- "@esbuild/darwin-x64": "0.21.5",
- "@esbuild/freebsd-arm64": "0.21.5",
- "@esbuild/freebsd-x64": "0.21.5",
- "@esbuild/linux-arm": "0.21.5",
- "@esbuild/linux-arm64": "0.21.5",
- "@esbuild/linux-ia32": "0.21.5",
- "@esbuild/linux-loong64": "0.21.5",
- "@esbuild/linux-mips64el": "0.21.5",
- "@esbuild/linux-ppc64": "0.21.5",
- "@esbuild/linux-riscv64": "0.21.5",
- "@esbuild/linux-s390x": "0.21.5",
- "@esbuild/linux-x64": "0.21.5",
- "@esbuild/netbsd-x64": "0.21.5",
- "@esbuild/openbsd-x64": "0.21.5",
- "@esbuild/sunos-x64": "0.21.5",
- "@esbuild/win32-arm64": "0.21.5",
- "@esbuild/win32-ia32": "0.21.5",
- "@esbuild/win32-x64": "0.21.5"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/escalade": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
- "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
- "engines": {
- "node": ">=6"
+ "node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
}
},
- "node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dev": true,
- "engines": {
- "node": ">=10"
+ "dependencies": {
+ "fill-range": "^7.1.1"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/escodegen": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
- "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
- "dev": true,
- "optional": true,
- "peer": true,
+ "node_modules/browserslist": {
+ "version": "4.23.0",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
+ "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
"dependencies": {
- "esprima": "^4.0.1",
- "estraverse": "^5.2.0",
- "esutils": "^2.0.2"
+ "caniuse-lite": "^1.0.30001587",
+ "electron-to-chromium": "^1.4.668",
+ "node-releases": "^2.0.14",
+ "update-browserslist-db": "^1.0.13"
},
"bin": {
- "escodegen": "bin/escodegen.js",
- "esgenerate": "bin/esgenerate.js"
+ "browserslist": "cli.js"
},
"engines": {
- "node": ">=6.0"
- },
- "optionalDependencies": {
- "source-map": "~0.6.1"
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
- "node_modules/eslint": {
- "version": "8.57.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
- "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
+ "node_modules/browserslist-to-esbuild": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/browserslist-to-esbuild/-/browserslist-to-esbuild-2.1.1.tgz",
+ "integrity": "sha512-KN+mty6C3e9AN8Z5dI1xeN15ExcRNeISoC3g7V0Kax/MMF9MSoYA2G7lkTTcVUFntiEjkpI0HNgqJC1NjdyNUw==",
"dev": true,
"dependencies": {
- "@eslint-community/eslint-utils": "^4.2.0",
- "@eslint-community/regexpp": "^4.6.1",
- "@eslint/eslintrc": "^2.1.4",
- "@eslint/js": "8.57.0",
- "@humanwhocodes/config-array": "^0.11.14",
- "@humanwhocodes/module-importer": "^1.0.1",
- "@nodelib/fs.walk": "^1.2.8",
- "@ungap/structured-clone": "^1.2.0",
- "ajv": "^6.12.4",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
- "debug": "^4.3.2",
- "doctrine": "^3.0.0",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^7.2.2",
- "eslint-visitor-keys": "^3.4.3",
- "espree": "^9.6.1",
- "esquery": "^1.4.2",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^6.0.1",
- "find-up": "^5.0.0",
- "glob-parent": "^6.0.2",
- "globals": "^13.19.0",
- "graphemer": "^1.4.0",
- "ignore": "^5.2.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "is-path-inside": "^3.0.3",
- "js-yaml": "^4.1.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
- "lodash.merge": "^4.6.2",
- "minimatch": "^3.1.2",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.3",
- "strip-ansi": "^6.0.1",
- "text-table": "^0.2.0"
+ "meow": "^13.0.0"
},
"bin": {
- "eslint": "bin/eslint.js"
+ "browserslist-to-esbuild": "cli/index.js"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": ">=18"
},
- "funding": {
- "url": "https://opencollective.com/eslint"
+ "peerDependencies": {
+ "browserslist": "*"
}
},
- "node_modules/eslint-config-prettier": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz",
- "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==",
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true,
- "bin": {
- "eslint-config-prettier": "bin/cli.js"
- },
- "peerDependencies": {
- "eslint": ">=7.0.0"
- }
+ "peer": true
},
- "node_modules/eslint-plugin-header": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz",
- "integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==",
+ "node_modules/cac": {
+ "version": "6.7.14",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
"dev": true,
- "peerDependencies": {
- "eslint": ">=7.7.0"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/eslint-plugin-react": {
- "version": "7.35.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz",
- "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==",
- "dev": true,
+ "node_modules/call-bind": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
"dependencies": {
- "array-includes": "^3.1.8",
- "array.prototype.findlast": "^1.2.5",
- "array.prototype.flatmap": "^1.3.2",
- "array.prototype.tosorted": "^1.1.4",
- "doctrine": "^2.1.0",
- "es-iterator-helpers": "^1.0.19",
- "estraverse": "^5.3.0",
- "hasown": "^2.0.2",
- "jsx-ast-utils": "^2.4.1 || ^3.0.0",
- "minimatch": "^3.1.2",
- "object.entries": "^1.1.8",
- "object.fromentries": "^2.0.8",
- "object.values": "^1.2.0",
- "prop-types": "^15.8.1",
- "resolve": "^2.0.0-next.5",
- "semver": "^6.3.1",
- "string.prototype.matchall": "^4.0.11",
- "string.prototype.repeat": "^1.0.0"
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.1"
},
"engines": {
- "node": ">=4"
+ "node": ">= 0.4"
},
- "peerDependencies": {
- "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/eslint-plugin-react-hooks": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz",
- "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==",
+ "node_modules/caller-callsite": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
+ "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==",
"dev": true,
- "engines": {
- "node": ">=10"
+ "dependencies": {
+ "callsites": "^2.0.0"
},
- "peerDependencies": {
- "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
- }
- },
- "node_modules/eslint-plugin-react-refresh": {
- "version": "0.4.8",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.8.tgz",
- "integrity": "sha512-MIKAclwaDFIiYtVBLzDdm16E+Ty4GwhB6wZlCAG1R3Ur+F9Qbo6PRxpA5DK7XtDgm+WlCoAY2WxAwqhmIDHg6Q==",
- "dev": true,
- "peerDependencies": {
- "eslint": ">=7"
+ "engines": {
+ "node": ">=4"
}
},
- "node_modules/eslint-plugin-react/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/caller-callsite/node_modules/callsites": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
+ "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==",
"dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "engines": {
+ "node": ">=4"
}
},
- "node_modules/eslint-plugin-react/node_modules/doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "node_modules/caller-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
+ "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==",
"dev": true,
"dependencies": {
- "esutils": "^2.0.2"
+ "caller-callsite": "^2.0.0"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=4"
}
},
- "node_modules/eslint-plugin-react/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"engines": {
- "node": "*"
+ "node": ">=6"
}
},
- "node_modules/eslint-plugin-react/node_modules/resolve": {
- "version": "2.0.0-next.5",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
- "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
"dev": true,
- "dependencies": {
- "is-core-module": "^2.13.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
+ "engines": {
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/eslint-plugin-react/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
+ "node_modules/camelize": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz",
+ "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/eslint-plugin-vitest-globals": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-vitest-globals/-/eslint-plugin-vitest-globals-1.5.0.tgz",
- "integrity": "sha512-ZSsVOaOIig0oVLzRTyk8lUfBfqzWxr/J3/NFMfGGRIkGQPejJYmDH3gXmSJxAojts77uzAGB/UmVrwi2DC4LYA==",
- "dev": true
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001609",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001609.tgz",
+ "integrity": "sha512-JFPQs34lHKx1B5t1EpQpWH4c+29zIyn/haGsbpfq3suuV9v56enjFt23zqijxGTMwy1p/4H2tjnQMY+p1WoAyA==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
},
- "node_modules/eslint-scope": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
- "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "node_modules/chai": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz",
+ "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==",
"dev": true,
"dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.3",
+ "deep-eql": "^4.1.3",
+ "get-func-name": "^2.0.2",
+ "loupe": "^2.3.6",
+ "pathval": "^1.1.1",
+ "type-detect": "^4.0.8"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
+ "node": ">=4"
}
},
- "node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": ">=10"
},
"funding": {
- "url": "https://opencollective.com/eslint"
+ "url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/eslint/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/check-error": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
+ "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
"dev": true,
"dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "get-func-name": "^2.0.2"
+ },
+ "engines": {
+ "node": "*"
}
},
- "node_modules/eslint/node_modules/globals": {
- "version": "13.24.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
- "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
"dev": true,
"dependencies": {
- "type-fest": "^0.20.2"
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
},
"engines": {
- "node": ">=8"
+ "node": ">= 8.10.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
}
},
- "node_modules/eslint/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "is-glob": "^4.0.1"
},
"engines": {
- "node": "*"
+ "node": ">= 6"
}
},
- "node_modules/espree": {
- "version": "9.6.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
- "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "node_modules/ci-info": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+ "dev": true
+ },
+ "node_modules/classnames": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
+ "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
+ },
+ "node_modules/cli-cursor": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz",
+ "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==",
"dev": true,
"dependencies": {
- "acorn": "^8.9.0",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^3.4.1"
+ "restore-cursor": "^4.0.0"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
- "url": "https://opencollective.com/eslint"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "node_modules/cli-truncate": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz",
+ "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==",
"dev": true,
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
+ "dependencies": {
+ "slice-ansi": "^5.0.0",
+ "string-width": "^5.0.0"
},
"engines": {
- "node": ">=4"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/esquery": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
- "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
- "dev": true,
- "dependencies": {
- "estraverse": "^5.1.0"
- },
+ "node_modules/clsx": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz",
+ "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==",
"engines": {
- "node": ">=0.10"
+ "node": ">=6"
}
},
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"dependencies": {
- "estraverse": "^5.2.0"
+ "color-name": "~1.1.4"
},
"engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true,
- "engines": {
- "node": ">=4.0"
+ "node": ">=7.0.0"
}
},
- "node_modules/estree-walker": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
- "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/eventemitter3": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
- "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
"dev": true
},
- "node_modules/execa": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
- "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dev": true,
+ "optional": true,
+ "peer": true,
"dependencies": {
- "cross-spawn": "^6.0.0",
- "get-stream": "^4.0.0",
- "is-stream": "^1.1.0",
- "npm-run-path": "^2.0.0",
- "p-finally": "^1.0.0",
- "signal-exit": "^3.0.0",
- "strip-eof": "^1.0.0"
+ "delayed-stream": "~1.0.0"
},
"engines": {
- "node": ">=6"
+ "node": ">= 0.8"
}
},
- "node_modules/execa/node_modules/cross-spawn": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
- "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true,
+ "peer": true
+ },
+ "node_modules/compute-scroll-into-view": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz",
+ "integrity": "sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg=="
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "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=="
+ },
+ "node_modules/core-js": {
+ "version": "3.37.1",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz",
+ "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==",
+ "hasInstallScript": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.36.1",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz",
+ "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==",
"dependencies": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
+ "browserslist": "^4.23.0"
},
- "engines": {
- "node": ">=4.8"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
}
},
- "node_modules/execa/node_modules/path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
+ "node_modules/cosmiconfig": {
+ "version": "8.3.6",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
+ "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
"dev": true,
+ "dependencies": {
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0",
+ "path-type": "^4.0.0"
+ },
"engines": {
- "node": ">=4"
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
}
},
- "node_modules/execa/node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
- "dev": true,
- "bin": {
- "semver": "bin/semver"
+ "node_modules/cross-fetch": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz",
+ "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==",
+ "dependencies": {
+ "node-fetch": "^2.6.12"
}
},
- "node_modules/execa/node_modules/shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
"dev": true,
"dependencies": {
- "shebang-regex": "^1.0.0"
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 8"
+ }
+ },
+ "node_modules/css-box-model": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz",
+ "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==",
+ "dependencies": {
+ "tiny-invariant": "^1.0.6"
}
},
- "node_modules/execa/node_modules/shebang-regex": {
+ "node_modules/css-color-keywords": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
- "dev": true,
+ "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz",
+ "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=4"
}
},
- "node_modules/execa/node_modules/which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
+ "node_modules/css-to-react-native": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz",
+ "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==",
"dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "which": "bin/which"
+ "camelize": "^1.0.0",
+ "css-color-keywords": "^1.0.0",
+ "postcss-value-parser": "^4.0.2"
}
},
- "node_modules/exit": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
- "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
+ "node_modules/css.escape": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
+ "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==",
+ "dev": true
+ },
+ "node_modules/cssom": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
+ "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==",
"dev": true,
"optional": true,
- "peer": true,
- "engines": {
- "node": ">= 0.8.0"
- }
+ "peer": true
},
- "node_modules/expect": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
- "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==",
+ "node_modules/cssstyle": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+ "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
"dev": true,
"optional": true,
"peer": true,
"dependencies": {
- "@jest/expect-utils": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "jest-matcher-utils": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0"
+ "cssom": "~0.3.6"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=8"
}
},
- "node_modules/fast-deep-equal": {
+ "node_modules/cssstyle/node_modules/cssom": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/csstype": {
"version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
},
- "node_modules/fast-glob": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
- "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
- "dev": true,
+ "node_modules/d3-array": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.1.tgz",
+ "integrity": "sha512-gUY/qeHq/yNqqoCKNq4vtpFLdoCdvyNpWoC/KNjhGbhDuQpAM9sIQQKkXSNpXa9h5KySs/gzm7R88WkUutgwWQ==",
"dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
+ "internmap": "1 - 2"
},
"engines": {
- "node": ">=8.6.0"
+ "node": ">=12"
}
},
- "node_modules/fast-glob/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
+ "node_modules/d3-cloud": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/d3-cloud/-/d3-cloud-1.2.7.tgz",
+ "integrity": "sha512-8TrgcgwRIpoZYQp7s3fGB7tATWfhckRb8KcVd1bOgqkNdkJRDGWfdSf4HkHHzZxSczwQJdSxvfPudwir5IAJ3w==",
"dependencies": {
- "is-glob": "^4.0.1"
- },
+ "d3-dispatch": "^1.0.3"
+ }
+ },
+ "node_modules/d3-color": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
+ "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
"engines": {
- "node": ">= 6"
+ "node": ">=12"
}
},
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true
+ "node_modules/d3-delaunay": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz",
+ "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==",
+ "dependencies": {
+ "delaunator": "5"
+ },
+ "engines": {
+ "node": ">=12"
+ }
},
- "node_modules/fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "dev": true
+ "node_modules/d3-dispatch": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz",
+ "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA=="
},
- "node_modules/fast-xml-parser": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz",
- "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/NaturalIntelligence"
- },
- {
- "type": "paypal",
- "url": "https://paypal.me/naturalintelligence"
- }
- ],
+ "node_modules/d3-force": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz",
+ "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==",
"dependencies": {
- "strnum": "^1.0.5"
+ "d3-dispatch": "1 - 3",
+ "d3-quadtree": "1 - 3",
+ "d3-timer": "1 - 3"
},
- "bin": {
- "fxparser": "src/cli/cli.js"
+ "engines": {
+ "node": ">=12"
}
},
- "node_modules/fastq": {
- "version": "1.17.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
- "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
- "dev": true,
+ "node_modules/d3-format": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
+ "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-geo": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz",
+ "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==",
"dependencies": {
- "reusify": "^1.0.4"
+ "d3-array": "2.5.0 - 3"
+ },
+ "engines": {
+ "node": ">=12"
}
},
- "node_modules/fb-watchman": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
- "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
- "dev": true,
- "optional": true,
- "peer": true,
+ "node_modules/d3-hierarchy": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",
+ "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-interpolate": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
+ "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
"dependencies": {
- "bser": "2.1.1"
+ "d3-color": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
}
},
- "node_modules/fflate": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz",
- "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==",
- "dev": true
+ "node_modules/d3-path": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz",
+ "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="
},
- "node_modules/file-entry-cache": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
- "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
- "dev": true,
+ "node_modules/d3-quadtree": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz",
+ "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-scale": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
+ "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
"dependencies": {
- "flat-cache": "^3.0.4"
+ "d3-array": "2.10.0 - 3",
+ "d3-format": "1 - 3",
+ "d3-interpolate": "1.2.0 - 3",
+ "d3-time": "2.1.1 - 3",
+ "d3-time-format": "2 - 4"
},
"engines": {
- "node": "^10.12.0 || >=12.0.0"
+ "node": ">=12"
}
},
- "node_modules/fill-range": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
- "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
- "dev": true,
+ "node_modules/d3-shape": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
+ "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
"dependencies": {
- "to-regex-range": "^5.0.1"
+ "d3-path": "^3.1.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=12"
}
},
- "node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "dev": true,
+ "node_modules/d3-shape/node_modules/d3-path": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
+ "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-time": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
+ "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
"dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
+ "d3-array": "2 - 3"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=12"
}
},
- "node_modules/flat-cache": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
- "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
- "dev": true,
+ "node_modules/d3-time-format": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
+ "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
"dependencies": {
- "flatted": "^3.2.9",
- "keyv": "^4.5.3",
- "rimraf": "^3.0.2"
+ "d3-time": "1 - 3"
},
"engines": {
- "node": "^10.12.0 || >=12.0.0"
+ "node": ">=12"
}
},
- "node_modules/flatted": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
- "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
- "dev": true
- },
- "node_modules/for-each": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
- "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
- "dev": true,
- "dependencies": {
- "is-callable": "^1.1.3"
+ "node_modules/d3-timer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
+ "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
+ "engines": {
+ "node": ">=12"
}
},
- "node_modules/form-data": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "node_modules/data-urls": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz",
+ "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==",
"dev": true,
"optional": true,
"peer": true,
"dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
+ "abab": "^2.0.6",
+ "whatwg-mimetype": "^3.0.0",
+ "whatwg-url": "^11.0.0"
},
"engines": {
- "node": ">= 6"
+ "node": ">=12"
}
},
- "node_modules/fs-readdir-recursive": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
- "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==",
- "dev": true
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "node_modules/data-view-buffer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
+ "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
"dev": true,
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
"engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/function.prototype.name": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
- "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
+ "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "functions-have-names": "^1.2.3"
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
@@ -7798,53 +5626,96 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/functions-have-names": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
- "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
+ "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
"dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "node_modules/date-fns": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz",
+ "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/kossnocorp"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
"engines": {
- "node": ">=6.9.0"
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
}
},
- "node_modules/get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "node_modules/decimal.js": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
"dev": true,
"optional": true,
- "peer": true,
+ "peer": true
+ },
+ "node_modules/deep-diff": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz",
+ "integrity": "sha512-yVn6RZmHiGnxRKR9sJb3iVV2XTF1Ghh2DiWRZ3dMnGc43yUdWWF/kX6lQyk3+P84iprfWKU/8zFTrlkvtFm1ug=="
+ },
+ "node_modules/deep-eql": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
+ "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
+ "dev": true,
+ "dependencies": {
+ "type-detect": "^4.0.0"
+ },
"engines": {
- "node": "6.* || 8.* || >= 10.*"
+ "node": ">=6"
}
},
- "node_modules/get-func-name": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
- "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
"dev": true,
"engines": {
- "node": "*"
+ "node": ">=0.10.0"
}
},
- "node_modules/get-intrinsic": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
- "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
"dependencies": {
+ "es-define-property": "^1.0.0",
"es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.0"
+ "gopd": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
@@ -7853,897 +5724,1053 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/get-package-type": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
- "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
"dev": true,
- "optional": true,
- "peer": true,
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
"engines": {
- "node": ">=8.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/get-stdin": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz",
- "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==",
+ "node_modules/delaunator": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz",
+ "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==",
+ "dependencies": {
+ "robust-predicates": "^3.0.2"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"dev": true,
+ "optional": true,
+ "peer": true,
"engines": {
- "node": ">=8"
+ "node": ">=0.4.0"
}
},
- "node_modules/get-stream": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
- "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
"dev": true,
- "dependencies": {
- "pump": "^3.0.0"
- },
"engines": {
"node": ">=6"
}
},
- "node_modules/get-symbol-description": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
- "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
+ "node_modules/diff-sequences": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
+ "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
"dev": true,
- "dependencies": {
- "call-bind": "^1.0.5",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4"
- },
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
"dev": true,
"dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
+ "path-type": "^4.0.0"
},
"engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": ">=8"
}
},
- "node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
"dev": true,
"dependencies": {
- "is-glob": "^4.0.3"
+ "esutils": "^2.0.2"
},
"engines": {
- "node": ">=10.13.0"
+ "node": ">=6.0.0"
}
},
- "node_modules/glob/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/dom-accessibility-api": {
+ "version": "0.5.16",
+ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz",
+ "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==",
"dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
+ "peer": true
},
- "node_modules/glob/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/domexception": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
+ "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
+ "deprecated": "Use your platform's native DOMException instead",
"dev": true,
+ "optional": true,
+ "peer": true,
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "webidl-conversions": "^7.0.0"
},
"engines": {
- "node": "*"
+ "node": ">=12"
}
},
- "node_modules/globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "engines": {
- "node": ">=4"
+ "node_modules/dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "dev": true,
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
}
},
- "node_modules/globalthis": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
- "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
- "dev": true,
+ "node_modules/downshift": {
+ "version": "9.0.7",
+ "resolved": "https://registry.npmjs.org/downshift/-/downshift-9.0.7.tgz",
+ "integrity": "sha512-B6JY4sJGEl9xBEJEvC/C+QYYYtPWN5RL+TlROJQfue9+ZFgrD/p1ZgGw73I0WSTNH9/h5q3LIKQA4FLd/N10vg==",
"dependencies": {
- "define-properties": "^1.1.3"
- },
- "engines": {
- "node": ">= 0.4"
+ "@babel/runtime": "^7.24.5",
+ "compute-scroll-into-view": "^3.1.0",
+ "prop-types": "^15.8.1",
+ "react-is": "18.2.0",
+ "tslib": "^2.6.2"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "peerDependencies": {
+ "react": ">=16.12.0"
}
},
- "node_modules/globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.736",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz",
+ "integrity": "sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q=="
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
"dev": true,
"dependencies": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- },
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true,
"engines": {
- "node": ">=10"
+ "node": ">=0.12"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/fb55/entities?sponsor=1"
}
},
- "node_modules/gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
"dependencies": {
- "get-intrinsic": "^1.1.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "is-arrayish": "^0.2.1"
}
},
- "node_modules/graceful-fs": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
- "dev": true,
- "optional": true,
- "peer": true
- },
- "node_modules/graphemer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
- "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
- "dev": true
- },
- "node_modules/has-bigints": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
- "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "node_modules/es-abstract": {
+ "version": "1.23.3",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
+ "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==",
"dev": true,
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "arraybuffer.prototype.slice": "^1.0.3",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
+ "data-view-buffer": "^1.0.1",
+ "data-view-byte-length": "^1.0.1",
+ "data-view-byte-offset": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-set-tostringtag": "^2.0.3",
+ "es-to-primitive": "^1.2.1",
+ "function.prototype.name": "^1.1.6",
+ "get-intrinsic": "^1.2.4",
+ "get-symbol-description": "^1.0.2",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.0.3",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.0.7",
+ "is-array-buffer": "^3.0.4",
+ "is-callable": "^1.2.7",
+ "is-data-view": "^1.0.1",
+ "is-negative-zero": "^2.0.3",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.3",
+ "is-string": "^1.0.7",
+ "is-typed-array": "^1.1.13",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.13.1",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.5",
+ "regexp.prototype.flags": "^1.5.2",
+ "safe-array-concat": "^1.1.2",
+ "safe-regex-test": "^1.0.3",
+ "string.prototype.trim": "^1.2.9",
+ "string.prototype.trimend": "^1.0.8",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.2",
+ "typed-array-byte-length": "^1.0.1",
+ "typed-array-byte-offset": "^1.0.2",
+ "typed-array-length": "^1.0.6",
+ "unbox-primitive": "^1.0.2",
+ "which-typed-array": "^1.1.15"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/has-property-descriptors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
- "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "node_modules/es-define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
+ "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
"dependencies": {
- "es-define-property": "^1.0.0"
+ "get-intrinsic": "^1.2.4"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">= 0.4"
}
},
- "node_modules/has-proto": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
- "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"engines": {
"node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "node_modules/es-iterator-helpers": {
+ "version": "1.0.19",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz",
+ "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
+ "es-set-tostringtag": "^2.0.3",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "globalthis": "^1.0.3",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.0.3",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.7",
+ "iterator.prototype": "^1.1.2",
+ "safe-array-concat": "^1.1.2"
+ },
"engines": {
"node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/has-tostringtag": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
- "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "node_modules/es-object-atoms": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
+ "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
"dev": true,
"dependencies": {
- "has-symbols": "^1.0.3"
+ "es-errors": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "node_modules/es-set-tostringtag": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
+ "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
+ "dev": true,
"dependencies": {
- "function-bind": "^1.1.2"
+ "get-intrinsic": "^1.2.4",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.1"
},
"engines": {
"node": ">= 0.4"
}
},
- "node_modules/history": {
- "version": "4.10.1",
- "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz",
- "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==",
+ "node_modules/es-shim-unscopables": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
+ "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
+ "dev": true,
"dependencies": {
- "@babel/runtime": "^7.1.2",
- "loose-envify": "^1.2.0",
- "resolve-pathname": "^3.0.0",
- "tiny-invariant": "^1.0.2",
- "tiny-warning": "^1.0.0",
- "value-equal": "^1.0.1"
+ "hasown": "^2.0.0"
}
},
- "node_modules/hoist-non-react-statics": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
- "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
"dependencies": {
- "react-is": "^16.7.0"
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/hoist-non-react-statics/node_modules/react-is": {
- "version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
- },
- "node_modules/hosted-git-info": {
- "version": "2.8.9",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
- "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
- "dev": true
- },
- "node_modules/html-encoding-sniffer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
- "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
+ "node_modules/esbuild": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
"dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "whatwg-encoding": "^2.0.0"
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
},
"engines": {
"node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.21.5",
+ "@esbuild/android-arm": "0.21.5",
+ "@esbuild/android-arm64": "0.21.5",
+ "@esbuild/android-x64": "0.21.5",
+ "@esbuild/darwin-arm64": "0.21.5",
+ "@esbuild/darwin-x64": "0.21.5",
+ "@esbuild/freebsd-arm64": "0.21.5",
+ "@esbuild/freebsd-x64": "0.21.5",
+ "@esbuild/linux-arm": "0.21.5",
+ "@esbuild/linux-arm64": "0.21.5",
+ "@esbuild/linux-ia32": "0.21.5",
+ "@esbuild/linux-loong64": "0.21.5",
+ "@esbuild/linux-mips64el": "0.21.5",
+ "@esbuild/linux-ppc64": "0.21.5",
+ "@esbuild/linux-riscv64": "0.21.5",
+ "@esbuild/linux-s390x": "0.21.5",
+ "@esbuild/linux-x64": "0.21.5",
+ "@esbuild/netbsd-x64": "0.21.5",
+ "@esbuild/openbsd-x64": "0.21.5",
+ "@esbuild/sunos-x64": "0.21.5",
+ "@esbuild/win32-arm64": "0.21.5",
+ "@esbuild/win32-ia32": "0.21.5",
+ "@esbuild/win32-x64": "0.21.5"
}
},
- "node_modules/html-escaper": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
- "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
- "dev": true
+ "node_modules/escalade": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
+ "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
+ "engines": {
+ "node": ">=6"
+ }
},
- "node_modules/http-proxy-agent": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
- "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@tootallnate/once": "2",
- "agent-base": "6",
- "debug": "4"
- },
"engines": {
- "node": ">= 6"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/https-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "node_modules/escodegen": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
+ "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
"dev": true,
"optional": true,
"peer": true,
"dependencies": {
- "agent-base": "6",
- "debug": "4"
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
},
"engines": {
- "node": ">= 6"
+ "node": ">=6.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
}
},
- "node_modules/human-signals": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz",
- "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==",
+ "node_modules/eslint": {
+ "version": "8.57.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+ "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
"dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.57.0",
+ "@humanwhocodes/config-array": "^0.11.14",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
"engines": {
- "node": ">=14.18.0"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/husky": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/husky/-/husky-2.7.0.tgz",
- "integrity": "sha512-LIi8zzT6PyFpcYKdvWRCn/8X+6SuG2TgYYMrM6ckEYhlp44UcEduVymZGIZNLiwOUjrEud+78w/AsAiqJA/kRg==",
+ "node_modules/eslint-config-prettier": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz",
+ "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==",
"dev": true,
- "hasInstallScript": true,
- "dependencies": {
- "cosmiconfig": "^5.2.0",
- "execa": "^1.0.0",
- "find-up": "^3.0.0",
- "get-stdin": "^7.0.0",
- "is-ci": "^2.0.0",
- "pkg-dir": "^4.1.0",
- "please-upgrade-node": "^3.1.1",
- "read-pkg": "^5.1.1",
- "run-node": "^1.0.0",
- "slash": "^3.0.0"
- },
"bin": {
- "husky-upgrade": "lib/upgrader/bin.js"
+ "eslint-config-prettier": "bin/cli.js"
},
- "engines": {
- "node": ">=8"
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
}
},
- "node_modules/husky/node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "node_modules/eslint-plugin-header": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz",
+ "integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==",
"dev": true,
- "dependencies": {
- "sprintf-js": "~1.0.2"
+ "peerDependencies": {
+ "eslint": ">=7.7.0"
}
},
- "node_modules/husky/node_modules/cosmiconfig": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
- "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
+ "node_modules/eslint-plugin-react": {
+ "version": "7.35.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz",
+ "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==",
"dev": true,
"dependencies": {
- "import-fresh": "^2.0.0",
- "is-directory": "^0.3.1",
- "js-yaml": "^3.13.1",
- "parse-json": "^4.0.0"
+ "array-includes": "^3.1.8",
+ "array.prototype.findlast": "^1.2.5",
+ "array.prototype.flatmap": "^1.3.2",
+ "array.prototype.tosorted": "^1.1.4",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.0.19",
+ "estraverse": "^5.3.0",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.8",
+ "object.fromentries": "^2.0.8",
+ "object.values": "^1.2.0",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.5",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.11",
+ "string.prototype.repeat": "^1.0.0"
},
"engines": {
"node": ">=4"
- }
- },
- "node_modules/husky/node_modules/find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "dev": true,
- "dependencies": {
- "locate-path": "^3.0.0"
},
- "engines": {
- "node": ">=6"
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
}
},
- "node_modules/husky/node_modules/import-fresh": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
- "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==",
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz",
+ "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==",
"dev": true,
- "dependencies": {
- "caller-path": "^2.0.0",
- "resolve-from": "^3.0.0"
- },
"engines": {
- "node": ">=4"
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
}
},
- "node_modules/husky/node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "node_modules/eslint-plugin-react-refresh": {
+ "version": "0.4.9",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.9.tgz",
+ "integrity": "sha512-QK49YrBAo5CLNLseZ7sZgvgTy21E6NEw22eZqc4teZfH8pxV3yXc9XXOYfUI6JNpw7mfHNkAeWtBxrTyykB6HA==",
"dev": true,
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
+ "peerDependencies": {
+ "eslint": ">=7"
}
},
- "node_modules/husky/node_modules/locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "node_modules/eslint-plugin-react/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"dependencies": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
- "node_modules/husky/node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "node_modules/eslint-plugin-react/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
"dev": true,
"dependencies": {
- "p-try": "^2.0.0"
+ "esutils": "^2.0.2"
},
"engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=0.10.0"
}
},
- "node_modules/husky/node_modules/p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "node_modules/eslint-plugin-react/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"dependencies": {
- "p-limit": "^2.0.0"
+ "brace-expansion": "^1.1.7"
},
"engines": {
- "node": ">=6"
+ "node": "*"
}
},
- "node_modules/husky/node_modules/parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
+ "node_modules/eslint-plugin-react/node_modules/resolve": {
+ "version": "2.0.0-next.5",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
"dev": true,
"dependencies": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
},
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/husky/node_modules/path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
- "dev": true,
- "engines": {
- "node": ">=4"
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/husky/node_modules/resolve-from": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
- "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==",
+ "node_modules/eslint-plugin-react/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/i18next": {
- "version": "23.12.2",
- "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.12.2.tgz",
- "integrity": "sha512-XIeh5V+bi8SJSWGL3jqbTEBW5oD6rbP5L+E7dVQh1MNTxxYef0x15rhJVcRb7oiuq4jLtgy2SD8eFlf6P2cmqg==",
- "funding": [
- {
- "type": "individual",
- "url": "https://locize.com"
- },
- {
- "type": "individual",
- "url": "https://locize.com/i18next.html"
- },
- {
- "type": "individual",
- "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
- }
- ],
- "dependencies": {
- "@babel/runtime": "^7.23.2"
- }
- },
- "node_modules/i18next-http-backend": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.2.tgz",
- "integrity": "sha512-+K8HbDfrvc1/2X8jpb7RLhI9ZxBDpx3xogYkQwGKlWAUXLSEGXzgdt3EcUjLlBCdMwdQY+K+EUF6oh8oB6rwHw==",
- "dependencies": {
- "cross-fetch": "4.0.0"
+ "bin": {
+ "semver": "bin/semver.js"
}
},
- "node_modules/ical.js": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/ical.js/-/ical.js-2.0.1.tgz",
- "integrity": "sha512-uYYb1CwTXbd9NP/xTtgQZ5ivv6bpUjQu9VM98s3X78L3XRu00uJW5ZtmnLwyxhztpf5fSiRyDpFW7ZNCePlaPw=="
+ "node_modules/eslint-plugin-vitest-globals": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vitest-globals/-/eslint-plugin-vitest-globals-1.5.0.tgz",
+ "integrity": "sha512-ZSsVOaOIig0oVLzRTyk8lUfBfqzWxr/J3/NFMfGGRIkGQPejJYmDH3gXmSJxAojts77uzAGB/UmVrwi2DC4LYA==",
+ "dev": true
},
- "node_modules/iconv-lite": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
- "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
},
"engines": {
- "node": ">=0.10.0"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/ignore": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
- "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
"dev": true,
"engines": {
- "node": ">= 4"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/immer": {
- "version": "10.0.4",
- "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.4.tgz",
- "integrity": "sha512-cuBuGK40P/sk5IzWa9QPUaAdvPHjkk1c+xYsd9oZw+YQQEV+10G0P5uMpGctZZKnyQ+ibRO08bD25nWLmYi2pw==",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/immer"
+ "node_modules/eslint/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
- "node_modules/import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
"dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
+ "type-fest": "^0.20.2"
},
"engines": {
- "node": ">=6"
+ "node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/import-local": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
- "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+ "node_modules/eslint/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "pkg-dir": "^4.2.0",
- "resolve-cwd": "^3.0.0"
+ "brace-expansion": "^1.1.7"
},
- "bin": {
- "import-local-fixture": "fixtures/cli.js"
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
},
"engines": {
- "node": ">=8"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
"engines": {
- "node": ">=0.8.19"
+ "node": ">=4"
}
},
- "node_modules/indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "node_modules/esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
"dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=0.10"
}
},
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
"dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
}
},
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- },
- "node_modules/internal-slot": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
- "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"dev": true,
- "dependencies": {
- "es-errors": "^1.3.0",
- "hasown": "^2.0.0",
- "side-channel": "^1.0.4"
- },
"engines": {
- "node": ">= 0.4"
+ "node": ">=4.0"
}
},
- "node_modules/internmap": {
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "dev": true
+ },
+ "node_modules/esutils": {
"version": "2.0.3",
- "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
- "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"engines": {
- "node": ">=12"
+ "node": ">=0.10.0"
}
},
- "node_modules/invariant": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
- "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "node_modules/eventemitter3": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
+ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
+ "dev": true
+ },
+ "node_modules/execa": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+ "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+ "dev": true,
"dependencies": {
- "loose-envify": "^1.0.0"
+ "cross-spawn": "^6.0.0",
+ "get-stream": "^4.0.0",
+ "is-stream": "^1.1.0",
+ "npm-run-path": "^2.0.0",
+ "p-finally": "^1.0.0",
+ "signal-exit": "^3.0.0",
+ "strip-eof": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/is-array-buffer": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
- "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
+ "node_modules/execa/node_modules/cross-spawn": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.2.1"
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=4.8"
}
},
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
+ "node_modules/execa/node_modules/path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
},
- "node_modules/is-async-function": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz",
- "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==",
+ "node_modules/execa/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/execa/node_modules/shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
"dev": true,
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "shebang-regex": "^1.0.0"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=0.10.0"
}
},
- "node_modules/is-bigint": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "node_modules/execa/node_modules/shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/execa/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
"dependencies": {
- "has-bigints": "^1.0.1"
+ "isexe": "^2.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "bin": {
+ "which": "bin/which"
}
},
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
"dev": true,
"dependencies": {
- "binary-extensions": "^2.0.0"
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
},
"engines": {
- "node": ">=8"
+ "node": ">=8.6.0"
}
},
- "node_modules/is-boolean-object": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
+ "is-glob": "^4.0.1"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">= 6"
}
},
- "node_modules/is-callable": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
- "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "node_modules/fast-xml-parser": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz",
+ "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ },
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/naturalintelligence"
+ }
+ ],
+ "dependencies": {
+ "strnum": "^1.0.5"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "bin": {
+ "fxparser": "src/cli/cli.js"
}
},
- "node_modules/is-ci": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
- "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+ "node_modules/fastq": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
+ "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
"dev": true,
"dependencies": {
- "ci-info": "^2.0.0"
- },
- "bin": {
- "is-ci": "bin.js"
+ "reusify": "^1.0.4"
}
},
- "node_modules/is-core-module": {
- "version": "2.13.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
- "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+ "node_modules/fflate": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz",
+ "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==",
+ "dev": true
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
"dependencies": {
- "hasown": "^2.0.0"
+ "flat-cache": "^3.0.4"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
}
},
- "node_modules/is-data-view": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
- "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dev": true,
"dependencies": {
- "is-typed-array": "^1.1.13"
+ "to-regex-range": "^5.0.1"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=8"
}
},
- "node_modules/is-date-object": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
- "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
"dev": true,
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-directory": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
- "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==",
+ "node_modules/flat-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
"dev": true,
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": "^10.12.0 || >=12.0.0"
}
},
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
+ "node_modules/flatted": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
+ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
+ "dev": true
},
- "node_modules/is-finalizationregistry": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz",
- "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==",
+ "node_modules/for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "is-callable": "^1.1.3"
}
},
- "node_modules/is-fullwidth-code-point": {
+ "node_modules/form-data": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
- "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"dev": true,
- "engines": {
- "node": ">=12"
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">= 6"
}
},
- "node_modules/is-generator-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
- "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+ "node_modules/fs-readdir-recursive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
+ "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==",
+ "dev": true
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"dev": true,
+ "hasInstallScript": true,
"optional": true,
- "peer": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=6"
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
- "node_modules/is-generator-function": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
- "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
- "dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-map": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
- "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "node_modules/function.prototype.name": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
+ "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
"dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "functions-have-names": "^1.2.3"
+ },
"engines": {
"node": ">= 0.4"
},
@@ -8751,34 +6778,42 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-negative-zero": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
- "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
"dev": true,
- "engines": {
- "node": ">= 0.4"
- },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
"engines": {
- "node": ">=0.12.0"
+ "node": ">=6.9.0"
}
},
- "node_modules/is-number-object": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
- "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "node_modules/get-func-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
+ "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
"dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
},
"engines": {
"node": ">= 0.4"
@@ -8787,44 +6822,37 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "node_modules/get-stdin": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz",
+ "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==",
"dev": true,
"engines": {
"node": ">=8"
}
},
- "node_modules/is-potential-custom-element-name": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
- "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
- "dev": true,
- "optional": true,
- "peer": true
- },
- "node_modules/is-regex": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "node_modules/get-stream": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
+ "pump": "^3.0.0"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=6"
}
},
- "node_modules/is-set": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
- "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "node_modules/get-symbol-description": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
+ "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
"dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4"
+ },
"engines": {
"node": ">= 0.4"
},
@@ -8832,67 +6860,75 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-shared-array-buffer": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
- "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.7"
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": "*"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": ">=10.13.0"
}
},
- "node_modules/is-string": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
- "node_modules/is-symbol": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"dependencies": {
- "has-symbols": "^1.0.2"
+ "brace-expansion": "^1.1.7"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": "*"
}
},
- "node_modules/is-typed-array": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
- "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
+ "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
"dev": true,
"dependencies": {
- "which-typed-array": "^1.1.14"
+ "define-properties": "^1.1.3"
},
"engines": {
"node": ">= 0.4"
@@ -8901,1162 +6937,970 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-weakmap": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
- "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
"dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
"engines": {
- "node": ">= 0.4"
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-weakref": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
- "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
- "dev": true,
+ "node_modules/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
"dependencies": {
- "call-bind": "^1.0.2"
+ "get-intrinsic": "^1.1.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-weakset": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz",
- "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==",
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true
+ },
+ "node_modules/has-bigints": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
"dev": true,
- "dependencies": {
- "call-bind": "^1.0.7",
- "get-intrinsic": "^1.2.4"
- },
- "engines": {
- "node": ">= 0.4"
- },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
- },
- "node_modules/istanbul-lib-coverage": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
- "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"engines": {
"node": ">=8"
}
},
- "node_modules/istanbul-lib-instrument": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz",
- "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==",
- "dev": true,
- "optional": true,
- "peer": true,
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
"dependencies": {
- "@babel/core": "^7.23.9",
- "@babel/parser": "^7.23.9",
- "@istanbuljs/schema": "^0.1.3",
- "istanbul-lib-coverage": "^3.2.0",
- "semver": "^7.5.4"
+ "es-define-property": "^1.0.0"
},
- "engines": {
- "node": ">=10"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/istanbul-lib-report": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
- "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
- "dev": true,
- "dependencies": {
- "istanbul-lib-coverage": "^3.0.0",
- "make-dir": "^4.0.0",
- "supports-color": "^7.1.0"
+ "node_modules/has-proto": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
+ "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+ "engines": {
+ "node": ">= 0.4"
},
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
"engines": {
- "node": ">=10"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/istanbul-lib-report/node_modules/make-dir": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
- "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"dev": true,
"dependencies": {
- "semver": "^7.5.3"
+ "has-symbols": "^1.0.3"
},
"engines": {
- "node": ">=10"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/istanbul-lib-source-maps": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
- "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
- "dev": true,
- "optional": true,
- "peer": true,
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dependencies": {
- "debug": "^4.1.1",
- "istanbul-lib-coverage": "^3.0.0",
- "source-map": "^0.6.1"
+ "function-bind": "^1.1.2"
},
"engines": {
- "node": ">=10"
+ "node": ">= 0.4"
}
},
- "node_modules/istanbul-reports": {
- "version": "3.1.7",
- "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz",
- "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==",
- "dev": true,
+ "node_modules/history": {
+ "version": "4.10.1",
+ "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz",
+ "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==",
"dependencies": {
- "html-escaper": "^2.0.0",
- "istanbul-lib-report": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
+ "@babel/runtime": "^7.1.2",
+ "loose-envify": "^1.2.0",
+ "resolve-pathname": "^3.0.0",
+ "tiny-invariant": "^1.0.2",
+ "tiny-warning": "^1.0.0",
+ "value-equal": "^1.0.1"
}
},
- "node_modules/iterator.prototype": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz",
- "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==",
- "dev": true,
+ "node_modules/hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
"dependencies": {
- "define-properties": "^1.2.1",
- "get-intrinsic": "^1.2.1",
- "has-symbols": "^1.0.3",
- "reflect.getprototypeof": "^1.0.4",
- "set-function-name": "^2.0.1"
+ "react-is": "^16.7.0"
}
},
- "node_modules/jest": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz",
- "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==",
+ "node_modules/hoist-non-react-statics/node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "node_modules/hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true
+ },
+ "node_modules/html-encoding-sniffer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
+ "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
"dev": true,
"optional": true,
"peer": true,
"dependencies": {
- "@jest/core": "^29.7.0",
- "@jest/types": "^29.6.3",
- "import-local": "^3.0.2",
- "jest-cli": "^29.7.0"
- },
- "bin": {
- "jest": "bin/jest.js"
+ "whatwg-encoding": "^2.0.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
+ "node": ">=12"
}
},
- "node_modules/jest-changed-files": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz",
- "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==",
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+ "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
"dev": true,
"optional": true,
"peer": true,
"dependencies": {
- "execa": "^5.0.0",
- "jest-util": "^29.7.0",
- "p-limit": "^3.1.0"
+ "@tootallnate/once": "2",
+ "agent-base": "6",
+ "debug": "4"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 6"
}
},
- "node_modules/jest-changed-files/node_modules/execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
"dev": true,
"optional": true,
"peer": true,
"dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
+ "agent-base": "6",
+ "debug": "4"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ "node": ">= 6"
}
},
- "node_modules/jest-changed-files/node_modules/get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "node_modules/human-signals": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz",
+ "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==",
"dev": true,
- "optional": true,
- "peer": true,
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=14.18.0"
}
},
- "node_modules/jest-changed-files/node_modules/human-signals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "node_modules/husky": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-2.7.0.tgz",
+ "integrity": "sha512-LIi8zzT6PyFpcYKdvWRCn/8X+6SuG2TgYYMrM6ckEYhlp44UcEduVymZGIZNLiwOUjrEud+78w/AsAiqJA/kRg==",
"dev": true,
- "optional": true,
- "peer": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "cosmiconfig": "^5.2.0",
+ "execa": "^1.0.0",
+ "find-up": "^3.0.0",
+ "get-stdin": "^7.0.0",
+ "is-ci": "^2.0.0",
+ "pkg-dir": "^4.1.0",
+ "please-upgrade-node": "^3.1.1",
+ "read-pkg": "^5.1.1",
+ "run-node": "^1.0.0",
+ "slash": "^3.0.0"
+ },
+ "bin": {
+ "husky-upgrade": "lib/upgrader/bin.js"
+ },
"engines": {
- "node": ">=10.17.0"
+ "node": ">=8"
}
},
- "node_modules/jest-changed-files/node_modules/is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "node_modules/husky/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=8"
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/husky/node_modules/cosmiconfig": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
+ "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
+ "dev": true,
+ "dependencies": {
+ "import-fresh": "^2.0.0",
+ "is-directory": "^0.3.1",
+ "js-yaml": "^3.13.1",
+ "parse-json": "^4.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">=4"
}
},
- "node_modules/jest-changed-files/node_modules/npm-run-path": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "node_modules/husky/node_modules/find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "path-key": "^3.0.0"
+ "locate-path": "^3.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=6"
}
},
- "node_modules/jest-changed-files/node_modules/strip-final-newline": {
+ "node_modules/husky/node_modules/import-fresh": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
- "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
+ "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==",
"dev": true,
- "optional": true,
- "peer": true,
+ "dependencies": {
+ "caller-path": "^2.0.0",
+ "resolve-from": "^3.0.0"
+ },
"engines": {
- "node": ">=6"
+ "node": ">=4"
}
},
- "node_modules/jest-circus": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz",
- "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==",
+ "node_modules/husky/node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/husky/node_modules/locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/expect": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "co": "^4.6.0",
- "dedent": "^1.0.0",
- "is-generator-fn": "^2.0.0",
- "jest-each": "^29.7.0",
- "jest-matcher-utils": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-runtime": "^29.7.0",
- "jest-snapshot": "^29.7.0",
- "jest-util": "^29.7.0",
- "p-limit": "^3.1.0",
- "pretty-format": "^29.7.0",
- "pure-rand": "^6.0.0",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=6"
}
},
- "node_modules/jest-circus/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "node_modules/husky/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
- "optional": true,
- "peer": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
"engines": {
- "node": ">=10"
+ "node": ">=6"
},
"funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/jest-circus/node_modules/pretty-format": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
- "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "node_modules/husky/node_modules/p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "@jest/schemas": "^29.6.3",
- "ansi-styles": "^5.0.0",
- "react-is": "^18.0.0"
+ "p-limit": "^2.0.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=6"
}
},
- "node_modules/jest-cli": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz",
- "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==",
+ "node_modules/husky/node_modules/parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "@jest/core": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/types": "^29.6.3",
- "chalk": "^4.0.0",
- "create-jest": "^29.7.0",
- "exit": "^0.1.2",
- "import-local": "^3.0.2",
- "jest-config": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-validate": "^29.7.0",
- "yargs": "^17.3.1"
- },
- "bin": {
- "jest": "bin/jest.js"
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
+ "node": ">=4"
}
},
- "node_modules/jest-config": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz",
- "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==",
+ "node_modules/husky/node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
"dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@babel/core": "^7.11.6",
- "@jest/test-sequencer": "^29.7.0",
- "@jest/types": "^29.6.3",
- "babel-jest": "^29.7.0",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "deepmerge": "^4.2.2",
- "glob": "^7.1.3",
- "graceful-fs": "^4.2.9",
- "jest-circus": "^29.7.0",
- "jest-environment-node": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "jest-regex-util": "^29.6.3",
- "jest-resolve": "^29.7.0",
- "jest-runner": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-validate": "^29.7.0",
- "micromatch": "^4.0.4",
- "parse-json": "^5.2.0",
- "pretty-format": "^29.7.0",
- "slash": "^3.0.0",
- "strip-json-comments": "^3.1.1"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "@types/node": "*",
- "ts-node": ">=9.0.0"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- },
- "ts-node": {
- "optional": true
- }
+ "node": ">=4"
}
},
- "node_modules/jest-config/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "node_modules/husky/node_modules/resolve-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+ "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==",
"dev": true,
- "optional": true,
- "peer": true,
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "node": ">=4"
}
},
- "node_modules/jest-config/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "dev": true,
+ "node_modules/i18next": {
+ "version": "23.12.2",
+ "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.12.2.tgz",
+ "integrity": "sha512-XIeh5V+bi8SJSWGL3jqbTEBW5oD6rbP5L+E7dVQh1MNTxxYef0x15rhJVcRb7oiuq4jLtgy2SD8eFlf6P2cmqg==",
"funding": [
{
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
+ "type": "individual",
+ "url": "https://locize.com"
+ },
+ {
+ "type": "individual",
+ "url": "https://locize.com/i18next.html"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
}
],
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=8"
+ "dependencies": {
+ "@babel/runtime": "^7.23.2"
}
},
- "node_modules/jest-config/node_modules/pretty-format": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
- "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "node_modules/i18next-http-backend": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.2.tgz",
+ "integrity": "sha512-+K8HbDfrvc1/2X8jpb7RLhI9ZxBDpx3xogYkQwGKlWAUXLSEGXzgdt3EcUjLlBCdMwdQY+K+EUF6oh8oB6rwHw==",
+ "dependencies": {
+ "cross-fetch": "4.0.0"
+ }
+ },
+ "node_modules/ical.js": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ical.js/-/ical.js-2.0.1.tgz",
+ "integrity": "sha512-uYYb1CwTXbd9NP/xTtgQZ5ivv6bpUjQu9VM98s3X78L3XRu00uJW5ZtmnLwyxhztpf5fSiRyDpFW7ZNCePlaPw=="
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"dev": true,
"optional": true,
"peer": true,
"dependencies": {
- "@jest/schemas": "^29.6.3",
- "ansi-styles": "^5.0.0",
- "react-is": "^18.0.0"
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=0.10.0"
}
},
- "node_modules/jest-diff": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
- "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==",
+ "node_modules/ignore": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
+ "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
"dev": true,
- "optional": true,
- "peer": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/immer": {
+ "version": "10.0.4",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.4.tgz",
+ "integrity": "sha512-cuBuGK40P/sk5IzWa9QPUaAdvPHjkk1c+xYsd9oZw+YQQEV+10G0P5uMpGctZZKnyQ+ibRO08bD25nWLmYi2pw==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/immer"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
"dependencies": {
- "chalk": "^4.0.0",
- "diff-sequences": "^29.6.3",
- "jest-get-type": "^29.6.3",
- "pretty-format": "^29.7.0"
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/jest-diff/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
"dev": true,
- "optional": true,
- "peer": true,
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "node": ">=0.8.19"
}
},
- "node_modules/jest-diff/node_modules/pretty-format": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
- "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
"dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@jest/schemas": "^29.6.3",
- "ansi-styles": "^5.0.0",
- "react-is": "^18.0.0"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=8"
}
},
- "node_modules/jest-docblock": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz",
- "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==",
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/internal-slot": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
+ "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "detect-newline": "^3.0.0"
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.0",
+ "side-channel": "^1.0.4"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
}
},
- "node_modules/jest-each": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz",
- "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==",
+ "node_modules/internmap": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
+ "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dependencies": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
+ "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "@jest/types": "^29.6.3",
- "chalk": "^4.0.0",
- "jest-get-type": "^29.6.3",
- "jest-util": "^29.7.0",
- "pretty-format": "^29.7.0"
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.1"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jest-each/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
+ },
+ "node_modules/is-async-function": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz",
+ "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==",
"dev": true,
- "optional": true,
- "peer": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
"engines": {
- "node": ">=10"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jest-each/node_modules/pretty-format": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
- "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "node_modules/is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "@jest/schemas": "^29.6.3",
- "ansi-styles": "^5.0.0",
- "react-is": "^18.0.0"
+ "has-bigints": "^1.0.1"
},
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jest-environment-node": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz",
- "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==",
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/fake-timers": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "jest-mock": "^29.7.0",
- "jest-util": "^29.7.0"
+ "binary-extensions": "^2.0.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=8"
}
},
- "node_modules/jest-get-type": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
- "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
+ "node_modules/is-boolean-object": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
"dev": true,
- "optional": true,
- "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jest-haste-map": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz",
- "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==",
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
"dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@jest/types": "^29.6.3",
- "@types/graceful-fs": "^4.1.3",
- "@types/node": "*",
- "anymatch": "^3.0.3",
- "fb-watchman": "^2.0.0",
- "graceful-fs": "^4.2.9",
- "jest-regex-util": "^29.6.3",
- "jest-util": "^29.7.0",
- "jest-worker": "^29.7.0",
- "micromatch": "^4.0.4",
- "walker": "^1.0.8"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
},
- "optionalDependencies": {
- "fsevents": "^2.3.2"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jest-leak-detector": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz",
- "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==",
+ "node_modules/is-ci": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
+ "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "jest-get-type": "^29.6.3",
- "pretty-format": "^29.7.0"
+ "ci-info": "^2.0.0"
},
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "bin": {
+ "is-ci": "bin.js"
}
},
- "node_modules/jest-leak-detector/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=10"
+ "node_modules/is-core-module": {
+ "version": "2.13.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
+ "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+ "dependencies": {
+ "hasown": "^2.0.0"
},
"funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jest-leak-detector/node_modules/pretty-format": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
- "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "node_modules/is-data-view": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
+ "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "@jest/schemas": "^29.6.3",
- "ansi-styles": "^5.0.0",
- "react-is": "^18.0.0"
+ "is-typed-array": "^1.1.13"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jest-matcher-utils": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz",
- "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==",
+ "node_modules/is-date-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "chalk": "^4.0.0",
- "jest-diff": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "pretty-format": "^29.7.0"
+ "has-tostringtag": "^1.0.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jest-matcher-utils/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "node_modules/is-directory": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
+ "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==",
"dev": true,
- "optional": true,
- "peer": true,
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "node": ">=0.10.0"
}
},
- "node_modules/jest-matcher-utils/node_modules/pretty-format": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
- "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@jest/schemas": "^29.6.3",
- "ansi-styles": "^5.0.0",
- "react-is": "^18.0.0"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=0.10.0"
}
},
- "node_modules/jest-message-util": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
- "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==",
+ "node_modules/is-finalizationregistry": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz",
+ "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "@babel/code-frame": "^7.12.13",
- "@jest/types": "^29.6.3",
- "@types/stack-utils": "^2.0.0",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "micromatch": "^4.0.4",
- "pretty-format": "^29.7.0",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
+ "call-bind": "^1.0.2"
},
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jest-message-util/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "node_modules/is-fullwidth-code-point": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
+ "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
"dev": true,
- "optional": true,
- "peer": true,
"engines": {
- "node": ">=10"
+ "node": ">=12"
},
"funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/jest-message-util/node_modules/pretty-format": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
- "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "node_modules/is-generator-function": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
+ "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "@jest/schemas": "^29.6.3",
- "ansi-styles": "^5.0.0",
- "react-is": "^18.0.0"
+ "has-tostringtag": "^1.0.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jest-mock": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
- "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "jest-util": "^29.7.0"
+ "is-extglob": "^2.1.1"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=0.10.0"
}
},
- "node_modules/jest-pnp-resolver": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
- "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
"dev": true,
- "optional": true,
- "peer": true,
"engines": {
- "node": ">=6"
- },
- "peerDependencies": {
- "jest-resolve": "*"
+ "node": ">= 0.4"
},
- "peerDependenciesMeta": {
- "jest-resolve": {
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jest-regex-util": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz",
- "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==",
+ "node_modules/is-negative-zero": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
"dev": true,
- "optional": true,
- "peer": true,
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jest-resolve": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz",
- "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==",
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.7.0",
- "jest-pnp-resolver": "^1.2.2",
- "jest-util": "^29.7.0",
- "jest-validate": "^29.7.0",
- "resolve": "^1.20.0",
- "resolve.exports": "^2.0.0",
- "slash": "^3.0.0"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=0.12.0"
}
},
- "node_modules/jest-resolve-dependencies": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz",
- "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==",
+ "node_modules/is-number-object": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "jest-regex-util": "^29.6.3",
- "jest-snapshot": "^29.7.0"
+ "has-tostringtag": "^1.0.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jest-runner": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz",
- "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==",
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
"dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@jest/console": "^29.7.0",
- "@jest/environment": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "emittery": "^0.13.1",
- "graceful-fs": "^4.2.9",
- "jest-docblock": "^29.7.0",
- "jest-environment-node": "^29.7.0",
- "jest-haste-map": "^29.7.0",
- "jest-leak-detector": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-resolve": "^29.7.0",
- "jest-runtime": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-watcher": "^29.7.0",
- "jest-worker": "^29.7.0",
- "p-limit": "^3.1.0",
- "source-map-support": "0.5.13"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=8"
}
},
- "node_modules/jest-runner/node_modules/source-map-support": {
- "version": "0.5.13",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
- "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
+ "node_modules/is-potential-custom-element-name": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
"dev": true,
"optional": true,
- "peer": true,
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
+ "peer": true
},
- "node_modules/jest-runtime": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz",
- "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==",
+ "node_modules/is-regex": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/fake-timers": "^29.7.0",
- "@jest/globals": "^29.7.0",
- "@jest/source-map": "^29.6.3",
- "@jest/test-result": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "cjs-module-lexer": "^1.0.0",
- "collect-v8-coverage": "^1.0.0",
- "glob": "^7.1.3",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-mock": "^29.7.0",
- "jest-regex-util": "^29.6.3",
- "jest-resolve": "^29.7.0",
- "jest-snapshot": "^29.7.0",
- "jest-util": "^29.7.0",
- "slash": "^3.0.0",
- "strip-bom": "^4.0.0"
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-snapshot": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz",
- "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@babel/core": "^7.11.6",
- "@babel/generator": "^7.7.2",
- "@babel/plugin-syntax-jsx": "^7.7.2",
- "@babel/plugin-syntax-typescript": "^7.7.2",
- "@babel/types": "^7.3.3",
- "@jest/expect-utils": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
- "babel-preset-current-node-syntax": "^1.0.0",
- "chalk": "^4.0.0",
- "expect": "^29.7.0",
- "graceful-fs": "^4.2.9",
- "jest-diff": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "jest-matcher-utils": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0",
- "natural-compare": "^1.4.0",
- "pretty-format": "^29.7.0",
- "semver": "^7.5.3"
+ "node": ">= 0.4"
},
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jest-snapshot/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
"dev": true,
- "optional": true,
- "peer": true,
"engines": {
- "node": ">=10"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jest-snapshot/node_modules/pretty-format": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
- "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "@jest/schemas": "^29.6.3",
- "ansi-styles": "^5.0.0",
- "react-is": "^18.0.0"
+ "call-bind": "^1.0.7"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jest-styled-components": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/jest-styled-components/-/jest-styled-components-7.2.0.tgz",
- "integrity": "sha512-gwyyveNjvuRA0pyhbQoydXZllLZESs2VuL5fXCabzh0buHPAOUfANtW7n5YMPmdC0sH3VB7h2eUGZ23+tjvaBA==",
+ "node_modules/is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
"dev": true,
- "dependencies": {
- "@adobe/css-tools": "^4.0.1"
- },
"engines": {
- "node": ">= 12"
- },
- "peerDependencies": {
- "styled-components": ">= 5"
+ "node": ">=0.10.0"
}
},
- "node_modules/jest-util": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
- "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
+ "node_modules/is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
+ "has-tostringtag": "^1.0.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jest-util/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "node_modules/is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
"dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "optional": true,
- "peer": true,
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jest-validate": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz",
- "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==",
+ "node_modules/is-typed-array": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
+ "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "@jest/types": "^29.6.3",
- "camelcase": "^6.2.0",
- "chalk": "^4.0.0",
- "jest-get-type": "^29.6.3",
- "leven": "^3.1.0",
- "pretty-format": "^29.7.0"
+ "which-typed-array": "^1.1.14"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jest-validate/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
"dev": true,
- "optional": true,
- "peer": true,
"engines": {
- "node": ">=10"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jest-validate/node_modules/pretty-format": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
- "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "node_modules/is-weakref": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "@jest/schemas": "^29.6.3",
- "ansi-styles": "^5.0.0",
- "react-is": "^18.0.0"
+ "call-bind": "^1.0.2"
},
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jest-watcher": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz",
- "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==",
+ "node_modules/is-weakset": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz",
+ "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "@jest/test-result": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "ansi-escapes": "^4.2.1",
- "chalk": "^4.0.0",
- "emittery": "^0.13.1",
- "jest-util": "^29.7.0",
- "string-length": "^4.0.1"
+ "call-bind": "^1.0.7",
+ "get-intrinsic": "^1.2.4"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jest-watcher/node_modules/ansi-escapes": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
- "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "node_modules/isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
"dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "type-fest": "^0.21.3"
- },
"engines": {
"node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "dev": true,
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/jest-watcher/node_modules/type-fest": {
- "version": "0.21.3",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
- "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "node_modules/istanbul-lib-report/node_modules/make-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
"dev": true,
- "optional": true,
- "peer": true,
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
"engines": {
"node": ">=10"
},
@@ -10064,38 +7908,45 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/jest-worker": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
- "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
+ "node_modules/istanbul-reports": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz",
+ "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "@types/node": "*",
- "jest-util": "^29.7.0",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.0.0"
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=8"
}
},
- "node_modules/jest-worker/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "node_modules/iterator.prototype": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz",
+ "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "has-flag": "^4.0.0"
+ "define-properties": "^1.2.1",
+ "get-intrinsic": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "reflect.getprototypeof": "^1.0.4",
+ "set-function-name": "^2.0.1"
+ }
+ },
+ "node_modules/jest-styled-components": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/jest-styled-components/-/jest-styled-components-7.2.0.tgz",
+ "integrity": "sha512-gwyyveNjvuRA0pyhbQoydXZllLZESs2VuL5fXCabzh0buHPAOUfANtW7n5YMPmdC0sH3VB7h2eUGZ23+tjvaBA==",
+ "dev": true,
+ "dependencies": {
+ "@adobe/css-tools": "^4.0.1"
},
"engines": {
- "node": ">=10"
+ "node": ">= 12"
},
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
+ "peerDependencies": {
+ "styled-components": ">= 5"
}
},
"node_modules/js-tokens": {
@@ -10276,28 +8127,6 @@
"json-buffer": "3.0.1"
}
},
- "node_modules/kleur": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
- "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/leven": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
- "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@@ -10681,17 +8510,6 @@
"semver": "bin/semver"
}
},
- "node_modules/makeerror": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
- "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "tmpl": "1.0.5"
- }
- },
"node_modules/math-expression-evaluator": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.4.0.tgz",
@@ -10922,14 +8740,6 @@
"webidl-conversions": "^3.0.0"
}
},
- "node_modules/node-int64": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
- "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
- "dev": true,
- "optional": true,
- "peer": true
- },
"node_modules/node-releases": {
"version": "2.0.14",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
@@ -11318,17 +9128,6 @@
"node": ">=6"
}
},
- "node_modules/pirates": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
- "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/pkg-dir": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
@@ -11464,9 +9263,9 @@
}
},
"node_modules/prettier": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz",
- "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==",
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
+ "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
"dev": true,
"bin": {
"prettier": "bin/prettier.cjs"
@@ -11513,21 +9312,6 @@
"dev": true,
"peer": true
},
- "node_modules/prompts": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
- "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "kleur": "^3.0.3",
- "sisteransi": "^1.0.5"
- },
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
@@ -11570,24 +9354,6 @@
"node": ">=6"
}
},
- "node_modules/pure-rand": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
- "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/dubzzz"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/fast-check"
- }
- ],
- "optional": true,
- "peer": true
- },
"node_modules/qhistory": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/qhistory/-/qhistory-1.1.0.tgz",
@@ -12031,17 +9797,6 @@
"jsesc": "bin/jsesc"
}
},
- "node_modules/require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/requires-port": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
@@ -12071,31 +9826,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/resolve-cwd": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
- "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "resolve-from": "^5.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/resolve-cwd/node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
@@ -12109,17 +9839,6 @@
"resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz",
"integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng=="
},
- "node_modules/resolve.exports": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz",
- "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/restore-cursor": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz",
@@ -12451,14 +10170,6 @@
"node": ">= 10"
}
},
- "node_modules/sisteransi": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
- "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
- "dev": true,
- "optional": true,
- "peer": true
- },
"node_modules/slash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
@@ -12573,31 +10284,6 @@
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
"dev": true
},
- "node_modules/stack-utils": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
- "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "escape-string-regexp": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/stack-utils/node_modules/escape-string-regexp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
- "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/stackback": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
@@ -12619,21 +10305,6 @@
"node": ">=0.6.19"
}
},
- "node_modules/string-length": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
- "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "char-regex": "^1.0.2",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/string-width": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
@@ -12775,17 +10446,6 @@
"node": ">=8"
}
},
- "node_modules/strip-bom": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
- "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/strip-eof": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
@@ -12855,9 +10515,9 @@
"integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA=="
},
"node_modules/styled-components": {
- "version": "6.1.11",
- "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.11.tgz",
- "integrity": "sha512-Ui0jXPzbp1phYij90h12ksljKGqF8ncGx+pjrNPsSPhbUUjWT2tD1FwGo2LF6USCnbrsIhNngDfodhxbegfEOA==",
+ "version": "6.1.12",
+ "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.12.tgz",
+ "integrity": "sha512-n/O4PzRPhbYI0k1vKKayfti3C/IGcPf+DqcrOB7O/ab9x4u/zjqraneT5N45+sIe87cxrCApXM8Bna7NYxwoTA==",
"dependencies": {
"@emotion/is-prop-valid": "1.2.2",
"@emotion/unitless": "0.8.1",
@@ -13029,14 +10689,6 @@
"node": ">=14.0.0"
}
},
- "node_modules/tmpl": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
- "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
- "dev": true,
- "optional": true,
- "peer": true
- },
"node_modules/to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
@@ -13221,9 +10873,9 @@
}
},
"node_modules/typescript": {
- "version": "5.5.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz",
- "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==",
+ "version": "5.5.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz",
+ "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
@@ -13387,22 +11039,6 @@
"uuid": "dist/bin/uuid"
}
},
- "node_modules/v8-to-istanbul": {
- "version": "9.2.0",
- "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz",
- "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@jridgewell/trace-mapping": "^0.3.12",
- "@types/istanbul-lib-coverage": "^2.0.1",
- "convert-source-map": "^2.0.0"
- },
- "engines": {
- "node": ">=10.12.0"
- }
- },
"node_modules/validate-npm-package-license": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
@@ -13419,9 +11055,9 @@
"integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw=="
},
"node_modules/vite": {
- "version": "5.3.3",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.3.tgz",
- "integrity": "sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==",
+ "version": "5.3.5",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz",
+ "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==",
"dev": true,
"dependencies": {
"esbuild": "^0.21.3",
@@ -13806,17 +11442,6 @@
"node": ">=14"
}
},
- "node_modules/walker": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
- "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "makeerror": "1.0.12"
- }
- },
"node_modules/webidl-conversions": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
@@ -14051,21 +11676,6 @@
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true
},
- "node_modules/write-file-atomic": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
- "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "imurmurhash": "^0.1.4",
- "signal-exit": "^3.0.7"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
"node_modules/ws": {
"version": "8.17.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
@@ -14108,17 +11718,6 @@
"optional": true,
"peer": true
},
- "node_modules/y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
@@ -14133,72 +11732,6 @@
"node": ">= 14"
}
},
- "node_modules/yargs": {
- "version": "17.7.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
- "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "cliui": "^8.0.1",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.3",
- "y18n": "^5.0.5",
- "yargs-parser": "^21.1.1"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/yargs-parser": {
- "version": "21.1.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
- "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/yargs/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true,
- "optional": true,
- "peer": true
- },
- "node_modules/yargs/node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/yargs/node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
diff --git a/package.json b/package.json
index 568502cb0a..7120bcfa3f 100644
--- a/package.json
+++ b/package.json
@@ -32,7 +32,7 @@
"node": ">=18.0"
},
"dependencies": {
- "@reduxjs/toolkit": "^2.2.6",
+ "@reduxjs/toolkit": "^2.2.7",
"@sentry/react": "^8.22.0",
"@visx/axis": "^3.10.1",
"@visx/gradient": "^3.3.0",
@@ -47,7 +47,7 @@
"d3-interpolate": "^3.0.1",
"d3-scale": "^4.0.2",
"d3-shape": "^3.2.0",
- "downshift": "^9.0.6",
+ "downshift": "^9.0.7",
"fast-deep-equal": "^3.1.3",
"fast-xml-parser": "^4.4.1",
"history": "^4.10.1",
@@ -69,14 +69,14 @@
"react-router-dom": "^5.2.0",
"redux": "^5.0.1",
"redux-logger": "^3.0.6",
- "styled-components": "^6.1.11",
+ "styled-components": "^6.1.12",
"uuid": "^10.0.0",
"whatwg-fetch": "^3.6.20"
},
"devDependencies": {
- "@babel/cli": "^7.24.7",
+ "@babel/cli": "^7.24.8",
"@pandatix/js-cvss": "^0.4.4",
- "@testing-library/jest-dom": "^6.4.6",
+ "@testing-library/jest-dom": "^6.4.8",
"@testing-library/react": "^16.0.0",
"@testing-library/user-event": "^13.5.0",
"@types/react": "^18.3.3",
@@ -93,14 +93,14 @@
"eslint-plugin-header": "^3.1.1",
"eslint-plugin-react": "^7.35.0",
"eslint-plugin-react-hooks": "^4.6.2",
- "eslint-plugin-react-refresh": "^0.4.8",
+ "eslint-plugin-react-refresh": "^0.4.9",
"eslint-plugin-vitest-globals": "^1.5.0",
"husky": "^2.7.0",
"jest-styled-components": "^7.2.0",
"lint-staged": "^13.1.0",
- "prettier": "^3.3.2",
- "typescript": "^5.5.3",
- "vite": "^5.3.3",
+ "prettier": "^3.3.3",
+ "typescript": "^5.5.4",
+ "vite": "^5.3.5",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-eslint2": "^4.4.0",
"vite-plugin-svgr": "^4.2.0",
From c551962abab3daae0b76b8cddca436f2676cdfb4 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 6 Aug 2024 08:55:07 +0200
Subject: [PATCH 099/130] Deps: Bump @vitest/ui from 1.6.0 to 2.0.5 (#4116)
* Deps: Bump @vitest/ui from 1.6.0 to 2.0.5
Bumps [@vitest/ui](https://github.com/vitest-dev/vitest/tree/HEAD/packages/ui) from 1.6.0 to 2.0.5.
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v2.0.5/packages/ui)
---
updated-dependencies:
- dependency-name: "@vitest/ui"
dependency-type: direct:development
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
* update dep
---------
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: daniele-mng
---
package-lock.json | 1179 +++++++++++++++++++++------------------------
package.json | 7 +-
2 files changed, 563 insertions(+), 623 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index eef4e4dce9..53c2b80d29 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -62,8 +62,8 @@
"@typescript-eslint/parser": "^8.0.0",
"@vitejs/plugin-legacy": "^5.4.1",
"@vitejs/plugin-react": "^4.3.1",
- "@vitest/coverage-v8": "^1.6.0",
- "@vitest/ui": "^1.5.0",
+ "@vitest/coverage-v8": "^2.0.5",
+ "@vitest/ui": "^2.0.5",
"babel-plugin-i18next-extract": "^0.10.0",
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
@@ -74,6 +74,7 @@
"eslint-plugin-vitest-globals": "^1.5.0",
"husky": "^2.7.0",
"jest-styled-components": "^7.2.0",
+ "jsdom": "^24.1.1",
"lint-staged": "^13.1.0",
"prettier": "^3.3.3",
"typescript": "^5.5.4",
@@ -81,7 +82,7 @@
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-eslint2": "^4.4.0",
"vite-plugin-svgr": "^4.2.0",
- "vitest": "^1.5.0"
+ "vitest": "^2.0.5"
},
"engines": {
"node": ">=18.0"
@@ -2755,25 +2756,57 @@
"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
"dev": true
},
- "node_modules/@istanbuljs/schema": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
- "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
"dev": true,
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
- "node_modules/@jest/schemas": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
- "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
"dev": true,
"dependencies": {
- "@sinclair/typebox": "^0.27.8"
+ "ansi-regex": "^6.0.1"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
}
},
"node_modules/@jridgewell/gen-mapping": {
@@ -2878,6 +2911,16 @@
"integrity": "sha512-hhBbQ7IKfoRoV3QKTP9hLKJT166/e0FkeiVSLZZIEVsO7DjxVmIWhJlPvbp+RXaM4w215xghtnXQv13Ebdlj/w==",
"dev": true
},
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/@polka/url": {
"version": "1.0.0-next.25",
"resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz",
@@ -3244,12 +3287,6 @@
"node": ">=14.18"
}
},
- "node_modules/@sinclair/typebox": {
- "version": "0.27.8",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
- "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
- "dev": true
- },
"node_modules/@svgr/babel-plugin-add-jsx-attribute": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz",
@@ -3566,17 +3603,6 @@
"@testing-library/dom": ">=7.21.4"
}
},
- "node_modules/@tootallnate/once": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
- "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">= 10"
- }
- },
"node_modules/@types/aria-query": {
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
@@ -4186,201 +4212,150 @@
}
},
"node_modules/@vitest/coverage-v8": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.6.0.tgz",
- "integrity": "sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.0.5.tgz",
+ "integrity": "sha512-qeFcySCg5FLO2bHHSa0tAZAOnAUbp4L6/A5JDuj9+bt53JREl8hpLjLHEWF0e/gWc8INVpJaqA7+Ene2rclpZg==",
"dev": true,
"dependencies": {
- "@ampproject/remapping": "^2.2.1",
+ "@ampproject/remapping": "^2.3.0",
"@bcoe/v8-coverage": "^0.2.3",
- "debug": "^4.3.4",
+ "debug": "^4.3.5",
"istanbul-lib-coverage": "^3.2.2",
"istanbul-lib-report": "^3.0.1",
- "istanbul-lib-source-maps": "^5.0.4",
- "istanbul-reports": "^3.1.6",
- "magic-string": "^0.30.5",
- "magicast": "^0.3.3",
- "picocolors": "^1.0.0",
- "std-env": "^3.5.0",
- "strip-literal": "^2.0.0",
- "test-exclude": "^6.0.0"
+ "istanbul-lib-source-maps": "^5.0.6",
+ "istanbul-reports": "^3.1.7",
+ "magic-string": "^0.30.10",
+ "magicast": "^0.3.4",
+ "std-env": "^3.7.0",
+ "test-exclude": "^7.0.1",
+ "tinyrainbow": "^1.2.0"
},
"funding": {
"url": "https://opencollective.com/vitest"
},
"peerDependencies": {
- "vitest": "1.6.0"
+ "vitest": "2.0.5"
}
},
- "node_modules/@vitest/coverage-v8/node_modules/istanbul-lib-source-maps": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.4.tgz",
- "integrity": "sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==",
+ "node_modules/@vitest/coverage-v8/node_modules/debug": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
+ "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
"dev": true,
"dependencies": {
- "@jridgewell/trace-mapping": "^0.3.23",
- "debug": "^4.1.1",
- "istanbul-lib-coverage": "^3.0.0"
+ "ms": "2.1.2"
},
"engines": {
- "node": ">=10"
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
}
},
"node_modules/@vitest/expect": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz",
- "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz",
+ "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==",
"dev": true,
"dependencies": {
- "@vitest/spy": "1.6.0",
- "@vitest/utils": "1.6.0",
- "chai": "^4.3.10"
+ "@vitest/spy": "2.0.5",
+ "@vitest/utils": "2.0.5",
+ "chai": "^5.1.1",
+ "tinyrainbow": "^1.2.0"
},
"funding": {
"url": "https://opencollective.com/vitest"
}
},
- "node_modules/@vitest/runner": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz",
- "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==",
+ "node_modules/@vitest/pretty-format": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz",
+ "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==",
"dev": true,
"dependencies": {
- "@vitest/utils": "1.6.0",
- "p-limit": "^5.0.0",
- "pathe": "^1.1.1"
+ "tinyrainbow": "^1.2.0"
},
"funding": {
"url": "https://opencollective.com/vitest"
}
},
- "node_modules/@vitest/runner/node_modules/p-limit": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz",
- "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==",
+ "node_modules/@vitest/runner": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.5.tgz",
+ "integrity": "sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==",
"dev": true,
"dependencies": {
- "yocto-queue": "^1.0.0"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@vitest/runner/node_modules/yocto-queue": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz",
- "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==",
- "dev": true,
- "engines": {
- "node": ">=12.20"
+ "@vitest/utils": "2.0.5",
+ "pathe": "^1.1.2"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://opencollective.com/vitest"
}
},
"node_modules/@vitest/snapshot": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz",
- "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.5.tgz",
+ "integrity": "sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==",
"dev": true,
"dependencies": {
- "magic-string": "^0.30.5",
- "pathe": "^1.1.1",
- "pretty-format": "^29.7.0"
+ "@vitest/pretty-format": "2.0.5",
+ "magic-string": "^0.30.10",
+ "pathe": "^1.1.2"
},
"funding": {
"url": "https://opencollective.com/vitest"
}
},
- "node_modules/@vitest/snapshot/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/@vitest/snapshot/node_modules/pretty-format": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
- "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
- "dev": true,
- "dependencies": {
- "@jest/schemas": "^29.6.3",
- "ansi-styles": "^5.0.0",
- "react-is": "^18.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
"node_modules/@vitest/spy": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz",
- "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz",
+ "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==",
"dev": true,
"dependencies": {
- "tinyspy": "^2.2.0"
+ "tinyspy": "^3.0.0"
},
"funding": {
"url": "https://opencollective.com/vitest"
}
},
"node_modules/@vitest/ui": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-1.6.0.tgz",
- "integrity": "sha512-k3Lyo+ONLOgylctiGovRKy7V4+dIN2yxstX3eY5cWFXH6WP+ooVX79YSyi0GagdTQzLmT43BF27T0s6dOIPBXA==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.0.5.tgz",
+ "integrity": "sha512-m+ZpVt/PVi/nbeRKEjdiYeoh0aOfI9zr3Ria9LO7V2PlMETtAXJS3uETEZkc8Be2oOl8mhd7Ew+5SRBXRYncNw==",
"dev": true,
"dependencies": {
- "@vitest/utils": "1.6.0",
+ "@vitest/utils": "2.0.5",
"fast-glob": "^3.3.2",
- "fflate": "^0.8.1",
- "flatted": "^3.2.9",
- "pathe": "^1.1.1",
- "picocolors": "^1.0.0",
- "sirv": "^2.0.4"
+ "fflate": "^0.8.2",
+ "flatted": "^3.3.1",
+ "pathe": "^1.1.2",
+ "sirv": "^2.0.4",
+ "tinyrainbow": "^1.2.0"
},
"funding": {
"url": "https://opencollective.com/vitest"
},
"peerDependencies": {
- "vitest": "1.6.0"
+ "vitest": "2.0.5"
}
},
"node_modules/@vitest/utils": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz",
- "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz",
+ "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==",
"dev": true,
"dependencies": {
- "diff-sequences": "^29.6.3",
+ "@vitest/pretty-format": "2.0.5",
"estree-walker": "^3.0.3",
- "loupe": "^2.3.7",
- "pretty-format": "^29.7.0"
+ "loupe": "^3.1.1",
+ "tinyrainbow": "^1.2.0"
},
"funding": {
"url": "https://opencollective.com/vitest"
}
},
- "node_modules/@vitest/utils/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
"node_modules/@vitest/utils/node_modules/estree-walker": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
@@ -4390,29 +4365,6 @@
"@types/estree": "^1.0.0"
}
},
- "node_modules/@vitest/utils/node_modules/pretty-format": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
- "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
- "dev": true,
- "dependencies": {
- "@jest/schemas": "^29.6.3",
- "ansi-styles": "^5.0.0",
- "react-is": "^18.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/abab": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
- "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
- "deprecated": "Use your platform's native atob() and btoa() methods instead",
- "dev": true,
- "optional": true,
- "peer": true
- },
"node_modules/acorn": {
"version": "8.11.3",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
@@ -4425,18 +4377,6 @@
"node": ">=0.4.0"
}
},
- "node_modules/acorn-globals": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz",
- "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "acorn": "^8.1.0",
- "acorn-walk": "^8.0.2"
- }
- },
"node_modules/acorn-jsx": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
@@ -4446,27 +4386,16 @@
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
- "node_modules/acorn-walk": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz",
- "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==",
- "dev": true,
- "engines": {
- "node": ">=0.4.0"
- }
- },
"node_modules/agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
+ "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "debug": "4"
+ "debug": "^4.3.4"
},
"engines": {
- "node": ">= 6.0.0"
+ "node": ">= 14"
}
},
"node_modules/ajv": {
@@ -4704,21 +4633,19 @@
}
},
"node_modules/assertion-error": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
- "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
+ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
"dev": true,
"engines": {
- "node": "*"
+ "node": ">=12"
}
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
- "dev": true,
- "optional": true,
- "peer": true
+ "dev": true
},
"node_modules/available-typed-arrays": {
"version": "1.0.7",
@@ -5076,21 +5003,19 @@
]
},
"node_modules/chai": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz",
- "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==",
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz",
+ "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==",
"dev": true,
"dependencies": {
- "assertion-error": "^1.1.0",
- "check-error": "^1.0.3",
- "deep-eql": "^4.1.3",
- "get-func-name": "^2.0.2",
- "loupe": "^2.3.6",
- "pathval": "^1.1.1",
- "type-detect": "^4.0.8"
+ "assertion-error": "^2.0.1",
+ "check-error": "^2.1.1",
+ "deep-eql": "^5.0.1",
+ "loupe": "^3.1.0",
+ "pathval": "^2.0.0"
},
"engines": {
- "node": ">=4"
+ "node": ">=12"
}
},
"node_modules/chalk": {
@@ -5110,15 +5035,12 @@
}
},
"node_modules/check-error": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
- "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz",
+ "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==",
"dev": true,
- "dependencies": {
- "get-func-name": "^2.0.2"
- },
"engines": {
- "node": "*"
+ "node": ">= 16"
}
},
"node_modules/chokidar": {
@@ -5236,8 +5158,6 @@
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
"delayed-stream": "~1.0.0"
},
@@ -5370,35 +5290,23 @@
"integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==",
"dev": true
},
- "node_modules/cssom": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
- "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==",
- "dev": true,
- "optional": true,
- "peer": true
- },
"node_modules/cssstyle": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
- "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz",
+ "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "cssom": "~0.3.6"
+ "rrweb-cssom": "^0.6.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=18"
}
},
- "node_modules/cssstyle/node_modules/cssom": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
- "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
- "dev": true,
- "optional": true,
- "peer": true
+ "node_modules/cssstyle/node_modules/rrweb-cssom": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz",
+ "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==",
+ "dev": true
},
"node_modules/csstype": {
"version": "3.1.3",
@@ -5577,19 +5485,16 @@
}
},
"node_modules/data-urls": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz",
- "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz",
+ "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "abab": "^2.0.6",
- "whatwg-mimetype": "^3.0.0",
- "whatwg-url": "^11.0.0"
+ "whatwg-mimetype": "^4.0.0",
+ "whatwg-url": "^14.0.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/data-view-buffer": {
@@ -5672,9 +5577,7 @@
"version": "10.4.3",
"resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
"integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
- "dev": true,
- "optional": true,
- "peer": true
+ "dev": true
},
"node_modules/deep-diff": {
"version": "0.3.8",
@@ -5682,13 +5585,10 @@
"integrity": "sha512-yVn6RZmHiGnxRKR9sJb3iVV2XTF1Ghh2DiWRZ3dMnGc43yUdWWF/kX6lQyk3+P84iprfWKU/8zFTrlkvtFm1ug=="
},
"node_modules/deep-eql": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
- "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
+ "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
"dev": true,
- "dependencies": {
- "type-detect": "^4.0.0"
- },
"engines": {
"node": ">=6"
}
@@ -5754,8 +5654,6 @@
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"dev": true,
- "optional": true,
- "peer": true,
"engines": {
"node": ">=0.4.0"
}
@@ -5769,15 +5667,6 @@
"node": ">=6"
}
},
- "node_modules/diff-sequences": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
- "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
- "dev": true,
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
"node_modules/dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -5809,21 +5698,6 @@
"dev": true,
"peer": true
},
- "node_modules/domexception": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
- "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
- "deprecated": "Use your platform's native DOMException instead",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "webidl-conversions": "^7.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/dot-case": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
@@ -6109,29 +5983,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/escodegen": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
- "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "esprima": "^4.0.1",
- "estraverse": "^5.2.0",
- "esutils": "^2.0.2"
- },
- "bin": {
- "escodegen": "bin/escodegen.js",
- "esgenerate": "bin/esgenerate.js"
- },
- "engines": {
- "node": ">=6.0"
- },
- "optionalDependencies": {
- "source-map": "~0.6.1"
- }
- },
"node_modules/eslint": {
"version": "8.57.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
@@ -6710,21 +6561,47 @@
"is-callable": "^1.1.3"
}
},
- "node_modules/form-data": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "node_modules/foreground-child": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz",
+ "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
},
"engines": {
- "node": ">= 6"
- }
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/foreground-child/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dev": true,
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
},
"node_modules/fs-readdir-recursive": {
"version": "1.1.0",
@@ -7084,17 +6961,15 @@
"dev": true
},
"node_modules/html-encoding-sniffer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
- "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz",
+ "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "whatwg-encoding": "^2.0.0"
+ "whatwg-encoding": "^3.1.1"
},
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/html-escaper": {
@@ -7104,34 +6979,29 @@
"dev": true
},
"node_modules/http-proxy-agent": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
- "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "@tootallnate/once": "2",
- "agent-base": "6",
- "debug": "4"
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
},
"engines": {
- "node": ">= 6"
+ "node": ">= 14"
}
},
"node_modules/https-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz",
+ "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "agent-base": "6",
+ "agent-base": "^7.0.2",
"debug": "4"
},
"engines": {
- "node": ">= 6"
+ "node": ">= 14"
}
},
"node_modules/human-signals": {
@@ -7341,8 +7211,6 @@
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
},
@@ -7718,9 +7586,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
"integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
- "dev": true,
- "optional": true,
- "peer": true
+ "dev": true
},
"node_modules/is-regex": {
"version": "1.1.4",
@@ -7908,6 +7774,20 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz",
+ "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.23",
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/istanbul-reports": {
"version": "3.1.7",
"resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz",
@@ -7934,6 +7814,21 @@
"set-function-name": "^2.0.1"
}
},
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "dev": true,
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
"node_modules/jest-styled-components": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/jest-styled-components/-/jest-styled-components-7.2.0.tgz",
@@ -7967,45 +7862,38 @@
}
},
"node_modules/jsdom": {
- "version": "20.0.3",
- "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz",
- "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==",
+ "version": "24.1.1",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.1.tgz",
+ "integrity": "sha512-5O1wWV99Jhq4DV7rCLIoZ/UIhyQeDR7wHVyZAHAshbrvZsLs+Xzz7gtwnlJTJDjleiTKh54F4dXrX70vJQTyJQ==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "abab": "^2.0.6",
- "acorn": "^8.8.1",
- "acorn-globals": "^7.0.0",
- "cssom": "^0.5.0",
- "cssstyle": "^2.3.0",
- "data-urls": "^3.0.2",
- "decimal.js": "^10.4.2",
- "domexception": "^4.0.0",
- "escodegen": "^2.0.0",
+ "cssstyle": "^4.0.1",
+ "data-urls": "^5.0.0",
+ "decimal.js": "^10.4.3",
"form-data": "^4.0.0",
- "html-encoding-sniffer": "^3.0.0",
- "http-proxy-agent": "^5.0.0",
- "https-proxy-agent": "^5.0.1",
+ "html-encoding-sniffer": "^4.0.0",
+ "http-proxy-agent": "^7.0.2",
+ "https-proxy-agent": "^7.0.5",
"is-potential-custom-element-name": "^1.0.1",
- "nwsapi": "^2.2.2",
- "parse5": "^7.1.1",
+ "nwsapi": "^2.2.12",
+ "parse5": "^7.1.2",
+ "rrweb-cssom": "^0.7.1",
"saxes": "^6.0.0",
"symbol-tree": "^3.2.4",
- "tough-cookie": "^4.1.2",
- "w3c-xmlserializer": "^4.0.0",
+ "tough-cookie": "^4.1.4",
+ "w3c-xmlserializer": "^5.0.0",
"webidl-conversions": "^7.0.0",
- "whatwg-encoding": "^2.0.0",
- "whatwg-mimetype": "^3.0.0",
- "whatwg-url": "^11.0.0",
- "ws": "^8.11.0",
- "xml-name-validator": "^4.0.0"
+ "whatwg-encoding": "^3.1.1",
+ "whatwg-mimetype": "^4.0.0",
+ "whatwg-url": "^14.0.0",
+ "ws": "^8.18.0",
+ "xml-name-validator": "^5.0.0"
},
"engines": {
- "node": ">=14"
+ "node": ">=18"
},
"peerDependencies": {
- "canvas": "^2.5.0"
+ "canvas": "^2.11.2"
},
"peerDependenciesMeta": {
"canvas": {
@@ -8088,12 +7976,6 @@
"node": ">=6"
}
},
- "node_modules/jsonc-parser": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz",
- "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==",
- "dev": true
- },
"node_modules/jsonify": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz",
@@ -8328,22 +8210,6 @@
}
}
},
- "node_modules/local-pkg": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz",
- "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==",
- "dev": true,
- "dependencies": {
- "mlly": "^1.4.2",
- "pkg-types": "^1.0.3"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
"node_modules/locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -8433,9 +8299,9 @@
}
},
"node_modules/loupe": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz",
- "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz",
+ "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==",
"dev": true,
"dependencies": {
"get-func-name": "^2.0.1"
@@ -8565,8 +8431,6 @@
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"dev": true,
- "optional": true,
- "peer": true,
"engines": {
"node": ">= 0.6"
}
@@ -8576,8 +8440,6 @@
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
"mime-db": "1.52.0"
},
@@ -8618,16 +8480,13 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/mlly": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz",
- "integrity": "sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==",
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
"dev": true,
- "dependencies": {
- "acorn": "^8.11.3",
- "pathe": "^1.1.2",
- "pkg-types": "^1.0.3",
- "ufo": "^1.3.2"
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
}
},
"node_modules/moment": {
@@ -8797,12 +8656,10 @@
}
},
"node_modules/nwsapi": {
- "version": "2.2.7",
- "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz",
- "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==",
- "dev": true,
- "optional": true,
- "peer": true
+ "version": "2.2.12",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz",
+ "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==",
+ "dev": true
},
"node_modules/object-assign": {
"version": "4.1.1",
@@ -8985,6 +8842,12 @@
"node": ">=6"
}
},
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz",
+ "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==",
+ "dev": true
+ },
"node_modules/parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -9018,8 +8881,6 @@
"resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
"integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
"entities": "^4.4.0"
},
@@ -9059,6 +8920,28 @@
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
},
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true
+ },
"node_modules/path-to-regexp": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
@@ -9082,12 +8965,12 @@
"dev": true
},
"node_modules/pathval": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
- "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz",
+ "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==",
"dev": true,
"engines": {
- "node": "*"
+ "node": ">= 14.16"
}
},
"node_modules/picocolors": {
@@ -9192,17 +9075,6 @@
"node": ">=8"
}
},
- "node_modules/pkg-types": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz",
- "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==",
- "dev": true,
- "dependencies": {
- "jsonc-parser": "^3.2.0",
- "mlly": "^1.2.0",
- "pathe": "^1.1.0"
- }
- },
"node_modules/please-upgrade-node": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz",
@@ -9331,9 +9203,7 @@
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
"integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
- "dev": true,
- "optional": true,
- "peer": true
+ "dev": true
},
"node_modules/pump": {
"version": "3.0.0",
@@ -9383,9 +9253,7 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
"integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
- "dev": true,
- "optional": true,
- "peer": true
+ "dev": true
},
"node_modules/queue-microtask": {
"version": "1.2.3",
@@ -9801,9 +9669,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
- "dev": true,
- "optional": true,
- "peer": true
+ "dev": true
},
"node_modules/reselect": {
"version": "5.1.0",
@@ -9925,6 +9791,12 @@
"fsevents": "~2.3.2"
}
},
+ "node_modules/rrweb-cssom": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz",
+ "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==",
+ "dev": true
+ },
"node_modules/run-node": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz",
@@ -10005,17 +9877,13 @@
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "dev": true,
- "optional": true,
- "peer": true
+ "dev": true
},
"node_modules/saxes": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
"integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
"xmlchars": "^2.2.0"
},
@@ -10322,6 +10190,36 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/string-width/node_modules/ansi-regex": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
@@ -10446,6 +10344,19 @@
"node": ">=8"
}
},
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/strip-eof": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
@@ -10491,24 +10402,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/strip-literal": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz",
- "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==",
- "dev": true,
- "dependencies": {
- "js-tokens": "^9.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/strip-literal/node_modules/js-tokens": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz",
- "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==",
- "dev": true
- },
"node_modules/strnum": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
@@ -10579,9 +10472,7 @@
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
"integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
- "dev": true,
- "optional": true,
- "peer": true
+ "dev": true
},
"node_modules/systemjs": {
"version": "6.15.1",
@@ -10614,39 +10505,37 @@
}
},
"node_modules/test-exclude": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
- "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz",
+ "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==",
"dev": true,
"dependencies": {
"@istanbuljs/schema": "^0.1.2",
- "glob": "^7.1.4",
- "minimatch": "^3.0.4"
+ "glob": "^10.4.1",
+ "minimatch": "^9.0.4"
},
"engines": {
- "node": ">=8"
- }
- },
- "node_modules/test-exclude/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "node": ">=18"
}
},
- "node_modules/test-exclude/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/test-exclude/node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
"dev": true,
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
},
- "engines": {
- "node": "*"
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/text-table": {
@@ -10666,24 +10555,33 @@
"integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
},
"node_modules/tinybench": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.7.0.tgz",
- "integrity": "sha512-Qgayeb106x2o4hNzNjsZEfFziw8IbKqtbXBjVh7VIZfBxfD5M4gWtpyx5+YTae2gJ6Y6Dz/KLepiv16RFeQWNA==",
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
+ "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
"dev": true
},
"node_modules/tinypool": {
- "version": "0.8.4",
- "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz",
- "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz",
+ "integrity": "sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==",
+ "dev": true,
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ }
+ },
+ "node_modules/tinyrainbow": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz",
+ "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==",
"dev": true,
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/tinyspy": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz",
- "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz",
+ "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==",
"dev": true,
"engines": {
"node": ">=14.0.0"
@@ -10719,12 +10617,10 @@
}
},
"node_modules/tough-cookie": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz",
- "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
+ "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
"psl": "^1.1.33",
"punycode": "^2.1.1",
@@ -10736,17 +10632,15 @@
}
},
"node_modules/tr46": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
- "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz",
+ "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "punycode": "^2.1.1"
+ "punycode": "^2.3.1"
},
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/ts-api-utils": {
@@ -10778,15 +10672,6 @@
"node": ">= 0.8.0"
}
},
- "node_modules/type-detect": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/type-fest": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
@@ -10885,12 +10770,6 @@
"node": ">=14.17"
}
},
- "node_modules/ufo": {
- "version": "1.5.3",
- "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz",
- "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==",
- "dev": true
- },
"node_modules/unbox-primitive": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
@@ -10955,8 +10834,6 @@
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
"integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
"dev": true,
- "optional": true,
- "peer": true,
"engines": {
"node": ">= 4.0.0"
}
@@ -11004,8 +10881,6 @@
"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
"integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
"querystringify": "^2.1.1",
"requires-port": "^1.0.0"
@@ -11110,15 +10985,15 @@
}
},
"node_modules/vite-node": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz",
- "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.5.tgz",
+ "integrity": "sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==",
"dev": true,
"dependencies": {
"cac": "^6.7.14",
- "debug": "^4.3.4",
- "pathe": "^1.1.1",
- "picocolors": "^1.0.0",
+ "debug": "^4.3.5",
+ "pathe": "^1.1.2",
+ "tinyrainbow": "^1.2.0",
"vite": "^5.0.0"
},
"bin": {
@@ -11131,6 +11006,23 @@
"url": "https://opencollective.com/vitest"
}
},
+ "node_modules/vite-node/node_modules/debug": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
+ "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
"node_modules/vite-plugin-eslint": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/vite-plugin-eslint/-/vite-plugin-eslint-1.8.1.tgz",
@@ -11242,31 +11134,30 @@
}
},
"node_modules/vitest": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz",
- "integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==",
- "dev": true,
- "dependencies": {
- "@vitest/expect": "1.6.0",
- "@vitest/runner": "1.6.0",
- "@vitest/snapshot": "1.6.0",
- "@vitest/spy": "1.6.0",
- "@vitest/utils": "1.6.0",
- "acorn-walk": "^8.3.2",
- "chai": "^4.3.10",
- "debug": "^4.3.4",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.5.tgz",
+ "integrity": "sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.3.0",
+ "@vitest/expect": "2.0.5",
+ "@vitest/pretty-format": "^2.0.5",
+ "@vitest/runner": "2.0.5",
+ "@vitest/snapshot": "2.0.5",
+ "@vitest/spy": "2.0.5",
+ "@vitest/utils": "2.0.5",
+ "chai": "^5.1.1",
+ "debug": "^4.3.5",
"execa": "^8.0.1",
- "local-pkg": "^0.5.0",
- "magic-string": "^0.30.5",
- "pathe": "^1.1.1",
- "picocolors": "^1.0.0",
- "std-env": "^3.5.0",
- "strip-literal": "^2.0.0",
- "tinybench": "^2.5.1",
- "tinypool": "^0.8.3",
+ "magic-string": "^0.30.10",
+ "pathe": "^1.1.2",
+ "std-env": "^3.7.0",
+ "tinybench": "^2.8.0",
+ "tinypool": "^1.0.0",
+ "tinyrainbow": "^1.2.0",
"vite": "^5.0.0",
- "vite-node": "1.6.0",
- "why-is-node-running": "^2.2.2"
+ "vite-node": "2.0.5",
+ "why-is-node-running": "^2.3.0"
},
"bin": {
"vitest": "vitest.mjs"
@@ -11280,8 +11171,8 @@
"peerDependencies": {
"@edge-runtime/vm": "*",
"@types/node": "^18.0.0 || >=20.0.0",
- "@vitest/browser": "1.6.0",
- "@vitest/ui": "1.6.0",
+ "@vitest/browser": "2.0.5",
+ "@vitest/ui": "2.0.5",
"happy-dom": "*",
"jsdom": "*"
},
@@ -11306,6 +11197,23 @@
}
}
},
+ "node_modules/vitest/node_modules/debug": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
+ "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
"node_modules/vitest/node_modules/execa": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
@@ -11429,17 +11337,15 @@
}
},
"node_modules/w3c-xmlserializer": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz",
- "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
+ "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "xml-name-validator": "^4.0.0"
+ "xml-name-validator": "^5.0.0"
},
"engines": {
- "node": ">=14"
+ "node": ">=18"
}
},
"node_modules/webidl-conversions": {
@@ -11447,24 +11353,20 @@
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
"integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
"dev": true,
- "optional": true,
- "peer": true,
"engines": {
"node": ">=12"
}
},
"node_modules/whatwg-encoding": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
- "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
+ "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
"iconv-lite": "0.6.3"
},
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/whatwg-fetch": {
@@ -11473,29 +11375,25 @@
"integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg=="
},
"node_modules/whatwg-mimetype": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
- "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
+ "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
"dev": true,
- "optional": true,
- "peer": true,
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/whatwg-url": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
- "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz",
+ "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "tr46": "^3.0.0",
+ "tr46": "^5.0.0",
"webidl-conversions": "^7.0.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/which": {
@@ -11599,9 +11497,9 @@
}
},
"node_modules/why-is-node-running": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz",
- "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
+ "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
"dev": true,
"dependencies": {
"siginfo": "^2.0.0",
@@ -11631,6 +11529,53 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/wrap-ansi/node_modules/ansi-regex": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
@@ -11677,12 +11622,10 @@
"dev": true
},
"node_modules/ws": {
- "version": "8.17.1",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
- "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
+ "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
"dev": true,
- "optional": true,
- "peer": true,
"engines": {
"node": ">=10.0.0"
},
@@ -11700,23 +11643,19 @@
}
},
"node_modules/xml-name-validator": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
- "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
+ "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
"dev": true,
- "optional": true,
- "peer": true,
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/xmlchars": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
"integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
- "dev": true,
- "optional": true,
- "peer": true
+ "dev": true
},
"node_modules/yallist": {
"version": "3.1.1",
diff --git a/package.json b/package.json
index 7120bcfa3f..8ed44fdb93 100644
--- a/package.json
+++ b/package.json
@@ -85,8 +85,8 @@
"@typescript-eslint/parser": "^8.0.0",
"@vitejs/plugin-legacy": "^5.4.1",
"@vitejs/plugin-react": "^4.3.1",
- "@vitest/coverage-v8": "^1.6.0",
- "@vitest/ui": "^1.5.0",
+ "@vitest/coverage-v8": "^2.0.5",
+ "@vitest/ui": "^2.0.5",
"babel-plugin-i18next-extract": "^0.10.0",
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
@@ -97,6 +97,7 @@
"eslint-plugin-vitest-globals": "^1.5.0",
"husky": "^2.7.0",
"jest-styled-components": "^7.2.0",
+ "jsdom": "^24.1.1",
"lint-staged": "^13.1.0",
"prettier": "^3.3.3",
"typescript": "^5.5.4",
@@ -104,7 +105,7 @@
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-eslint2": "^4.4.0",
"vite-plugin-svgr": "^4.2.0",
- "vitest": "^1.5.0"
+ "vitest": "^2.0.5"
},
"husky": {
"hooks": {
From 0828a10d9664154b3f9c9006b37db09a1a2c66b8 Mon Sep 17 00:00:00 2001
From: daniele-mng
Date: Wed, 14 Aug 2024 14:00:02 +0200
Subject: [PATCH 100/130] Fix: date locale (#4122)
---
src/gmp/models/date.js | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/src/gmp/models/date.js b/src/gmp/models/date.js
index a0288710d6..17624acc22 100644
--- a/src/gmp/models/date.js
+++ b/src/gmp/models/date.js
@@ -5,13 +5,13 @@
import moment from 'moment-timezone';
-import 'moment/locale/ar';
-import 'moment/locale/de';
-import 'moment/locale/fr';
-import 'moment/locale/pt-br.js';
-import 'moment/locale/ru.js';
-import 'moment/locale/tr.js';
-import 'moment/locale/zh-cn.js';
+import 'moment/dist/locale/ar';
+import 'moment/dist/locale/de';
+import 'moment/dist/locale/fr';
+import 'moment/dist/locale/pt-br.js';
+import 'moment/dist/locale/ru.js';
+import 'moment/dist/locale/tr.js';
+import 'moment/dist/locale/zh-cn.js';
export const {
isDuration,
From 92bf33bbe2ea2f1fe8a6b0afeade7a9dec31c841 Mon Sep 17 00:00:00 2001
From: Johannes Helmold
Date: Wed, 21 Aug 2024 13:35:02 +0200
Subject: [PATCH 101/130] Fix: Fixed the saving of the SSH port in the advanced
task wizard.
Fixed the problem, that a custom SSH port was not saved in the
advanced task wizard.
---
src/web/wizard/advancedtaskwizard.jsx | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/web/wizard/advancedtaskwizard.jsx b/src/web/wizard/advancedtaskwizard.jsx
index e68fe8cec6..eaa59c9042 100644
--- a/src/web/wizard/advancedtaskwizard.jsx
+++ b/src/web/wizard/advancedtaskwizard.jsx
@@ -300,6 +300,7 @@ const AdvancedTaskWizard = ({
min="0"
max="65535"
size="5"
+ name="ssh_port"
value={state.ssh_port}
onChange={onValueChange}
/>
From ecb2636c8829da24ffd2054c9d2ba25aa808e8b1 Mon Sep 17 00:00:00 2001
From: daniele-mng
Date: Fri, 23 Aug 2024 07:32:08 +0200
Subject: [PATCH 102/130] add: vitest eslint rules
---
.eslintrc.cjs | 12 ++++-
package-lock.json | 122 ++++++++++++++++++++++++++++++++++++++++++++++
package.json | 1 +
3 files changed, 134 insertions(+), 1 deletion(-)
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
index 3c4373bc58..555da18919 100644
--- a/.eslintrc.cjs
+++ b/.eslintrc.cjs
@@ -8,7 +8,7 @@ module.exports = {
'plugin:react-hooks/recommended',
'plugin:vitest-globals/recommended',
],
- plugins: ['react', 'react-hooks', 'header'],
+ plugins: ['react', 'react-hooks', 'header', 'vitest'],
settings: {
react: {
version: 'detect',
@@ -66,6 +66,16 @@ module.exports = {
],
},
overrides: [
+ {
+ files: ['**/__tests__/**/*.[jt]s?(x)', '**/?(*.)+(spec|test).[jt]s?(x)'],
+ plugins: ['vitest'],
+ rules: {
+ 'vitest/expect-expect': 'off',
+ 'vitest/no-disabled-tests': 'warn',
+ 'vitest/no-focused-tests': 'error',
+ 'vitest/no-identical-title': 'error',
+ },
+ },
{
files: ['vite-env.d.ts'],
rules: {
diff --git a/package-lock.json b/package-lock.json
index 53c2b80d29..890b7fed57 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -71,6 +71,7 @@
"eslint-plugin-react": "^7.35.0",
"eslint-plugin-react-hooks": "^4.6.2",
"eslint-plugin-react-refresh": "^0.4.9",
+ "eslint-plugin-vitest": "^0.5.4",
"eslint-plugin-vitest-globals": "^1.5.0",
"husky": "^2.7.0",
"jest-styled-components": "^7.2.0",
@@ -6172,12 +6173,133 @@
"semver": "bin/semver.js"
}
},
+ "node_modules/eslint-plugin-vitest": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vitest/-/eslint-plugin-vitest-0.5.4.tgz",
+ "integrity": "sha512-um+odCkccAHU53WdKAw39MY61+1x990uXjSPguUCq3VcEHdqJrOb8OTMrbYlY6f9jAKx7x98kLVlIe3RJeJqoQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/utils": "^7.7.1"
+ },
+ "engines": {
+ "node": "^18.0.0 || >= 20.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "vitest": "*"
+ },
+ "peerDependenciesMeta": {
+ "@typescript-eslint/eslint-plugin": {
+ "optional": true
+ },
+ "vitest": {
+ "optional": true
+ }
+ }
+ },
"node_modules/eslint-plugin-vitest-globals": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-vitest-globals/-/eslint-plugin-vitest-globals-1.5.0.tgz",
"integrity": "sha512-ZSsVOaOIig0oVLzRTyk8lUfBfqzWxr/J3/NFMfGGRIkGQPejJYmDH3gXmSJxAojts77uzAGB/UmVrwi2DC4LYA==",
"dev": true
},
+ "node_modules/eslint-plugin-vitest/node_modules/@typescript-eslint/scope-manager": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz",
+ "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "7.18.0",
+ "@typescript-eslint/visitor-keys": "7.18.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/eslint-plugin-vitest/node_modules/@typescript-eslint/types": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
+ "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/eslint-plugin-vitest/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz",
+ "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "7.18.0",
+ "@typescript-eslint/visitor-keys": "7.18.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-vitest/node_modules/@typescript-eslint/utils": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz",
+ "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@typescript-eslint/scope-manager": "7.18.0",
+ "@typescript-eslint/types": "7.18.0",
+ "@typescript-eslint/typescript-estree": "7.18.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.56.0"
+ }
+ },
+ "node_modules/eslint-plugin-vitest/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz",
+ "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "7.18.0",
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
"node_modules/eslint-scope": {
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
diff --git a/package.json b/package.json
index 8ed44fdb93..fc75a4bf4b 100644
--- a/package.json
+++ b/package.json
@@ -94,6 +94,7 @@
"eslint-plugin-react": "^7.35.0",
"eslint-plugin-react-hooks": "^4.6.2",
"eslint-plugin-react-refresh": "^0.4.9",
+ "eslint-plugin-vitest": "^0.5.4",
"eslint-plugin-vitest-globals": "^1.5.0",
"husky": "^2.7.0",
"jest-styled-components": "^7.2.0",
From 52940b5cd0ad2a797cee68979e2eb9f9c7037cfb Mon Sep 17 00:00:00 2001
From: Ahmed <144101267+a-h-abdelsalam@users.noreply.github.com>
Date: Fri, 23 Aug 2024 15:10:26 +0200
Subject: [PATCH 103/130] Add: Added a dedicated view for compliance audit
reports (#3952)
* Compliance reports are now listed under Resilience tab and do not appear anymore under Scans tab. A dedicated view for a compliance report shows compliance of results.
* This feature is currently behind a feature toggle: COMPLIANCE_REPORTS
---
allowedSnakeCase.cjs | 3 +
public/locales/gsa-de.json | 9 +
src/gmp/capabilities/capabilities.js | 15 +-
src/gmp/commands/__tests__/auditreport.js | 33 +
src/gmp/commands/__tests__/auditreports.js | 92 ++
src/gmp/commands/__tests__/reports.js | 2 +
src/gmp/commands/auditreports.js | 139 +++
src/gmp/commands/reports.js | 1 +
src/gmp/commands/users.js | 2 +
src/gmp/gmp.js | 1 +
src/gmp/models/auditreport.js | 65 ++
src/gmp/models/filter.js | 2 +
src/gmp/models/filter/keywords.js | 2 +
src/gmp/models/report/auditreport.js | 140 +++
src/gmp/models/report/host.js | 39 +-
src/gmp/models/report/os.js | 26 +
src/gmp/models/report/parser.js | 13 +-
src/gmp/models/result.js | 5 +
src/gmp/utils/entitytype.js | 5 +
src/web/components/bar/compliancebar.jsx | 44 +
.../components/bar/compliancestatusbar.jsx | 3 +-
src/web/components/bar/menubar.jsx | 101 +-
.../dashboard/display/createDisplay.jsx | 9 +-
.../components/dashboard/display/utils.jsx | 6 +
src/web/components/label/compliancestate.jsx | 55 +
.../__tests__/compliancelevelsgroup.jsx | 239 +++++
.../powerfilter/compliancelevelsgroup.jsx | 105 ++
src/web/pages/audits/__tests__/listpage.jsx | 8 +-
src/web/pages/audits/__tests__/row.jsx | 106 +-
src/web/pages/audits/__tests__/table.jsx | 2 +-
src/web/pages/audits/row.jsx | 30 +-
src/web/pages/audits/table.jsx | 4 +-
src/web/pages/filters/component.jsx | 9 +-
src/web/pages/policies/__tests__/listpage.jsx | 8 +-
src/web/pages/policies/table.jsx | 2 +-
.../__mocks__/mockauditdeltareport.jsx | 388 ++++++++
.../reports/__mocks__/mockauditreport.jsx | 370 +++++++
.../__tests__/auditdeltadetailspage.jsx | 377 +++++++
.../reports/__tests__/auditdetailscontent.jsx | 394 ++++++++
.../reports/__tests__/auditfilterdialog.jsx | 66 ++
.../reports/__tests__/auditreportrow.jsx | 54 +
.../__tests__/auditreportslistpage.jsx | 267 +++++
.../reports/__tests__/detailsfilterdialog.jsx | 119 +++
.../pages/reports/auditdashboard/index.jsx | 36 +
.../pages/reports/auditdashboard/loaders.jsx | 30 +
.../reports/auditdashboard/statusdisplay.jsx | 89 ++
.../pages/reports/auditdeltadetailspage.jsx | 565 +++++++++++
src/web/pages/reports/auditdetailscontent.jsx | 448 +++++++++
src/web/pages/reports/auditdetailspage.jsx | 705 +++++++++++++
src/web/pages/reports/auditfilterdialog.jsx | 134 +++
src/web/pages/reports/auditreportrow.jsx | 147 +++
.../pages/reports/auditreportslistpage.jsx | 169 ++++
src/web/pages/reports/auditreportstable.jsx | 130 +++
src/web/pages/reports/deltadetailscontent.jsx | 20 +-
src/web/pages/reports/deltadetailspage.jsx | 17 -
.../reports/details/__tests__/hoststab.jsx | 105 ++
.../details/__tests__/operatingsystemstab.jsx | 83 ++
.../reports/details/__tests__/resultstab.jsx | 369 +++++++
.../reports/details/auditthresholdpanel.jsx | 150 +++
.../pages/reports/details/deltaresultstab.jsx | 4 +
.../reports/details/emptyresultsreport.jsx | 8 +-
src/web/pages/reports/details/hoststab.jsx | 10 +
src/web/pages/reports/details/hoststable.jsx | 226 +++--
.../reports/details/operatingsystemstab.jsx | 4 +
.../reports/details/operatingsystemstable.jsx | 55 +-
src/web/pages/reports/details/resultstab.jsx | 115 ++-
.../pages/reports/details/toolbaricons.jsx | 24 +-
src/web/pages/reports/detailsfilterdialog.jsx | 52 +-
src/web/pages/results/__tests__/row.jsx | 144 +++
src/web/pages/results/row.jsx | 38 +-
src/web/pages/results/table.jsx | 32 +-
src/web/pages/start/dashboard.jsx | 19 +-
src/web/pages/tags/component.jsx | 10 +-
src/web/pages/tags/dialog.jsx | 1 +
src/web/pages/tasks/status.jsx | 15 +-
src/web/pages/usersettings/dialog.jsx | 17 +-
src/web/pages/usersettings/filterpart.jsx | 21 +-
.../pages/usersettings/usersettingspage.jsx | 18 +
src/web/routes.jsx | 16 +
src/web/store/entities/__tests__/reducers.js | 2 +
src/web/store/entities/auditreports.js | 62 ++
src/web/store/entities/reducers.js | 6 +
.../entities/report/__tests__/actions.js | 941 +++++++++++++++++-
src/web/store/entities/report/actions.js | 332 ++++--
src/web/store/entities/report/reducers.js | 2 +-
src/web/store/entities/report/selectors.js | 6 +
src/web/store/entities/reports/reducers.js | 2 +-
src/web/utils/theme.jsx | 5 +
88 files changed, 8335 insertions(+), 409 deletions(-)
create mode 100644 src/gmp/commands/__tests__/auditreport.js
create mode 100644 src/gmp/commands/__tests__/auditreports.js
create mode 100644 src/gmp/commands/auditreports.js
create mode 100644 src/gmp/models/auditreport.js
create mode 100644 src/gmp/models/report/auditreport.js
create mode 100644 src/web/components/bar/compliancebar.jsx
create mode 100644 src/web/components/label/compliancestate.jsx
create mode 100644 src/web/components/powerfilter/__tests__/compliancelevelsgroup.jsx
create mode 100644 src/web/components/powerfilter/compliancelevelsgroup.jsx
create mode 100644 src/web/pages/reports/__mocks__/mockauditdeltareport.jsx
create mode 100644 src/web/pages/reports/__mocks__/mockauditreport.jsx
create mode 100644 src/web/pages/reports/__tests__/auditdeltadetailspage.jsx
create mode 100644 src/web/pages/reports/__tests__/auditdetailscontent.jsx
create mode 100644 src/web/pages/reports/__tests__/auditfilterdialog.jsx
create mode 100644 src/web/pages/reports/__tests__/auditreportrow.jsx
create mode 100644 src/web/pages/reports/__tests__/auditreportslistpage.jsx
create mode 100644 src/web/pages/reports/__tests__/detailsfilterdialog.jsx
create mode 100644 src/web/pages/reports/auditdashboard/index.jsx
create mode 100644 src/web/pages/reports/auditdashboard/loaders.jsx
create mode 100644 src/web/pages/reports/auditdashboard/statusdisplay.jsx
create mode 100644 src/web/pages/reports/auditdeltadetailspage.jsx
create mode 100644 src/web/pages/reports/auditdetailscontent.jsx
create mode 100644 src/web/pages/reports/auditdetailspage.jsx
create mode 100644 src/web/pages/reports/auditfilterdialog.jsx
create mode 100644 src/web/pages/reports/auditreportrow.jsx
create mode 100644 src/web/pages/reports/auditreportslistpage.jsx
create mode 100644 src/web/pages/reports/auditreportstable.jsx
create mode 100644 src/web/pages/reports/details/__tests__/resultstab.jsx
create mode 100644 src/web/pages/reports/details/auditthresholdpanel.jsx
create mode 100644 src/web/store/entities/auditreports.js
diff --git a/allowedSnakeCase.cjs b/allowedSnakeCase.cjs
index b257daf6f7..8bc6e4a50e 100644
--- a/allowedSnakeCase.cjs
+++ b/allowedSnakeCase.cjs
@@ -29,6 +29,8 @@ module.exports = [
'_asset_id',
'asset_id',
'assigned_to',
+ 'audit_report',
+ 'audit_reports',
'auth_algorithm',
'auth_conf_setting',
'auth_method',
@@ -248,6 +250,7 @@ module.exports = [
'highest_severity',
'high_per_host',
'host_allow',
+ 'host_compliance',
'host_cves',
'hostnames_by_ip',
'hosts_allow',
diff --git a/public/locales/gsa-de.json b/public/locales/gsa-de.json
index 24374558ee..a302ea7032 100644
--- a/public/locales/gsa-de.json
+++ b/public/locales/gsa-de.json
@@ -158,6 +158,9 @@
"Audit made visible for:\n{{user}}\n{{role}}\n{{group}}": "Audit sichtbar gemacht für:\n{{user}}\n{{role}}\n{{group}}",
"Audit: {{name}}": "Audit: {{name}}",
"Audits": "Audits",
+ "Audit Reports by Compliance (Total: {{count}})": "Audit-Berichte nach Compliance (Gesamt: {{count}})",
+ "Audit Reports": "Audit-Berichte",
+ "Audit Report": "Audit-Bericht",
"Audits using this Policy": "Audits, die diese Richtlinie verwenden",
"Auth": "Auth.",
"Auth Algorithm": "Auth-Algorithmus",
@@ -243,6 +246,7 @@
"Certificate in use will expire at {{date}}": "Aktuelles Zertifikat wird am {{date}} ablaufen",
"Change Password": "Passwort ändern",
"Changed": "Verändert",
+ "Chart: Audit Reports by Compliance": "Diagramm: Audit-Berichte nach Compliance",
"Chart: CERT-Bund Advisories by CVSS": "Diagramm: CERT-Bund-Advisories nach CVSS",
"Chart: CERT-Bund Advisories by Creation Time": "Diagramm: CERT-Bund-Advisories nach Erstellungszeit",
"Chart: CERT-Bund Advisories by Severity Class": "Diagramm: CERT-Bund-Advisories nach Schweregradklasse",
@@ -323,6 +327,8 @@
"Complete": "Vollständig",
"Complexity": "Komplexität",
"Compliance Audits": "Compliance Audits",
+ "Compliance Audit Reports": "Compliance-Audit-Berichte",
+ "Compliance Percent": "Compliance-Prozent",
"Compliance Policies": "Compliance Richtlinien",
"Compliance Status": "Compliance Status",
"Compose": "Zusammenstellen",
@@ -841,6 +847,7 @@
"Include log messages in your filter settings.": "Log-Nachrichten in die Filtereinstellungen einbeziehen.",
"Include report": "Bericht einfügen",
"Included": "Beinhaltet",
+ "Incomplete": "Unvollständig",
"Info": "Info",
"Information": "Informationen",
"Inheriting user": "Erbender Benutzer",
@@ -1543,6 +1550,7 @@
"TLS Certificates by Modification Time (Total: {{count}})": "TLS-Zertifikate nach Änderungszeit (Gesamt: {{count}})",
"TLS Certificates by Status (Total: {{count}})": "TLS-Zertifikate nach Status (Gesamt: {{count}})",
"TLS Certificates for this Host": "TLS-Zertifikate für diesen Host",
+ "Table: Audit Reports by Compliance": "Tabelle: Audit-Berichte nach Compliance",
"Table: CERT-Bund Advisories by CVSS": "Tabelle: CERT-Bund-Advisories nach CVSS",
"Table: CERT-Bund Advisories by Creation Time": "Tabelle: CERT-Bund-Advisories nach Erstellungszeit",
"Table: CERT-Bund Advisories by Severity Class": "Tabelle: CERT-Bund-Advisories nach Schweregradklasse",
@@ -1908,6 +1916,7 @@
"task": "Aufgabe",
"to": "für",
"undefined": "undefiniert",
+ "Undefined": "Undefiniert",
"until {{- enddate}}": "bis {{- enddate}}",
"verinice Connector": "verinice-Konnektor",
"verinice.PRO Connector": "verinice.PRO-Konnektor",
diff --git a/src/gmp/capabilities/capabilities.js b/src/gmp/capabilities/capabilities.js
index f8baa0e991..297f9e8fc9 100644
--- a/src/gmp/capabilities/capabilities.js
+++ b/src/gmp/capabilities/capabilities.js
@@ -9,8 +9,8 @@ import {pluralizeType} from 'gmp/utils/entitytype';
import {parseBoolean} from 'gmp/parser';
const types = {
- audit: 'task',
- audits: 'task',
+ auditreport: 'audit_report',
+ auditreports: 'audit_reports',
host: 'asset',
hosts: 'asset',
os: 'asset',
@@ -42,12 +42,19 @@ const types = {
tlscertificates: 'tls_certificate',
};
+const subtypes = {
+ audit: 'task',
+ audits: 'task',
+ audit_report: 'report',
+ audit_reports: 'reports',
+};
+
const convertType = type => {
const ctype = types[type];
if (isDefined(ctype)) {
- return ctype;
+ type = ctype;
}
- return type;
+ return subtypes[type] || type;
};
class Capabilities {
diff --git a/src/gmp/commands/__tests__/auditreport.js b/src/gmp/commands/__tests__/auditreport.js
new file mode 100644
index 0000000000..d6eef9ec28
--- /dev/null
+++ b/src/gmp/commands/__tests__/auditreport.js
@@ -0,0 +1,33 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {describe, test, expect} from '@gsa/testing';
+import {createHttp, createEntityResponse} from 'gmp/commands/testing';
+import {AuditReportCommand} from 'gmp/commands/auditreports';
+
+describe('AuditReportCommand tests', () => {
+ test('should request single audit report', () => {
+ const response = createEntityResponse('report', {_id: 'foo'});
+ const fakeHttp = createHttp(response);
+
+ expect.hasAssertions();
+
+ const cmd = new AuditReportCommand(fakeHttp);
+ return cmd.get({id: 'foo'}).then(resp => {
+ expect(fakeHttp.request).toHaveBeenCalledWith('get', {
+ args: {
+ cmd: 'get_report',
+ report_id: 'foo',
+ ignore_pagination: 1,
+ details: 1,
+ lean: 1,
+ },
+ });
+
+ const {data} = resp;
+ expect(data.id).toEqual('foo');
+ });
+ });
+});
diff --git a/src/gmp/commands/__tests__/auditreports.js b/src/gmp/commands/__tests__/auditreports.js
new file mode 100644
index 0000000000..1169cfd917
--- /dev/null
+++ b/src/gmp/commands/__tests__/auditreports.js
@@ -0,0 +1,92 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {describe, test, expect} from '@gsa/testing';
+import {ALL_FILTER} from 'gmp/models/filter';
+
+import {
+ createHttp,
+ createEntitiesResponse,
+ createAggregatesResponse,
+} from '../testing';
+import {AuditReportsCommand} from 'gmp/commands/auditreports';
+
+describe('AuditReportsCommand tests', () => {
+ test('should return all audit reports', () => {
+ const response = createEntitiesResponse('report', [
+ {
+ _id: '1',
+ },
+ {
+ _id: '2',
+ },
+ ]);
+
+ const fakeHttp = createHttp(response);
+
+ expect.hasAssertions();
+
+ const cmd = new AuditReportsCommand(fakeHttp);
+ return cmd.getAll().then(resp => {
+ expect(fakeHttp.request).toHaveBeenCalledWith('get', {
+ args: {
+ cmd: 'get_reports',
+ details: 0,
+ filter: ALL_FILTER.toFilterString(),
+ usage_type: 'audit',
+ },
+ });
+ const {data} = resp;
+ expect(data.length).toEqual(2);
+ });
+ });
+
+ test('should return results', () => {
+ const response = createEntitiesResponse('report', [
+ {
+ _id: '1',
+ },
+ {
+ _id: '2',
+ },
+ ]);
+
+ const fakeHttp = createHttp(response);
+
+ expect.hasAssertions();
+
+ const cmd = new AuditReportsCommand(fakeHttp);
+ return cmd.get().then(resp => {
+ expect(fakeHttp.request).toHaveBeenCalledWith('get', {
+ args: {
+ cmd: 'get_reports',
+ details: 0,
+ usage_type: 'audit',
+ },
+ });
+ const {data} = resp;
+ expect(data.length).toEqual(2);
+ });
+ });
+
+ test('should aggregate compliance counts', () => {
+ const response = createAggregatesResponse();
+ const fakeHttp = createHttp(response);
+
+ expect.hasAssertions();
+
+ const cmd = new AuditReportsCommand(fakeHttp);
+ return cmd.getComplianceAggregates().then(resp => {
+ expect(fakeHttp.request).toHaveBeenCalledWith('get', {
+ args: {
+ cmd: 'get_aggregate',
+ aggregate_type: 'report',
+ group_column: 'compliant',
+ usage_type: 'audit',
+ },
+ });
+ });
+ });
+});
diff --git a/src/gmp/commands/__tests__/reports.js b/src/gmp/commands/__tests__/reports.js
index 07d7c03968..97cc6d922b 100644
--- a/src/gmp/commands/__tests__/reports.js
+++ b/src/gmp/commands/__tests__/reports.js
@@ -32,6 +32,7 @@ describe('ReportsCommand tests', () => {
cmd: 'get_reports',
details: 0,
filter: ALL_FILTER.toFilterString(),
+ usage_type: 'scan',
},
});
const {data} = resp;
@@ -59,6 +60,7 @@ describe('ReportsCommand tests', () => {
args: {
cmd: 'get_reports',
details: 0,
+ usage_type: 'scan',
},
});
const {data} = resp;
diff --git a/src/gmp/commands/auditreports.js b/src/gmp/commands/auditreports.js
new file mode 100644
index 0000000000..dcb6ccbebd
--- /dev/null
+++ b/src/gmp/commands/auditreports.js
@@ -0,0 +1,139 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {isDefined} from 'gmp/utils/identity';
+
+import registerCommand from 'gmp/command';
+
+import AuditReport from 'gmp/models/auditreport';
+
+import {ALL_FILTER} from 'gmp/models/filter';
+
+import DefaultTransform from 'gmp/http/transform/default';
+
+import {convertBoolean} from './convert';
+import EntitiesCommand from './entities';
+import EntityCommand from './entity';
+
+export class AuditReportsCommand extends EntitiesCommand {
+ constructor(http) {
+ super(http, 'report', AuditReport);
+ }
+
+ getEntitiesResponse(root) {
+ return root.get_reports.get_reports_response;
+ }
+
+ getComplianceAggregates({filter} = {}) {
+ return this.getAggregates({
+ aggregate_type: 'report',
+ group_column: 'compliant',
+ usage_type: 'audit',
+ filter,
+ });
+ }
+
+ get(params, options) {
+ return super.get(
+ {
+ details: 0,
+ ...params,
+ usage_type: 'audit',
+ },
+ options,
+ );
+ }
+}
+
+export class AuditReportCommand extends EntityCommand {
+ constructor(http) {
+ super(http, 'report', AuditReport);
+ }
+
+ download({id}, {reportFormatId, deltaReportId, filter}) {
+ return this.httpGet(
+ {
+ cmd: 'get_report',
+ delta_report_id: deltaReportId,
+ details: 1,
+ report_id: id,
+ report_format_id: reportFormatId,
+ filter: isDefined(filter) ? filter.all() : ALL_FILTER,
+ },
+ {transform: DefaultTransform, responseType: 'arraybuffer'},
+ );
+ }
+
+ addAssets({id}, {filter = ''}) {
+ return this.httpPost({
+ cmd: 'create_asset',
+ report_id: id,
+ filter,
+ });
+ }
+
+ removeAssets({id}, {filter = ''}) {
+ return this.httpPost({
+ cmd: 'delete_asset',
+ report_id: id,
+ filter,
+ });
+ }
+
+ alert({alert_id, report_id, filter}) {
+ return this.httpPost({
+ cmd: 'report_alert',
+ alert_id,
+ report_id,
+ filter,
+ });
+ }
+
+ getDelta(
+ {id},
+ {id: delta_report_id},
+ {filter, details = true, ...options} = {},
+ ) {
+ return this.httpGet(
+ {
+ id,
+ delta_report_id,
+ filter,
+ ignore_pagination: 1,
+ details: convertBoolean(details),
+ },
+ options,
+ ).then(this.transformResponse);
+ }
+
+ get(
+ {id},
+ {
+ filter,
+ details = true,
+ ignorePagination = true,
+ lean = true,
+ ...options
+ } = {},
+ ) {
+ return this.httpGet(
+ {
+ id,
+ filter,
+ lean: convertBoolean(lean),
+ ignore_pagination: convertBoolean(ignorePagination),
+ details: convertBoolean(details),
+ },
+ options,
+ ).then(this.transformResponse);
+ }
+
+ getElementFromRoot(root) {
+ return root.get_report.get_reports_response.report;
+ }
+}
+
+registerCommand('auditreport', AuditReportCommand);
+registerCommand('auditreports', AuditReportsCommand);
diff --git a/src/gmp/commands/reports.js b/src/gmp/commands/reports.js
index a1027e9160..b46fe58a23 100644
--- a/src/gmp/commands/reports.js
+++ b/src/gmp/commands/reports.js
@@ -52,6 +52,7 @@ export class ReportsCommand extends EntitiesCommand {
{
details: 0, // ensure to request no details by default
...params,
+ usage_type: 'scan',
},
options,
);
diff --git a/src/gmp/commands/users.js b/src/gmp/commands/users.js
index c94c4077e7..9a70662bcb 100644
--- a/src/gmp/commands/users.js
+++ b/src/gmp/commands/users.js
@@ -38,6 +38,7 @@ export const ROWS_PER_PAGE_SETTING_ID = '5f5a8712-8017-11e1-8556-406186ea4fc5';
export const DEFAULT_FILTER_SETTINGS = {
alert: 'b833a6f2-dcdc-4535-bfb0-a5154b5b5092',
asset: '0f040d06-abf9-43a2-8f94-9de178b0e978',
+ auditreport: '45414da7-55f0-44c1-abbb-6b7d1126fbdf',
certbund: 'e4cf514a-17e2-4ab9-9c90-336f15e24750',
cpe: '3414a107-ae46-4dea-872d-5c4479a48e8f',
credential: '186a5ac8-fe5a-4fb1-aa22-44031fb339f3',
@@ -286,6 +287,7 @@ export class UserCommand extends EntityCommand {
data.defaultTarget,
[saveDefaultFilterSettingId('alert')]: data.alertsFilter,
[saveDefaultFilterSettingId('asset')]: data.assetsFilter,
+ [saveDefaultFilterSettingId('auditreport')]: data.auditReportsFilter,
[saveDefaultFilterSettingId('scanconfig')]: data.configsFilter,
[saveDefaultFilterSettingId('credential')]: data.credentialsFilter,
[saveDefaultFilterSettingId('filter')]: data.filtersFilter,
diff --git a/src/gmp/gmp.js b/src/gmp/gmp.js
index fa52a2b89a..b233734851 100644
--- a/src/gmp/gmp.js
+++ b/src/gmp/gmp.js
@@ -11,6 +11,7 @@ import logger from 'gmp/log';
import 'gmp/commands/alerts';
import 'gmp/commands/audits';
+import 'gmp/commands/auditreports';
import 'gmp/commands/auth';
import 'gmp/commands/certbund';
import 'gmp/commands/credentials';
diff --git a/src/gmp/models/auditreport.js b/src/gmp/models/auditreport.js
new file mode 100644
index 0000000000..62438d2071
--- /dev/null
+++ b/src/gmp/models/auditreport.js
@@ -0,0 +1,65 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {_l} from 'gmp/locale/lang';
+
+import {isDefined} from 'gmp/utils/identity';
+
+import {parseDate} from 'gmp/parser';
+
+import Model, {parseModelFromElement} from 'gmp/model';
+
+import AuditReportReport from './report/auditreport';
+
+export const COMPLIANCE_STATES = {
+ yes: _l('Yes'),
+ no: _l('No'),
+ incomplete: _l('Incomplete'),
+ undefined: _l('Undefined'),
+};
+/* eslint-disable quote-props */
+
+export const getTranslatableReportCompliance = compliance =>
+ `${COMPLIANCE_STATES[compliance]}`;
+
+class AuditReport extends Model {
+ static entityType = 'auditreport';
+
+ static parseElement(element) {
+ const copy = super.parseElement(element);
+
+ const {
+ report,
+ report_format,
+ _type: type,
+ _content_type: content_type,
+ task,
+ scan_start,
+ scan_end,
+ timestamp,
+ } = element;
+
+ if (isDefined(report)) {
+ copy.report = AuditReportReport.fromElement(report);
+ }
+
+ copy.reportFormat = parseModelFromElement(report_format, 'reportformat');
+ copy.task = parseModelFromElement(task, 'task');
+
+ copy.reportType = type;
+ copy.contentType = content_type;
+
+ copy.scan_start = parseDate(scan_start);
+ copy.timestamp = parseDate(timestamp);
+
+ if (isDefined(scan_end)) {
+ copy.scan_end = parseDate(scan_end);
+ }
+
+ return copy;
+ }
+}
+
+export default AuditReport;
diff --git a/src/gmp/models/filter.js b/src/gmp/models/filter.js
index 5be78cc63f..09a3a6a9a3 100644
--- a/src/gmp/models/filter.js
+++ b/src/gmp/models/filter.js
@@ -768,6 +768,8 @@ class Filter extends Model {
export const ALL_FILTER = new Filter().all();
export const ALERTS_FILTER_FILTER = Filter.fromString('type=alert');
+export const AUDIT_REPORTS_FILTER_FILTER =
+ Filter.fromString('type=audit_report');
export const CERTBUND_FILTER_FILTER = Filter.fromString('type=info');
export const CPES_FILTER_FILTER = Filter.fromString('type=info');
export const CREDENTIALS_FILTER_FILTER = Filter.fromString('type=credential');
diff --git a/src/gmp/models/filter/keywords.js b/src/gmp/models/filter/keywords.js
index 739bc84973..f3468d7870 100644
--- a/src/gmp/models/filter/keywords.js
+++ b/src/gmp/models/filter/keywords.js
@@ -6,12 +6,14 @@
export const EXTRA_KEYWORDS = [
'apply_overrides',
+ 'compliance_levels',
'delta_states',
'first',
'levels',
'min_qod',
'notes',
'overrides',
+ 'report_compliance_levels',
'result_hosts_only',
'rows',
'solution_type',
diff --git a/src/gmp/models/report/auditreport.js b/src/gmp/models/report/auditreport.js
new file mode 100644
index 0000000000..18e69b4558
--- /dev/null
+++ b/src/gmp/models/report/auditreport.js
@@ -0,0 +1,140 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {isDefined} from 'gmp/utils/identity';
+import {isEmpty} from 'gmp/utils/string';
+
+import {parseDate} from 'gmp/parser';
+
+import {parseFilter} from 'gmp/collection/parser';
+
+import Model from 'gmp/model';
+
+import ReportTask from './task';
+
+import {
+ parse_errors,
+ parseHosts,
+ parseOperatingSystems,
+ parseResults,
+ parseTlsCertificates,
+} from './parser';
+
+class AuditReportReport extends Model {
+ static entityType = 'auditreport';
+
+ parseProperties(element) {
+ return AuditReportReport.parseElement(element);
+ }
+
+ static parseElement(element) {
+ const copy = super.parseElement(element);
+
+ const {
+ delta,
+ compliance,
+ compliance_count,
+ scan_start,
+ scan_end,
+ task,
+ scan,
+ timestamp,
+ } = element;
+
+ const filter = parseFilter(element);
+
+ copy.filter = filter;
+
+ copy.reportType = element._type;
+
+ delete copy.filters;
+
+ if (isDefined(compliance)) {
+ copy.compliance = {
+ filtered: compliance.filtered,
+ full: compliance.full,
+ };
+ }
+
+ if (isDefined(compliance_count)) {
+ copy.complianceCounts = {
+ filtered: parseInt(compliance_count.filtered),
+ full: parseInt(compliance_count.full),
+ incomplete: {
+ filtered: parseInt(compliance_count.incomplete.filtered),
+ full: parseInt(compliance_count.incomplete.full),
+ },
+ no: {
+ filtered: parseInt(compliance_count.no.filtered),
+ full: parseInt(compliance_count.no.full),
+ },
+ undefined: {
+ filtered: parseInt(compliance_count.undefined.filtered),
+ full: parseInt(compliance_count.undefined.full),
+ },
+ yes: {
+ filtered: parseInt(compliance_count.yes.filtered),
+ full: parseInt(compliance_count.yes.full),
+ },
+ };
+ }
+
+ delete copy.compliance_count;
+
+ copy.task = ReportTask.fromElement(task);
+
+ copy.results = parseResults(element, filter);
+
+ copy.hosts = parseHosts(element, filter);
+
+ copy.tlsCertificates = parseTlsCertificates(element, filter);
+
+ delete copy.host;
+
+ copy.operatingSystems = parseOperatingSystems(element, filter);
+
+ copy.errors = parse_errors(element, filter);
+
+ copy.scan_start = parseDate(scan_start);
+
+ if (isDefined(scan_end)) {
+ copy.scan_end = parseDate(scan_end);
+ }
+
+ if (isDefined(timestamp)) {
+ copy.timestamp = parseDate(timestamp);
+ }
+
+ if (isDefined(scan) && isDefined(scan.task) && isDefined(scan.task.slave)) {
+ if (isEmpty(scan.task.slave._id)) {
+ delete copy.scan.task.slave;
+ } else {
+ copy.slave = {
+ ...scan.task.slave,
+ };
+ }
+ }
+
+ if (isDefined(delta) && isDefined(delta.report)) {
+ copy.delta_report = {
+ id: delta.report._id,
+ scan_run_status: delta.report.scan_run_status,
+ scan_end: parseDate(delta.report.scan_end),
+ scan_start: parseDate(delta.report.scan_start),
+ timestamp: parseDate(delta.report.timestamp),
+ };
+
+ delete copy.delta;
+ }
+
+ return copy;
+ }
+
+ isDeltaReport() {
+ return this.reportType === 'delta';
+ }
+}
+
+export default AuditReportReport;
diff --git a/src/gmp/models/report/host.js b/src/gmp/models/report/host.js
index b22be1fe19..098e851886 100644
--- a/src/gmp/models/report/host.js
+++ b/src/gmp/models/report/host.js
@@ -38,6 +38,12 @@ class Host {
warning: 0,
total: 0,
};
+ this.complianceCounts = {
+ yes: 0,
+ no: 0,
+ incomplete: 0,
+ total: 0,
+ };
}
static fromElement(element) {
@@ -51,7 +57,19 @@ class Host {
static parseElement(element = {}) {
const copy = {...element};
- const {asset = {}, port_count = {}, result_count} = element;
+ const {
+ asset = {},
+ port_count = {},
+ result_count,
+ compliance_count,
+ host_compliance,
+ } = element;
+
+ copy.hostCompliance = isDefined(host_compliance)
+ ? host_compliance
+ : 'undefined';
+
+ delete copy.host_compliance;
if (isEmpty(asset._asset_id)) {
delete copy.asset;
@@ -82,10 +100,29 @@ class Host {
};
}
+ if (isDefined(compliance_count)) {
+ copy.complianceCounts = {
+ yes: parse_page_count(compliance_count.yes),
+ no: parse_page_count(compliance_count.no),
+ incomplete: parse_page_count(compliance_count.incomplete),
+ undefined: parse_page_count(compliance_count.undefined),
+ total: parse_page_count(compliance_count),
+ };
+ } else {
+ copy.complianceCounts = {
+ yes: 0,
+ no: 0,
+ incomplete: 0,
+ undefined: 0,
+ total: 0,
+ };
+ }
+
copy.start = parseDate(element.start);
copy.end = parseDate(element.end);
delete copy.result_count;
+ delete copy.compliance_count;
copy.authSuccess = {};
copy.details = {};
diff --git a/src/gmp/models/report/os.js b/src/gmp/models/report/os.js
index e90ed54b94..ebc6188e3d 100644
--- a/src/gmp/models/report/os.js
+++ b/src/gmp/models/report/os.js
@@ -11,6 +11,7 @@ class OperatingSystem {
constructor() {
this.hosts = {
hostsByIp: {},
+ complianceByIp: {},
count: 0,
};
}
@@ -22,6 +23,31 @@ class OperatingSystem {
}
}
+ addHostCompliance(host, compliance) {
+ if (!(host.ip in this.hosts.complianceByIp)) {
+ this.hosts.complianceByIp[host.ip] = compliance;
+ }
+ const complianceByIpValues = Object.values(this.hosts.complianceByIp);
+
+ const isNoInCompliance = complianceByIpValues.some(value => value === 'no');
+ const isIncompleteInCompliance = complianceByIpValues.some(
+ value => value === 'incomplete',
+ );
+ const isYesInCompliance = complianceByIpValues.some(
+ value => value === 'yes',
+ );
+
+ if (isNoInCompliance) {
+ this.compliance = 'no';
+ } else if (isIncompleteInCompliance) {
+ this.compliance = 'incomplete';
+ } else if (isYesInCompliance) {
+ this.compliance = 'yes';
+ } else {
+ this.compliance = 'undefined';
+ }
+ }
+
setSeverity(severity) {
if (!isDefined(this.severity) || this.severity < severity) {
this.severity = severity;
diff --git a/src/gmp/models/report/parser.js b/src/gmp/models/report/parser.js
index 65cec48744..da86443613 100644
--- a/src/gmp/models/report/parser.js
+++ b/src/gmp/models/report/parser.js
@@ -306,7 +306,7 @@ export const parseOperatingSystems = (report, filter) => {
const severities = parseHostSeverities(results);
forEach(hosts, host => {
- const {detail: details, ip} = host;
+ const {detail: details, ip, host_compliance} = host;
let best_os_cpe;
let best_os_txt;
@@ -335,6 +335,7 @@ export const parseOperatingSystems = (report, filter) => {
os.addHost(host);
os.setSeverity(severity);
+ os.addHostCompliance(host, host_compliance);
}
}
});
@@ -398,7 +399,7 @@ export const parseHosts = (report, filter) => {
const parse_report_report_counts = elem => {
const es = isDefined(elem.results) ? elem.results : {};
- const ec = elem.result_count;
+ const ec = elem.result_count ? elem.result_count : elem.compliance_count;
const length = isDefined(es.result) ? es.result.length : 0;
@@ -413,9 +414,13 @@ const parse_report_report_counts = elem => {
};
export const parseResults = (report, filter) => {
- const {results, result_count} = report;
+ const {results, result_count, compliance_count} = report;
- if (!isDefined(results) && !isDefined(result_count)) {
+ if (
+ !isDefined(results) &&
+ !isDefined(result_count) &&
+ !isDefined(compliance_count)
+ ) {
return undefined;
// instead of returning empty_collection_list(filter) we return an undefined
// in order to query if results have been loaded and make a difference to
diff --git a/src/gmp/models/result.js b/src/gmp/models/result.js
index a6291aa5f2..73cdf7901c 100644
--- a/src/gmp/models/result.js
+++ b/src/gmp/models/result.js
@@ -42,6 +42,7 @@ class Result extends Model {
const copy = super.parseElement(element);
const {
+ compliance,
description,
detection,
host = {},
@@ -88,6 +89,10 @@ class Result extends Model {
copy.description = description;
}
+ if (isDefined(compliance)) {
+ copy.compliance = compliance;
+ }
+
if (isDefined(severity)) {
copy.severity = parseSeverity(severity);
}
diff --git a/src/gmp/utils/entitytype.js b/src/gmp/utils/entitytype.js
index 6938a59eb1..815cd00d42 100644
--- a/src/gmp/utils/entitytype.js
+++ b/src/gmp/utils/entitytype.js
@@ -34,6 +34,7 @@ export const pluralizeType = type => {
return type + 's';
};
const TYPES = {
+ audit_report: 'auditreport',
config: 'scanconfig',
cert_bund_adv: 'certbund',
dfn_cert_adv: 'dfncert',
@@ -61,6 +62,8 @@ export const normalizeType = type => {
const ENTITY_TYPES = {
alert: _l('Alert'),
asset: _l('Asset'),
+ audit: _l('Audit'),
+ auditreport: _l('Audit Report'),
certbund: _l('CERT-Bund Advisory'),
cpe: _l('CPE'),
credential: _l('Credential'),
@@ -75,6 +78,7 @@ const ENTITY_TYPES = {
note: _l('Note'),
nvt: _l('NVT'),
permission: _l('Permission'),
+ policy: _l('Policy'),
portlist: _l('Port List'),
portrange: _l('Port Range'),
report: _l('Report'),
@@ -108,6 +112,7 @@ export const typeName = type => {
};
const CMD_TYPES = {
+ auditreport: 'audit_report',
scanconfig: 'config',
certbund: 'cert_bund_adv',
dfncert: 'dfn_cert_adv',
diff --git a/src/web/components/bar/compliancebar.jsx b/src/web/components/bar/compliancebar.jsx
new file mode 100644
index 0000000000..9f17e89fc9
--- /dev/null
+++ b/src/web/components/bar/compliancebar.jsx
@@ -0,0 +1,44 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import React from 'react';
+
+import {isDefined} from 'gmp/utils/identity';
+
+import PropTypes from 'web/utils/proptypes';
+import Theme from 'web/utils/theme';
+
+import ProgressBar from './progressbar';
+import {getTranslatableReportCompliance} from 'gmp/models/auditreport';
+
+const ComplianceBar = ({compliance, toolTip}) => {
+ const title = getTranslatableReportCompliance(compliance);
+
+ let background;
+ if (compliance === 'no') {
+ background = Theme.complianceNo;
+ } else if (compliance === 'incomplete') {
+ background = Theme.complianceIncomplete;
+ } else if (compliance === 'yes') {
+ background = Theme.complianceYes;
+ } else {
+ background = Theme.complianceUndefined;
+ }
+
+ const toolTipText = isDefined(toolTip) ? toolTip : title;
+
+ return (
+
+ {title}
+
+ );
+};
+
+ComplianceBar.propTypes = {
+ compliance: PropTypes.string,
+ toolTip: PropTypes.string,
+};
+
+export default ComplianceBar;
\ No newline at end of file
diff --git a/src/web/components/bar/compliancestatusbar.jsx b/src/web/components/bar/compliancestatusbar.jsx
index a3fbe98afe..16917b57f2 100644
--- a/src/web/components/bar/compliancestatusbar.jsx
+++ b/src/web/components/bar/compliancestatusbar.jsx
@@ -5,7 +5,7 @@
import React from 'react';
-import _ from 'gmp/locale';
+import useTranslation from 'web/hooks/useTranslation';
import PropTypes from 'web/utils/proptypes';
import Theme from 'web/utils/theme';
@@ -15,6 +15,7 @@ import ProgressBar from 'web/components/bar/progressbar';
const ComplianceStatusBar = ({complianceStatus}) => {
let text;
let boxBackground;
+ const [_] = useTranslation();
if (complianceStatus < 0 || complianceStatus > 100) {
text = _('N/A');
boxBackground = Theme.darkGrey;
diff --git a/src/web/components/bar/menubar.jsx b/src/web/components/bar/menubar.jsx
index 8d5e567a03..9d1315365b 100644
--- a/src/web/components/bar/menubar.jsx
+++ b/src/web/components/bar/menubar.jsx
@@ -25,8 +25,7 @@ import {isLoggedIn} from 'web/store/usersettings/selectors';
import compose from 'web/utils/compose';
import PropTypes from 'web/utils/proptypes';
import Theme from 'web/utils/theme';
-import withGmp from 'web/utils/withGmp';
-import withCapabilities from 'web/utils/withCapabilities';
+import useCapabilities from 'web/hooks/useCapabilities';
const MENU_BAR_HEIGHT = '35px';
@@ -54,8 +53,11 @@ const MenuBarPlaceholder = styled.div`
`;
// eslint-disable-next-line no-shadow
-const MenuBar = ({isLoggedIn, capabilities}) => {
- if (!isLoggedIn || !isDefined(capabilities)) {
+const MenuBar = ({isLoggedIn}) => {
+
+ const caps = useCapabilities();
+
+ if (!isLoggedIn || !isDefined(caps)) {
return null;
}
@@ -66,7 +68,7 @@ const MenuBar = ({isLoggedIn, capabilities}) => {
'vulns',
'overrides',
'notes',
- ].reduce((sum, cur) => sum || capabilities.mayAccess(cur), false);
+ ].reduce((sum, cur) => sum || caps.mayAccess(cur), false);
const may_op_configuration = [
'targets',
@@ -80,10 +82,10 @@ const MenuBar = ({isLoggedIn, capabilities}) => {
'scanners',
'filters',
'tags',
- ].reduce((sum, cur) => sum || capabilities.mayAccess(cur), false);
+ ].reduce((sum, cur) => sum || caps.mayAccess(cur), false);
const mayOpNotesOverrides = ['notes', 'overrides'].reduce(
- (sum, cur) => sum || capabilities.mayAccess(cur),
+ (sum, cur) => sum || caps.mayAccess(cur),
false,
);
@@ -91,20 +93,20 @@ const MenuBar = ({isLoggedIn, capabilities}) => {
'alerts',
'schedules',
'report_formats',
- ].reduce((sum, cur) => sum || capabilities.mayAccess(cur), false);
+ ].reduce((sum, cur) => sum || caps.mayAccess(cur), false);
const mayOpScannersFiltersTags = ['scanners', 'filters', 'tags'].reduce(
- (sum, cur) => sum || capabilities.mayAccess(cur),
+ (sum, cur) => sum || caps.mayAccess(cur),
false,
);
const mayOpResilience = ['tickets', 'policies', 'audits'].reduce(
- (sum, cur) => sum || capabilities.mayAccess(cur),
+ (sum, cur) => sum || caps.mayAccess(cur),
false,
);
const mayOpAssets = ['assets', 'tls_certificates'].reduce(
- (sum, cur) => sum || capabilities.mayAccess(cur),
+ (sum, cur) => sum || caps.mayAccess(cur),
false,
);
@@ -116,24 +118,24 @@ const MenuBar = ({isLoggedIn, capabilities}) => {
{may_op_scans && (
- {capabilities.mayAccess('tasks') && (
+ {caps.mayAccess('tasks') && (
)}
- {capabilities.mayAccess('reports') && (
+ {caps.mayAccess('reports') && (
)}
- {capabilities.mayAccess('results') && (
+ {caps.mayAccess('results') && (
)}
- {capabilities.mayAccess('vulns') && (
+ {caps.mayAccess('vulns') && (
)}
{mayOpNotesOverrides && (
- {capabilities.mayAccess('notes') && (
+ {caps.mayAccess('notes') && (
)}
- {capabilities.mayAccess('overrides') && (
+ {caps.mayAccess('overrides') && (
)}
@@ -142,36 +144,43 @@ const MenuBar = ({isLoggedIn, capabilities}) => {
)}
{mayOpAssets && (
- {capabilities.mayAccess('assets') && (
+ {caps.mayAccess('assets') && (
)}
- {capabilities.mayAccess('assets') && (
+ {caps.mayAccess('assets') && (
)}
- {capabilities.mayAccess('tls_certificates') && (
+ {caps.mayAccess('tls_certificates') && (
)}
)}
{mayOpResilience && (
- {capabilities.mayAccess('tickets') && (
+ {caps.mayAccess('tickets') && (
)}
- {capabilities.mayAccess('policies') && (
+ {caps.mayAccess('policies') && (
)}
- {capabilities.mayAccess('audits') && (
+ {caps.mayAccess('audits') && (
)}
+ {caps.featureEnabled('COMPLIANCE_REPORTS') &&
+ caps.mayAccess('audits') && (
+
+ )}
)}
- {capabilities.mayAccess('info') && (
+ {caps.mayAccess('info') && (
@@ -182,43 +191,43 @@ const MenuBar = ({isLoggedIn, capabilities}) => {
)}
{may_op_configuration && (
- {capabilities.mayAccess('targets') && (
+ {caps.mayAccess('targets') && (
)}
- {capabilities.mayAccess('port_lists') && (
+ {caps.mayAccess('port_lists') && (
)}
- {capabilities.mayAccess('credentials') && (
+ {caps.mayAccess('credentials') && (
)}
- {capabilities.mayAccess('configs') && (
+ {caps.mayAccess('configs') && (
)}
{mayOpAlertsSchedulesReportFormats && (
- {capabilities.mayAccess('alerts') && (
+ {caps.mayAccess('alerts') && (
)}
- {capabilities.mayAccess('schedules') && (
+ {caps.mayAccess('schedules') && (
)}
- {capabilities.mayAccess('report_configs') && (
+ {caps.mayAccess('report_configs') && (
)}
- {capabilities.mayAccess('report_formats') && (
+ {caps.mayAccess('report_formats') && (
)}
)}
{mayOpScannersFiltersTags && (
- {capabilities.mayAccess('scanners') && (
+ {caps.mayAccess('scanners') && (
)}
- {capabilities.mayAccess('filters') && (
+ {caps.mayAccess('filters') && (
)}
- {capabilities.mayAccess('tags') && (
+ {caps.mayAccess('tags') && (
)}
@@ -226,20 +235,20 @@ const MenuBar = ({isLoggedIn, capabilities}) => {
)}
- {capabilities.mayAccess('users') && (
+ {caps.mayAccess('users') && (
)}
- {capabilities.mayAccess('groups') && (
+ {caps.mayAccess('groups') && (
)}
- {capabilities.mayAccess('roles') && (
+ {caps.mayAccess('roles') && (
)}
- {capabilities.mayAccess('permissions') && (
+ {caps.mayAccess('permissions') && (
)}
- {capabilities.mayAccess('system_reports') && (
+ {caps.mayAccess('system_reports') && (
{
/>
)}
- {capabilities.mayAccess('feeds') && (
+ {caps.mayAccess('feeds') && (
{
/>
)}
- {capabilities.mayOp('describe_auth') && (
+ {caps.mayOp('describe_auth') && (
- {capabilities.mayOp('modify_auth') && (
+ {caps.mayOp('modify_auth') && (
)}
- {capabilities.mayOp('modify_auth') && (
+ {caps.mayOp('modify_auth') && (
)}
@@ -278,8 +287,6 @@ const MenuBar = ({isLoggedIn, capabilities}) => {
};
MenuBar.propTypes = {
- capabilities: PropTypes.capabilities,
- gmp: PropTypes.gmp.isRequired,
isLoggedIn: PropTypes.bool.isRequired,
};
@@ -288,8 +295,6 @@ const mapStateToProps = rootState => ({
});
export default compose(
- withCapabilities,
- withGmp,
connect(mapStateToProps),
)(MenuBar);
diff --git a/src/web/components/dashboard/display/createDisplay.jsx b/src/web/components/dashboard/display/createDisplay.jsx
index b6b43b1b29..520777b8ae 100644
--- a/src/web/components/dashboard/display/createDisplay.jsx
+++ b/src/web/components/dashboard/display/createDisplay.jsx
@@ -16,13 +16,20 @@ const createDisplay = ({
displayId,
displayName,
filtersFilter,
+ filterTerm,
loaderComponent: Loader,
...other
}) => {
const DisplayComponent = ({filter, ...props}) => (
{loaderProps => (
-
+
{isDefined(Chart)
? displayProps =>
: undefined}
diff --git a/src/web/components/dashboard/display/utils.jsx b/src/web/components/dashboard/display/utils.jsx
index 60a8e98838..24a76501bf 100644
--- a/src/web/components/dashboard/display/utils.jsx
+++ b/src/web/components/dashboard/display/utils.jsx
@@ -10,6 +10,8 @@ import {scaleOrdinal, scaleLinear} from 'd3-scale';
import {parseInt} from 'gmp/parser';
+import {COMPLIANCE_STATES} from 'gmp/models/auditreport';
+
import {
ERROR,
DEBUG,
@@ -149,4 +151,8 @@ export const secInfoTypeColorScale = scaleOrdinal()
'#80c674', // Nvts
]);
+export const complianceColorScale = scaleOrdinal()
+ .domain(Object.keys(COMPLIANCE_STATES))
+ .range(['#4cb045', '#D80000', 'orange', 'silver']);
+
// vim: set ts=2 sw=2 tw=80:
diff --git a/src/web/components/label/compliancestate.jsx b/src/web/components/label/compliancestate.jsx
new file mode 100644
index 0000000000..065d371f13
--- /dev/null
+++ b/src/web/components/label/compliancestate.jsx
@@ -0,0 +1,55 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import styled from 'styled-components';
+import PropTypes from 'web/utils/proptypes';
+import useTranslation from 'web/hooks/useTranslation';
+import Theme from 'web/utils/theme';
+
+const Label = styled.div`
+ text-align: center;
+ font-weight: normal;
+ font-style: normal;
+ color: white;
+ padding: 1px;
+ display: inline-block;
+ width: 70px;
+ height: 1.5em;
+ font-size: 0.8em;
+ background-color: ${props => props.$backgroundColor};
+ border-color: ${props => props.$borderColor};
+`;
+
+const ComplianceLabel = ({text, color, ...props}) => {
+ const [_] = useTranslation();
+ return (
+
+ {_(text)}
+
+ )
+};
+
+ComplianceLabel.propTypes = {
+ text: PropTypes.string,
+ color: PropTypes.string,
+};
+
+const YesLabel = props => ;
+const NoLabel = props => ;
+const IncompleteLabel = props => ;
+const UndefinedLabel = props => ;
+
+export const ComplianceStateLabels = {
+ Yes: YesLabel,
+ No: NoLabel,
+ Incomplete: IncompleteLabel,
+ Undefined: UndefinedLabel,
+};
+
+export default ComplianceStateLabels;
\ No newline at end of file
diff --git a/src/web/components/powerfilter/__tests__/compliancelevelsgroup.jsx b/src/web/components/powerfilter/__tests__/compliancelevelsgroup.jsx
new file mode 100644
index 0000000000..3454b78e68
--- /dev/null
+++ b/src/web/components/powerfilter/__tests__/compliancelevelsgroup.jsx
@@ -0,0 +1,239 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {describe, test, expect, testing} from '@gsa/testing';
+import {render, fireEvent} from 'web/utils/testing';
+
+import ComplianceLevelsFilterGroup from 'web/components/powerfilter/compliancelevelsgroup';
+
+import Filter from 'gmp/models/filter';
+
+describe('ComplianceLevelsFilterGroup audit reports tests', () => {
+ test('should call change handler', () => {
+ const filter = Filter.fromString('report_compliance_levels=');
+ const handleChange = testing.fn();
+ const handleRemove = testing.fn();
+ const {element} = render(
+ ,
+ );
+
+ const checkbox = element.querySelectorAll('input');
+ fireEvent.click(checkbox[0]);
+
+ expect(handleChange).toHaveBeenCalled();
+ expect(handleChange).toHaveBeenCalledWith('y', 'report_compliance_levels');
+ });
+
+ test('should check checkbox', () => {
+ const filter = Filter.fromString('report_compliance_levels=yn');
+ const handleChange = testing.fn();
+ const handleRemove = testing.fn();
+ const {element} = render(
+ ,
+ );
+
+ const checkbox = element.querySelectorAll('input');
+
+ expect(checkbox[0].checked).toEqual(true);
+ expect(checkbox[1].checked).toEqual(true);
+ });
+
+ test('should uncheck checkbox', () => {
+ const filter1 = Filter.fromString('report_compliance_levels=yni');
+ const filter2 = Filter.fromString('report_compliance_levels=yn');
+ const handleChange = testing.fn();
+ const handleRemove = testing.fn();
+ const {element, rerender} = render(
+ ,
+ );
+
+ const checkbox = element.querySelectorAll('input');
+
+ expect(checkbox[0].checked).toEqual(true);
+ expect(checkbox[1].checked).toEqual(true);
+ expect(checkbox[1].checked).toEqual(true);
+
+ rerender(
+ ,
+ );
+
+ expect(checkbox[0].checked).toEqual(true);
+ expect(checkbox[1].checked).toEqual(true);
+ expect(checkbox[2].checked).toEqual(false);
+ });
+
+ test('should be unchecked by default', () => {
+ const filter = Filter.fromString();
+ const handleChange = testing.fn();
+ const handleRemove = testing.fn();
+ const {element} = render(
+ ,
+ );
+
+ const checkbox = element.querySelectorAll('input');
+
+ expect(checkbox[0].checked).toEqual(false);
+ expect(checkbox[1].checked).toEqual(false);
+ expect(checkbox[2].checked).toEqual(false);
+ expect(checkbox[3].checked).toEqual(false);
+ });
+
+ test('should call remove handler', () => {
+ const filter = Filter.fromString('report_compliance_levels=y');
+ const handleChange = testing.fn();
+ const handleRemove = testing.fn();
+ const {element} = render(
+ ,
+ );
+
+ const checkbox = element.querySelectorAll('input');
+ expect(checkbox[0].checked).toEqual(true);
+
+ fireEvent.click(checkbox[0]);
+
+ expect(handleRemove).toHaveBeenCalled();
+ });
+});
+
+describe('ComplianceLevelsFilterGroup audit results tests', () => {
+ test('should call change handler', () => {
+ const filter = Filter.fromString('compliance_levels=');
+ const handleChange = testing.fn();
+ const handleRemove = testing.fn();
+ const {element} = render(
+ ,
+ );
+
+ const checkbox = element.querySelectorAll('input');
+ fireEvent.click(checkbox[0]);
+
+ expect(handleChange).toHaveBeenCalled();
+ expect(handleChange).toHaveBeenCalledWith('y', 'compliance_levels');
+ });
+
+ test('should check checkbox', () => {
+ const filter = Filter.fromString('compliance_levels=yn');
+ const handleChange = testing.fn();
+ const handleRemove = testing.fn();
+ const {element} = render(
+ ,
+ );
+
+ const checkbox = element.querySelectorAll('input');
+
+ expect(checkbox[0].checked).toEqual(true);
+ expect(checkbox[1].checked).toEqual(true);
+ });
+
+ test('should uncheck checkbox', () => {
+ const filter1 = Filter.fromString('compliance_levels=yni');
+ const filter2 = Filter.fromString('compliance_levels=yn');
+ const handleChange = testing.fn();
+ const handleRemove = testing.fn();
+ const {element, rerender} = render(
+ ,
+ );
+
+ const checkbox = element.querySelectorAll('input');
+
+ expect(checkbox[0].checked).toEqual(true);
+ expect(checkbox[1].checked).toEqual(true);
+ expect(checkbox[1].checked).toEqual(true);
+
+ rerender(
+ ,
+ );
+
+ expect(checkbox[0].checked).toEqual(true);
+ expect(checkbox[1].checked).toEqual(true);
+ expect(checkbox[2].checked).toEqual(false);
+ });
+
+ test('should be unchecked by default', () => {
+ const filter = Filter.fromString();
+ const handleChange = testing.fn();
+ const handleRemove = testing.fn();
+ const {element} = render(
+ ,
+ );
+
+ const checkbox = element.querySelectorAll('input');
+
+ expect(checkbox[0].checked).toEqual(false);
+ expect(checkbox[1].checked).toEqual(false);
+ expect(checkbox[2].checked).toEqual(false);
+ expect(checkbox[3].checked).toEqual(false);
+ });
+
+ test('should call remove handler', () => {
+ const filter = Filter.fromString('compliance_levels=y');
+ const handleChange = testing.fn();
+ const handleRemove = testing.fn();
+ const {element} = render(
+ ,
+ );
+
+ const checkbox = element.querySelectorAll('input');
+ expect(checkbox[0].checked).toEqual(true);
+
+ fireEvent.click(checkbox[0]);
+
+ expect(handleRemove).toHaveBeenCalled();
+ });
+});
diff --git a/src/web/components/powerfilter/compliancelevelsgroup.jsx b/src/web/components/powerfilter/compliancelevelsgroup.jsx
new file mode 100644
index 0000000000..272b4882d6
--- /dev/null
+++ b/src/web/components/powerfilter/compliancelevelsgroup.jsx
@@ -0,0 +1,105 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+
+import React from 'react';
+
+import useTranslation from 'web/hooks/useTranslation';
+
+import {isDefined} from 'gmp/utils/identity';
+
+import PropTypes from 'web/utils/proptypes';
+
+import Checkbox from 'web/components/form/checkbox';
+import FormGroup from 'web/components/form/formgroup';
+
+import IconDivider from 'web/components/layout/icondivider';
+
+import ComplianceStateLabels from 'web/components/label/compliancestate';
+
+const ComplianceLevelsFilterGroup = ({
+ filter,
+ onChange,
+ onRemove,
+ isResult = false,
+}) => {
+ const [_] = useTranslation();
+
+ const handleComplianceChange = (value, level) => {
+ const filterName = isResult
+ ? 'compliance_levels'
+ : 'report_compliance_levels';
+
+ let compliance = filter.get(filterName);
+
+ if (!compliance) {
+ compliance = '';
+ }
+
+ if (value && !compliance.includes(level)) {
+ compliance += level;
+ onChange(compliance, filterName);
+ } else if (!value && compliance.includes(level)) {
+ compliance = compliance.replace(level, '');
+
+ if (compliance.trim().length === 0) {
+ onRemove();
+ } else {
+ onChange(compliance, filterName);
+ }
+ }
+ };
+
+ let complianceLevels = filter.get(
+ isResult ? 'compliance_levels' : 'report_compliance_levels',
+ );
+
+ if (!isDefined(complianceLevels)) {
+ complianceLevels = '';
+ }
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+ComplianceLevelsFilterGroup.propTypes = {
+ filter: PropTypes.filter.isRequired,
+ isResult: PropTypes.bool,
+ onChange: PropTypes.func.isRequired,
+ onRemove: PropTypes.func.isRequired,
+};
+
+export default ComplianceLevelsFilterGroup;
\ No newline at end of file
diff --git a/src/web/pages/audits/__tests__/listpage.jsx b/src/web/pages/audits/__tests__/listpage.jsx
index 574fcf8053..4b9b7942a1 100644
--- a/src/web/pages/audits/__tests__/listpage.jsx
+++ b/src/web/pages/audits/__tests__/listpage.jsx
@@ -200,15 +200,15 @@ describe('AuditPage tests', () => {
const icons = getAllByTestId('svg-icon');
await act(async () => {
- expect(icons[19]).toHaveAttribute(
+ expect(icons[20]).toHaveAttribute(
'title',
'Move page contents to trashcan',
);
- fireEvent.click(icons[19]);
+ fireEvent.click(icons[20]);
expect(deleteByFilter).toHaveBeenCalled();
- expect(icons[20]).toHaveAttribute('title', 'Export page contents');
- fireEvent.click(icons[20]);
+ expect(icons[21]).toHaveAttribute('title', 'Export page contents');
+ fireEvent.click(icons[21]);
expect(exportByFilter).toHaveBeenCalled();
});
});
diff --git a/src/web/pages/audits/__tests__/row.jsx b/src/web/pages/audits/__tests__/row.jsx
index be31ea28e5..d4599b2ac1 100644
--- a/src/web/pages/audits/__tests__/row.jsx
+++ b/src/web/pages/audits/__tests__/row.jsx
@@ -21,7 +21,10 @@ import Row from '../row';
setLocale('en');
const gmp = {settings: {}};
-const caps = new Capabilities(['everything']);
+const featureList = [
+ {name: 'COMPLIANCE_REPORTS', _enabled: 0},
+];
+const caps = new Capabilities(['everything'], featureList);
const lastReport = {
report: {
@@ -760,3 +763,104 @@ describe('Audit Row tests', () => {
console.warn = consoleError;
});
+
+describe('Audit Row tests - compliance reports enabled', () => {
+ // deactivate console.error for tests
+ // to make it possible to test a row without a table
+ console.error = () => {};
+ const featureList = [
+ {name: 'COMPLIANCE_REPORTS', _enabled: 1},
+ ];
+ const caps = new Capabilities(['everything'], featureList);
+
+ test('should render', () => {
+ const audit = Audit.fromElement({
+ _id: '314',
+ owner: {name: 'username'},
+ name: 'foo',
+ comment: 'bar',
+ status: AUDIT_STATUS.done,
+ alterable: '0',
+ last_report: lastReport,
+ permissions: {permission: [{name: 'everything'}]},
+ target: {_id: '5678', name: 'target'},
+ usage_type: 'audit',
+ });
+
+ const handleAuditClone = testing.fn();
+ const handleAuditDelete = testing.fn();
+ const handleAuditDownload = testing.fn();
+ const handleAuditEdit = testing.fn();
+ const handleAuditResume = testing.fn();
+ const handleAuditStart = testing.fn();
+ const handleAuditStop = testing.fn();
+ const handleReportDownload = testing.fn();
+ const handleToggleDetailsClick = testing.fn();
+
+ const {render, store} = rendererWith({
+ gmp,
+ capabilities: caps,
+ store: true,
+ router: true,
+ });
+
+ store.dispatch(setTimezone('CET'));
+ store.dispatch(setUsername('username'));
+
+ const {baseElement, getAllByTestId} = render(
+
,
+ );
+
+ expect(baseElement).toBeVisible();
+
+ // Name
+ expect(baseElement).toHaveTextContent('foo');
+ expect(baseElement).toHaveTextContent('(bar)');
+
+ // Status
+ const bars = getAllByTestId('progressbar-box');
+
+ expect(bars[0]).toHaveAttribute('title', AUDIT_STATUS.done);
+ expect(bars[0]).toHaveTextContent(AUDIT_STATUS.done);
+
+ const detailsLinks = getAllByTestId('details-link');
+
+ expect(detailsLinks[0]).toHaveTextContent('Done');
+ expect(detailsLinks[0]).toHaveAttribute('href', '/auditreport/1234');
+
+ // Report
+ expect(detailsLinks[1]).toHaveTextContent('Wed, Jul 10, 2019 2:51 PM CEST');
+ expect(detailsLinks[1]).toHaveAttribute('href', '/auditreport/1234');
+
+ // Compliance Status
+ expect(bars[1]).toHaveAttribute('title', '50%');
+ expect(bars[1]).toHaveTextContent('50%');
+
+ // Actions
+ const icons = getAllByTestId('svg-icon');
+
+ expect(icons[0]).toHaveAttribute('title', 'Start');
+ expect(icons[1]).toHaveAttribute('title', 'Audit is not stopped');
+ expect(icons[2]).toHaveAttribute('title', 'Move Audit to trashcan');
+ expect(icons[3]).toHaveAttribute('title', 'Edit Audit');
+ expect(icons[4]).toHaveAttribute('title', 'Clone Audit');
+ expect(icons[5]).toHaveAttribute('title', 'Export Audit');
+ expect(icons[6]).toHaveAttribute(
+ 'title',
+ 'Download Greenbone Compliance Report',
+ );
+ });
+});
\ No newline at end of file
diff --git a/src/web/pages/audits/__tests__/table.jsx b/src/web/pages/audits/__tests__/table.jsx
index 2fe481bc42..89748c8423 100644
--- a/src/web/pages/audits/__tests__/table.jsx
+++ b/src/web/pages/audits/__tests__/table.jsx
@@ -137,7 +137,7 @@ describe('Audits table tests', () => {
expect(header[0]).toHaveTextContent('Name');
expect(header[1]).toHaveTextContent('Status');
expect(header[2]).toHaveTextContent('Report');
- expect(header[3]).toHaveTextContent('Compliance Status');
+ expect(header[3]).toHaveTextContent('Compliance Percent');
expect(header[4]).toHaveTextContent('Actions');
});
diff --git a/src/web/pages/audits/row.jsx b/src/web/pages/audits/row.jsx
index 7eca63a339..d8f46e3b77 100644
--- a/src/web/pages/audits/row.jsx
+++ b/src/web/pages/audits/row.jsx
@@ -37,6 +37,22 @@ import {GREENBONE_SENSOR_SCANNER_TYPE} from 'gmp/models/scanner';
import ComplianceStatusBar from 'web/components/bar/compliancestatusbar';
import {renderReport} from 'web/pages/tasks/row';
+import DateTime from 'web/components/date/datetime';
+import DetailsLink from 'web/components/link/detailslink';
+import useCapabilities from 'web/hooks/useCapabilities';
+
+const renderAuditReport = (report, links) => {
+ if (!isDefined(report)) {
+ return null;
+ }
+ return (
+
+
+
+
+
+ );
+};
const getComplianceStatus = report => {
if (!isDefined(report)) {
@@ -69,8 +85,8 @@ const Row = ({
...props
}) => {
const {scanner, observers} = entity;
-
const obs = [];
+ const caps = useCapabilities();
if (isDefined(observers)) {
if (isDefined(observers.user)) {
@@ -129,9 +145,17 @@ const Row = ({
{entity.comment && ({entity.comment}) }
-
+
+
+
+ {caps.featureEnabled('COMPLIANCE_REPORTS')
+ ? renderAuditReport(entity.last_report, links)
+ : renderReport(entity.last_report, links)
+ }
- {renderReport(entity.last_report, links)}
{isDefined(entity.last_report) && (
-
+
{actionsColumn}
@@ -79,7 +79,7 @@ export default createEntitiesTable({
footer: createEntitiesFooter({
span: 5,
trash: true,
- tags: false,
+ tags: true,
download: 'audits.xml',
}),
});
diff --git a/src/web/pages/filters/component.jsx b/src/web/pages/filters/component.jsx
index 3b473ab82e..1330c349c4 100644
--- a/src/web/pages/filters/component.jsx
+++ b/src/web/pages/filters/component.jsx
@@ -75,8 +75,13 @@ class FilterComponent extends React.Component {
openFilterDialog(filter) {
const {capabilities} = this.props;
-
- let types = FILTER_OPTIONS.filter(option =>
+ const filterOptions = [
+ ...(capabilities.featureEnabled('COMPLIANCE_REPORTS')
+ ? [['audit_report', _l('Audit Report')]]
+ : []),
+ ...FILTER_OPTIONS
+ ];
+ let types = filterOptions.filter(option =>
filter_types(capabilities, option[0]),
);
diff --git a/src/web/pages/policies/__tests__/listpage.jsx b/src/web/pages/policies/__tests__/listpage.jsx
index 5ad6df42d8..dd95e816c7 100644
--- a/src/web/pages/policies/__tests__/listpage.jsx
+++ b/src/web/pages/policies/__tests__/listpage.jsx
@@ -178,15 +178,15 @@ describe('PoliciesPage tests', () => {
const icons = getAllByTestId('svg-icon');
await act(async () => {
- expect(icons[18]).toHaveAttribute(
+ expect(icons[19]).toHaveAttribute(
'title',
'Move page contents to trashcan',
);
- fireEvent.click(icons[18]);
+ fireEvent.click(icons[19]);
expect(deleteByFilter).toHaveBeenCalled();
- expect(icons[19]).toHaveAttribute('title', 'Export page contents');
- fireEvent.click(icons[19]);
+ expect(icons[20]).toHaveAttribute('title', 'Export page contents');
+ fireEvent.click(icons[20]);
expect(exportByFilter).toHaveBeenCalled();
});
});
diff --git a/src/web/pages/policies/table.jsx b/src/web/pages/policies/table.jsx
index d1611fafea..92baddf16b 100644
--- a/src/web/pages/policies/table.jsx
+++ b/src/web/pages/policies/table.jsx
@@ -29,7 +29,7 @@ const PoliciesTable = createEntitiesTable({
download: 'policies.xml',
span: 2,
trash: true,
- tags: false,
+ tags: true,
}),
});
diff --git a/src/web/pages/reports/__mocks__/mockauditdeltareport.jsx b/src/web/pages/reports/__mocks__/mockauditdeltareport.jsx
new file mode 100644
index 0000000000..2e9507c304
--- /dev/null
+++ b/src/web/pages/reports/__mocks__/mockauditdeltareport.jsx
@@ -0,0 +1,388 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import AuditReport from 'gmp/models/auditreport';
+
+// Task
+const task1 = {
+ _id: '314',
+ name: 'foo',
+ comment: 'bar',
+ target: {_id: '159'},
+};
+
+// Results
+const result1 = {
+ _id: '101',
+ name: 'Result 1',
+ owner: {name: 'admin'},
+ comment: 'Comment 1',
+ creation_time: '2019-06-03T11:06:31Z',
+ modification_time: '2019-06-03T11:06:31Z',
+ host: {__text: '123.456.78.910'},
+ port: '80/tcp',
+ nvt: {
+ _oid: '201',
+ type: 'nvt',
+ name: 'nvt1',
+ tags: 'solution_type=Mitigation',
+ refs: {ref: [{_type: 'cve', _id: 'CVE-2019-1234'}]},
+ },
+ threat: 'High',
+ severity: 10.0,
+ qod: {value: 80},
+ detection: {
+ result: {
+ details: {
+ detail: [{name: 'product', value: 'cpe:/a: 123'}],
+ },
+ },
+ },
+ compliance: 'yes',
+ delta: 'same',
+};
+
+const result2 = {
+ _id: '102',
+ name: 'Result 2',
+ owner: {name: 'admin'},
+ comment: 'Comment 2',
+ creation_time: '2019-06-03T11:06:31Z',
+ modification_time: '2019-06-03T11:06:31Z',
+ host: {__text: '109.876.54.321'},
+ port: '80/tcp',
+ nvt: {
+ _oid: '202',
+ type: 'nvt',
+ name: 'nvt2',
+ tags: 'solution_type=VendorFix',
+ refs: {ref: [{_type: 'cve', _id: 'CVE-2019-5678'}]},
+ },
+ threat: 'Medium',
+ severity: 5.0,
+ qod: {value: 70},
+ detection: {
+ result: {
+ details: {
+ detail: [{name: 'product', value: 'cpe:/a: 456'}],
+ },
+ },
+ },
+ compliance: 'incomplete',
+ delta: 'same',
+};
+
+const result3 = {
+ _id: '103',
+ name: 'Result 3',
+ owner: {name: 'admin'},
+ comment: 'Comment 3',
+ creation_time: '2019-06-03T11:06:31Z',
+ modification_time: '2019-06-03T11:06:31Z',
+ host: {__text: '109.876.54.321'},
+ port: '80/tcp',
+ nvt: {
+ _oid: '201',
+ type: 'nvt',
+ name: 'nvt1',
+ tags: 'solution_type=Mitigation',
+ refs: {ref: [{_type: 'cve', _id: 'CVE-2019-1234'}]},
+ solution: {
+ _type: 'Mitigation',
+ },
+ },
+ threat: 'Medium',
+ severity: 5.0,
+ qod: {value: 80},
+ compliance: 'no',
+ delta: 'same',
+};
+
+// Hosts
+export const host1 = {
+ ip: '123.456.78.910',
+ asset: {_asset_id: '123'},
+ start: '2019-06-03T11:00:22Z',
+ end: '2019-06-03T11:15:14Z',
+ port_count: {page: 10},
+ compliance_count: {
+ page: 50,
+ incomplete: {page: 14},
+ no: {page: 30},
+ undefined: {page: 5},
+ yes: {page: 7},
+ },
+ host_compliance: 'no',
+ detail: [
+ {name: 'best_os_cpe', value: 'cpe:/foo/bar'},
+ {name: 'best_os_txt', value: 'Foo OS'},
+ {name: 'App', value: 'cpe:/a: 123'},
+ {name: 'App', value: 'cpe:/a: 789'},
+ {name: 'App', value: 'cpe:/a: 101'},
+ {name: 'cpe:/a: 123', value: 'ab'},
+ {name: 'cpe:/a: 123', value: 'cd'},
+ {name: 'traceroute', value: '1.1.1.1,2.2.2.2,3.3.3.3'},
+ {name: 'hostname', value: 'foo.bar'},
+ {name: 'Auth-SSH-Success'},
+ {name: 'SSLInfo', value: '1234::123456'},
+ {
+ name: 'SSLDetails:123456',
+ value:
+ 'issuer:CN=foo|serial:abcd|notBefore:20190130T201714|notAfter:20190801T201714',
+ },
+ {
+ name: 'Closed CVE',
+ value: 'CVE-2000-1234',
+ source: {
+ type: 'openvas',
+ name: '201',
+ description: 'This is a description',
+ },
+ extra: '10.0',
+ },
+ ],
+};
+
+export const host2 = {
+ ip: '109.876.54.321',
+ start: '2019-06-03T11:15:14Z',
+ end: '2019-06-03T11:31:23Z',
+ port_count: {page: 15},
+ compliance_count: {
+ page: 40,
+ incomplete: {page: 5},
+ no: {page: 0},
+ undefined: {page: 6},
+ yes: {page: 17},
+ },
+ host_compliance: 'incomplete',
+ detail: [
+ {name: 'best_os_cpe', value: 'cpe:/lorem/ipsum'},
+ {name: 'best_os_txt', value: 'Lorem OS'},
+ {name: 'App', value: 'cpe:/a: 123'},
+ {name: 'App', value: 'cpe:/a: 456'},
+ {name: 'traceroute', value: '1.1.1.1,2.2.2.2'},
+ {name: 'hostname', value: 'lorem.ipsum'},
+ {name: 'Auth-SSH-Failure'},
+ {name: 'SSLInfo', value: '5678::654321'},
+ {
+ name: 'SSLDetails:654321',
+ value:
+ 'issuer:CN=bar|serial:dcba|notBefore:20190330T201714|notAfter:20191001T201714',
+ },
+ {
+ name: 'Closed CVE',
+ value: 'CVE-2000-5678',
+ source: {
+ type: 'openvas',
+ name: '202',
+ description: 'This is another description',
+ },
+ extra: '5.0',
+ },
+ ],
+};
+
+// Hosts
+export const host3 = {
+ ip: '123.456.78.810',
+ asset: {_asset_id: '123'},
+ start: '2019-06-03T11:00:22Z',
+ end: '2019-06-03T11:15:14Z',
+ port_count: {page: 10},
+ compliance_count: {
+ page: 20,
+ incomplete: {page: 0},
+ no: {page: 0},
+ undefined: {page: 0},
+ yes: {page: 20},
+ },
+ host_compliance: 'yes',
+ detail: [
+ {name: 'best_os_cpe', value: 'cpe:/foo/bar'},
+ {name: 'best_os_txt', value: 'Foo OS'},
+ {name: 'App', value: 'cpe:/a: 123'},
+ {name: 'App', value: 'cpe:/a: 789'},
+ {name: 'App', value: 'cpe:/a: 101'},
+ {name: 'cpe:/a: 123', value: 'ab'},
+ {name: 'cpe:/a: 123', value: 'cd'},
+ {name: 'traceroute', value: '1.1.1.1,2.2.2.2,3.3.3.3'},
+ {name: 'hostname', value: 'foo.bar'},
+ {name: 'Auth-SSH-Success'},
+ {name: 'SSLInfo', value: '1234::123456'},
+ {
+ name: 'SSLDetails:123456',
+ value:
+ 'issuer:CN=foo|serial:abcd|notBefore:20190130T201714|notAfter:20190801T201714',
+ },
+ {
+ name: 'Closed CVE',
+ value: 'CVE-2000-1234',
+ source: {
+ type: 'openvas',
+ name: '201',
+ description: 'This is a description',
+ },
+ extra: '10.0',
+ },
+ ],
+};
+
+// Ports
+const port1 = {
+ host: '1.1.1.1',
+ __text: '123/tcp',
+ severity: 10.0,
+ threat: 'High',
+};
+const port2 = {
+ host: '2.2.2.2',
+ __text: '456/tcp',
+ severity: 5.0,
+ threat: 'Medium',
+};
+
+// Errors
+const error1 = {
+ host: {
+ __text: '123.456.78.910',
+ asset: {_asset_id: '123'},
+ },
+ port: '123/tcp',
+ description: 'This is an error.',
+ nvt: {
+ _oid: '314',
+ name: 'NVT1',
+ },
+};
+
+const error2 = {
+ host: {
+ __text: '109.876.54.321',
+ asset: {_asset_id: '109'},
+ },
+ port: '456/tcp',
+ description: 'This is another error.',
+ nvt: {
+ _oid: '159',
+ name: 'NVT2',
+ },
+};
+
+// TLS certificates
+const tlsCertificate1 = {
+ name: '57610B6A3C73866870678E638C7825743145B24',
+ certificate: {
+ __text: '66870678E638C7825743145B247554E0D92C94',
+ _format: 'DER',
+ },
+ data: 'MIIDSzCCAjOgAwIBAgIJALScVB/zqOLZMA0GCSqGSIb3DQ',
+ sha256_fingerprint: '57610B6A3C73866870678E638C78',
+ md5_fingerprint: 'fa:a9:9d:f2:28:cc:2c:c0:80:16',
+ activation_time: '2019-08-10T12:51:27Z',
+ expiration_time: '2019-09-10T12:51:27Z',
+ valid: true,
+ subject_dn: 'CN=LoremIpsumSubject1 C=Dolor',
+ issuer_dn: 'CN=LoremIpsumIssuer1 C=Dolor',
+ serial: '00B49C541FF5A8E1D9',
+ host: {ip: '192.168.9.90', hostname: 'foo.bar'},
+ ports: {port: ['4021', '4023']},
+};
+
+const tlsCertificate2 = {
+ name: 'C137E9D559CC95ED130011FE4012DE56CAE2F8',
+ certificate: {
+ __text: 'MIICGTCCAYICCQDDh8Msu4YfXDANBgkqhkiG9w0B',
+ _format: 'DER',
+ },
+ sha256_fingerprint: 'C137E9D559CC95ED130011FE4012',
+ md5_fingerprint: '63:70:d6:65:17:32:01:66:9e:7d:c4',
+ activation_time: 'unlimited',
+ expiration_time: 'undefined',
+ valid: false,
+ subject_dn: 'CN=LoremIpsumSubject2 C=Dolor',
+ issuer_dn: 'CN=LoremIpsumIssuer2 C=Dolor',
+ serial: '00C387C32CBB861F5C',
+ host: {ip: '191.164.9.93', hostname: ''},
+ ports: {port: ['8445', '5061']},
+};
+
+export const getMockAuditDeltaReport = () => {
+ const report = {
+ _type: 'delta',
+ _id: '1234',
+ delta: {
+ report: {
+ _id: '5678',
+ scan_run_status: 'Done',
+ scan_start: '2019-05-20T12:00:15Z',
+ scan_end: '2019-05-20T12:30:46Z',
+ },
+ },
+ scan_run_status: 'Done',
+ scan_start: '2019-06-03T11:00:22Z',
+ scan_end: '2019-06-03T11:31:23Z',
+ timestamp: '2019-06-03T11:00:22Z',
+ timezone: 'UTC',
+ timezone_abbrev: 'UTC',
+ task: task1,
+ closed_cves: {count: 0},
+ vulns: {count: 0},
+ apps: {count: 4},
+ os: {count: 2},
+ ssl_certs: {count: 2},
+ compliance: {filtered: 'no', full: 'no'},
+ compliance_count: {
+ full: 3,
+ filtered: 2,
+ incomplete: {
+ full: 5,
+ filtered: 1,
+ },
+ yes: {
+ full: 2,
+ filtered: 3,
+ },
+ no: {
+ full: 1,
+ filtered: 2,
+ },
+ undefined: {
+ full: 2,
+ filtered: 0,
+ },
+ },
+ results: {result: [result1, result2, result3]},
+ hosts: {count: 3},
+ host: [host1, host2, host3],
+ tls_certificates: {
+ tls_certificate: [tlsCertificate1, tlsCertificate2],
+ },
+ ports: {
+ count: 2,
+ port: [port1, port2],
+ },
+ errors: {
+ count: 2,
+ error: [error1, error2],
+ },
+ };
+
+ const entity = AuditReport.fromElement({
+ report: report,
+ creation_time: '2019-06-02T12:00:22Z',
+ modification_time: '2019-06-03T11:00:22Z',
+ name: '2019-06-03T11:00:22Z',
+ owner: {name: 'admin'},
+ _id: '1234',
+ });
+
+ return {
+ entity,
+ report: entity.report,
+ results: entity.report.results,
+ task: entity.report.task,
+ };
+};
diff --git a/src/web/pages/reports/__mocks__/mockauditreport.jsx b/src/web/pages/reports/__mocks__/mockauditreport.jsx
new file mode 100644
index 0000000000..a723ab74bd
--- /dev/null
+++ b/src/web/pages/reports/__mocks__/mockauditreport.jsx
@@ -0,0 +1,370 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import AuditReport from 'gmp/models/auditreport';
+
+// Task
+const task1 = {
+ _id: '314',
+ name: 'foo',
+ comment: 'bar',
+ target: {_id: '159'},
+};
+
+// Results
+const result1 = {
+ _id: '101',
+ name: 'Result 1',
+ owner: {name: 'admin'},
+ comment: 'Comment 1',
+ creation_time: '2019-06-03T11:06:31Z',
+ modification_time: '2019-06-03T11:06:31Z',
+ host: {__text: '123.456.78.910'},
+ port: '80/tcp',
+ nvt: {
+ _oid: '201',
+ type: 'nvt',
+ name: 'nvt1',
+ tags: 'solution_type=Mitigation',
+ refs: {ref: [{_type: 'cve', _id: 'CVE-2019-1234'}]},
+ },
+ threat: 'High',
+ severity: 10.0,
+ qod: {value: 80},
+ detection: {
+ result: {
+ details: {
+ detail: [{name: 'product', value: 'cpe:/a: 123'}],
+ },
+ },
+ },
+ compliance: 'yes',
+};
+
+const result2 = {
+ _id: '102',
+ name: 'Result 2',
+ owner: {name: 'admin'},
+ comment: 'Comment 2',
+ creation_time: '2019-06-03T11:06:31Z',
+ modification_time: '2019-06-03T11:06:31Z',
+ host: {__text: '109.876.54.321'},
+ port: '80/tcp',
+ nvt: {
+ _oid: '202',
+ type: 'nvt',
+ name: 'nvt2',
+ tags: 'solution_type=VendorFix',
+ refs: {ref: [{_type: 'cve', _id: 'CVE-2019-5678'}]},
+ },
+ threat: 'Medium',
+ severity: 5.0,
+ qod: {value: 70},
+ detection: {
+ result: {
+ details: {
+ detail: [{name: 'product', value: 'cpe:/a: 456'}],
+ },
+ },
+ },
+ compliance: 'incomplete',
+};
+
+const result3 = {
+ _id: '103',
+ name: 'Result 3',
+ owner: {name: 'admin'},
+ comment: 'Comment 3',
+ creation_time: '2019-06-03T11:06:31Z',
+ modification_time: '2019-06-03T11:06:31Z',
+ host: {__text: '109.876.54.321'},
+ port: '80/tcp',
+ nvt: {
+ _oid: '201',
+ type: 'nvt',
+ name: 'nvt1',
+ tags: 'solution_type=Mitigation',
+ refs: {ref: [{_type: 'cve', _id: 'CVE-2019-1234'}]},
+ solution: {
+ _type: 'Mitigation',
+ },
+ },
+ threat: 'Medium',
+ severity: 5.0,
+ qod: {value: 80},
+ compliance: 'no',
+};
+
+// Hosts
+export const host1 = {
+ ip: '123.456.78.910',
+ asset: {_asset_id: '123'},
+ start: '2019-06-03T11:00:22Z',
+ end: '2019-06-03T11:15:14Z',
+ port_count: {page: 10},
+ compliance_count: {
+ page: 50,
+ incomplete: {page: 14},
+ no: {page: 30},
+ undefined: {page: 5},
+ yes: {page: 7},
+ },
+ host_compliance: 'no',
+ detail: [
+ {name: 'best_os_cpe', value: 'cpe:/foo/bar'},
+ {name: 'best_os_txt', value: 'Foo OS'},
+ {name: 'App', value: 'cpe:/a: 123'},
+ {name: 'App', value: 'cpe:/a: 789'},
+ {name: 'App', value: 'cpe:/a: 101'},
+ {name: 'cpe:/a: 123', value: 'ab'},
+ {name: 'cpe:/a: 123', value: 'cd'},
+ {name: 'traceroute', value: '1.1.1.1,2.2.2.2,3.3.3.3'},
+ {name: 'hostname', value: 'foo.bar'},
+ {name: 'Auth-SSH-Success'},
+ {name: 'SSLInfo', value: '1234::123456'},
+ {
+ name: 'SSLDetails:123456',
+ value:
+ 'issuer:CN=foo|serial:abcd|notBefore:20190130T201714|notAfter:20190801T201714',
+ },
+ {
+ name: 'Closed CVE',
+ value: 'CVE-2000-1234',
+ source: {
+ type: 'openvas',
+ name: '201',
+ description: 'This is a description',
+ },
+ extra: '10.0',
+ },
+ ],
+};
+
+export const host2 = {
+ ip: '109.876.54.321',
+ start: '2019-06-03T11:15:14Z',
+ end: '2019-06-03T11:31:23Z',
+ port_count: {page: 15},
+ compliance_count: {
+ page: 40,
+ incomplete: {page: 5},
+ no: {page: 0},
+ undefined: {page: 6},
+ yes: {page: 17},
+ },
+ host_compliance: 'incomplete',
+ detail: [
+ {name: 'best_os_cpe', value: 'cpe:/lorem/ipsum'},
+ {name: 'best_os_txt', value: 'Lorem OS'},
+ {name: 'App', value: 'cpe:/a: 123'},
+ {name: 'App', value: 'cpe:/a: 456'},
+ {name: 'traceroute', value: '1.1.1.1,2.2.2.2'},
+ {name: 'hostname', value: 'lorem.ipsum'},
+ {name: 'Auth-SSH-Failure'},
+ {name: 'SSLInfo', value: '5678::654321'},
+ {
+ name: 'SSLDetails:654321',
+ value:
+ 'issuer:CN=bar|serial:dcba|notBefore:20190330T201714|notAfter:20191001T201714',
+ },
+ {
+ name: 'Closed CVE',
+ value: 'CVE-2000-5678',
+ source: {
+ type: 'openvas',
+ name: '202',
+ description: 'This is another description',
+ },
+ extra: '5.0',
+ },
+ ],
+};
+
+// Hosts
+export const host3 = {
+ ip: '123.456.78.810',
+ asset: {_asset_id: '123'},
+ start: '2019-06-03T11:00:22Z',
+ end: '2019-06-03T11:15:14Z',
+ port_count: {page: 10},
+ compliance_count: {
+ page: 20,
+ incomplete: {page: 0},
+ no: {page: 0},
+ undefined: {page: 0},
+ yes: {page: 20},
+ },
+ host_compliance: 'yes',
+ detail: [
+ {name: 'best_os_cpe', value: 'cpe:/foo/bar'},
+ {name: 'best_os_txt', value: 'Foo OS'},
+ {name: 'App', value: 'cpe:/a: 123'},
+ {name: 'App', value: 'cpe:/a: 789'},
+ {name: 'App', value: 'cpe:/a: 101'},
+ {name: 'cpe:/a: 123', value: 'ab'},
+ {name: 'cpe:/a: 123', value: 'cd'},
+ {name: 'traceroute', value: '1.1.1.1,2.2.2.2,3.3.3.3'},
+ {name: 'hostname', value: 'foo.bar'},
+ {name: 'Auth-SSH-Success'},
+ {name: 'SSLInfo', value: '1234::123456'},
+ {
+ name: 'SSLDetails:123456',
+ value:
+ 'issuer:CN=foo|serial:abcd|notBefore:20190130T201714|notAfter:20190801T201714',
+ },
+ {
+ name: 'Closed CVE',
+ value: 'CVE-2000-1234',
+ source: {
+ type: 'openvas',
+ name: '201',
+ description: 'This is a description',
+ },
+ extra: '10.0',
+ },
+ ],
+};
+
+// Ports
+const port1 = {
+ host: '1.1.1.1',
+ __text: '123/tcp',
+ severity: 10.0,
+ threat: 'High',
+};
+const port2 = {
+ host: '2.2.2.2',
+ __text: '456/tcp',
+ severity: 5.0,
+ threat: 'Medium',
+};
+
+// Errors
+const error1 = {
+ host: {
+ __text: '123.456.78.910',
+ asset: {_asset_id: '123'},
+ },
+ port: '123/tcp',
+ description: 'This is an error.',
+ nvt: {
+ _oid: '314',
+ name: 'NVT1',
+ },
+};
+
+const error2 = {
+ host: {
+ __text: '109.876.54.321',
+ asset: {_asset_id: '109'},
+ },
+ port: '456/tcp',
+ description: 'This is another error.',
+ nvt: {
+ _oid: '159',
+ name: 'NVT2',
+ },
+};
+
+// TLS certificates
+const tlsCertificate1 = {
+ name: '57610B6A3C73866870678E638C7825743145B24',
+ certificate: {
+ __text: '66870678E638C7825743145B247554E0D92C94',
+ _format: 'DER',
+ },
+ data: 'MIIDSzCCAjOgAwIBAgIJALScVB/zqOLZMA0GCSqGSIb3DQ',
+ sha256_fingerprint: '57610B6A3C73866870678E638C78',
+ md5_fingerprint: 'fa:a9:9d:f2:28:cc:2c:c0:80:16',
+ activation_time: '2019-08-10T12:51:27Z',
+ expiration_time: '2019-09-10T12:51:27Z',
+ valid: true,
+ subject_dn: 'CN=LoremIpsumSubject1 C=Dolor',
+ issuer_dn: 'CN=LoremIpsumIssuer1 C=Dolor',
+ serial: '00B49C541FF5A8E1D9',
+ host: {ip: '192.168.9.90', hostname: 'foo.bar'},
+ ports: {port: ['4021', '4023']},
+};
+
+const tlsCertificate2 = {
+ name: 'C137E9D559CC95ED130011FE4012DE56CAE2F8',
+ certificate: {
+ __text: 'MIICGTCCAYICCQDDh8Msu4YfXDANBgkqhkiG9w0B',
+ _format: 'DER',
+ },
+ sha256_fingerprint: 'C137E9D559CC95ED130011FE4012',
+ md5_fingerprint: '63:70:d6:65:17:32:01:66:9e:7d:c4',
+ activation_time: 'unlimited',
+ expiration_time: 'undefined',
+ valid: false,
+ subject_dn: 'CN=LoremIpsumSubject2 C=Dolor',
+ issuer_dn: 'CN=LoremIpsumIssuer2 C=Dolor',
+ serial: '00C387C32CBB861F5C',
+ host: {ip: '191.164.9.93', hostname: ''},
+ ports: {port: ['8445', '5061']},
+};
+
+export const getMockAuditReport = () => {
+ const report = {
+ _id: '1234',
+ scan_run_status: 'Done',
+ scan_start: '2019-06-03T11:00:22Z',
+ scan_end: '2019-06-03T11:31:23Z',
+ timestamp: '2019-06-03T11:00:22Z',
+ timezone: 'UTC',
+ timezone_abbrev: 'UTC',
+ task: task1,
+ closed_cves: {count: 0},
+ vulns: {count: 0},
+ apps: {count: 4},
+ os: {count: 2},
+ ssl_certs: {count: 2},
+ compliance: {filtered: 'no', full: 'no'},
+ compliance_count: {
+ __text: 3,
+ full: 3,
+ filtered: 2,
+ yes: {full: 5, filtered: 3},
+ no: {full: 3, filtered: 2},
+ incomplete: {full: 2, filtered: 1},
+ undefined: {full: 0, filtered: 0},
+ },
+ results: {result: [result1, result2, result3]},
+ hosts: {count: 3},
+ host: [host1, host2, host3],
+ tls_certificates: {
+ tls_certificate: [tlsCertificate1, tlsCertificate2],
+ },
+ ports: {
+ count: 2,
+ port: [port1, port2],
+ },
+ errors: {
+ count: 2,
+ error: [error1, error2],
+ },
+ };
+
+ const entity = AuditReport.fromElement({
+ report: report,
+ creation_time: '2019-06-02T12:00:22Z',
+ modification_time: '2019-06-03T11:00:22Z',
+ name: '2019-06-03T11:00:22Z',
+ owner: {name: 'admin'},
+ _id: '1234',
+ task: task1,
+ });
+
+ return {
+ entity,
+ report: entity.report,
+ results: entity.report.results,
+ hosts: entity.report.hosts,
+ operatingsystems: entity.report.operatingSystems,
+ tlsCertificates: entity.report.tlsCertificates,
+ errors: entity.report.errors,
+ task: entity.report.task,
+ };
+};
diff --git a/src/web/pages/reports/__tests__/auditdeltadetailspage.jsx b/src/web/pages/reports/__tests__/auditdeltadetailspage.jsx
new file mode 100644
index 0000000000..fbd2849f14
--- /dev/null
+++ b/src/web/pages/reports/__tests__/auditdeltadetailspage.jsx
@@ -0,0 +1,377 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {describe, test, expect, testing} from '@gsa/testing';
+import React from 'react';
+
+import Capabilities from 'gmp/capabilities/capabilities';
+
+import Filter from 'gmp/models/filter';
+
+import {setTimezone, setUsername} from 'web/store/usersettings/actions';
+
+import {rendererWith} from 'web/utils/testing';
+
+import {getMockAuditDeltaReport} from 'web/pages/reports/__mocks__/mockauditdeltareport';
+
+import DeltaDetailsContent from 'web/pages/reports/deltadetailscontent';
+
+const filter = Filter.fromString(
+ 'apply_overrides=0 compliance_levels=ynui rows=10 min_qod=70 first=1 sort=compliant',
+);
+
+const filterWithName = Filter.fromElement({
+ term: 'apply_overrides=0 compliance_levels=ynui rows=10 min_qod=70 first=1 sort=compliant',
+ name: 'foo',
+ id: '123',
+});
+
+const caps = new Capabilities(['everything']);
+
+const manualUrl = 'test/';
+
+const currentSettings = testing.fn().mockResolvedValue({
+ foo: 'bar',
+});
+
+const getReportComposerDefaults = testing.fn().mockResolvedValue({
+ foo: 'bar',
+});
+
+describe('Audit Detla Report Details Content tests', () => {
+ test('should render Audit Delta Report Details Content', () => {
+ const onActivateTab = testing.fn();
+ const onAddToAssetsClick = testing.fn();
+ const onError = testing.fn();
+ const onFilterAddLogLevelClick = testing.fn();
+ const onFilterDecreaseMinQoDClick = testing.fn();
+ const onFilterChanged = testing.fn();
+ const onFilterCreated = testing.fn();
+ const onFilterEditClick = testing.fn();
+ const onFilterRemoveSeverityClick = testing.fn();
+ const onFilterResetClick = testing.fn();
+ const onFilterRemoveClick = testing.fn();
+ const onInteraction = testing.fn();
+ const onRemoveFromAssetsClick = testing.fn();
+ const onReportDownloadClick = testing.fn();
+ const showError = testing.fn();
+ const showErrorMessage = testing.fn();
+ const showSuccessMessage = testing.fn();
+ const onSortChange = testing.fn();
+ const onTagSuccess = testing.fn();
+ const onTargetEditClick = testing.fn();
+ const onTlsCertificateDownloadClick = testing.fn();
+
+ const sorting = {
+ errors: {sortField: 'error', sortReverse: true},
+ hosts: {sortField: 'compliant', sortReverse: true},
+ os: {sortField: 'compliant', sortReverse: true},
+ results: {sortField: 'compliant', sortReverse: true},
+ tlscerts: {sortField: 'dn', sortReverse: true},
+ };
+
+ const {entity} = getMockAuditDeltaReport();
+
+ const filters = [filterWithName];
+
+ const gmp = {
+ settings: {manualUrl, reportResultsThreshold: 10},
+ user: {currentSettings, getReportComposerDefaults},
+ };
+
+ const {render, store} = rendererWith({
+ gmp,
+ capabilities: caps,
+ router: true,
+ store: true,
+ });
+
+ store.dispatch(setTimezone('CET'));
+ store.dispatch(setUsername('admin'));
+
+ const {baseElement, getAllByTestId} = render(
+ ,
+ );
+
+ const icons = baseElement.querySelectorAll('svg');
+ const inputs = baseElement.querySelectorAll('input');
+ const links = baseElement.querySelectorAll('a');
+ const tableData = baseElement.querySelectorAll('td');
+ const selects = getAllByTestId('select-selected-value');
+ const bars = getAllByTestId('progressbar-box');
+
+ // Toolbar Icons
+ expect(icons.length).toEqual(14)
+
+ // Powerfilter
+ expect(inputs[0]).toHaveAttribute('name', 'userFilterString');
+ expect(selects[0]).toHaveAttribute('title', 'Loaded filter');
+ expect(selects[0]).toHaveTextContent('foo');
+
+ // Header
+ expect(baseElement).toHaveTextContent(
+ 'Report:Mon, Jun 3, 2019 1:00 PM CEST',
+ );
+ expect(bars[0]).toHaveAttribute('title', 'Done');
+ expect(bars[0]).toHaveTextContent('Done');
+ expect(baseElement).toHaveTextContent(
+ 'Created:Sun, Jun 2, 2019 2:00 PM CEST',
+ );
+ expect(baseElement).toHaveTextContent(
+ 'Modified:Mon, Jun 3, 2019 1:00 PM CEST',
+ );
+ expect(baseElement).toHaveTextContent('Owner:admin');
+
+ // Tabs
+ expect(baseElement).toHaveTextContent('Information');
+ expect(baseElement).toHaveTextContent('Results(2)');
+ expect(baseElement).toHaveTextContent('User Tags(0)');
+
+ // Summary
+ expect(tableData[0]).toHaveTextContent('Task Name');
+ expect(links[6]).toHaveAttribute('href', '/task/314');
+ expect(tableData[1]).toHaveTextContent('foo');
+
+ expect(tableData[2]).toHaveTextContent('Comment');
+ expect(tableData[3]).toHaveTextContent('bar');
+
+ expect(tableData[4]).toHaveTextContent('Report 1');
+ expect(links[7]).toHaveAttribute('href', '/report/1234');
+ expect(tableData[5]).toHaveTextContent('1234');
+
+ expect(tableData[6]).toHaveTextContent('Scan Time Report 1');
+ expect(tableData[7]).toHaveTextContent(
+ 'Mon, Jun 3, 2019 1:00 PM CEST - Mon, Jun 3, 2019 1:31 PM CEST',
+ );
+
+ expect(tableData[8]).toHaveTextContent('Scan Duration Report 1');
+ expect(tableData[9]).toHaveTextContent('0:31 h');
+
+ expect(tableData[10]).toHaveTextContent('Scan Status Report 1');
+ expect(bars[1]).toHaveTextContent('Done');
+
+ expect(tableData[12]).toHaveTextContent('Report 2');
+ expect(links[8]).toHaveAttribute('href', '/report/5678');
+ expect(tableData[13]).toHaveTextContent('5678');
+
+ expect(tableData[14]).toHaveTextContent('Scan Time Report 2');
+ expect(tableData[15]).toHaveTextContent(
+ 'Mon, May 20, 2019 2:00 PM CEST - Mon, May 20, 2019 2:30 PM CEST',
+ );
+
+ expect(tableData[16]).toHaveTextContent('Scan Duration Report 2');
+ expect(tableData[17]).toHaveTextContent('0:30 h');
+
+ expect(tableData[18]).toHaveTextContent('Scan Status Report 2');
+ expect(bars[2]).toHaveTextContent('Done');
+
+ expect(tableData[20]).toHaveTextContent('Hosts scanned');
+ expect(tableData[21]).toHaveTextContent('3');
+
+ expect(tableData[22]).toHaveTextContent('Filter');
+ expect(tableData[23]).toHaveTextContent(
+ 'apply_overrides=0 compliance_levels=ynui min_qod=70',
+ );
+
+ expect(tableData[24]).toHaveTextContent('Timezone');
+ expect(tableData[25]).toHaveTextContent('UTC (UTC)');
+ });
+
+ test('should render results tab', () => {
+ const onActivateTab = testing.fn();
+ const onAddToAssetsClick = testing.fn();
+ const onError = testing.fn();
+ const onFilterAddLogLevelClick = testing.fn();
+ const onFilterDecreaseMinQoDClick = testing.fn();
+ const onFilterChanged = testing.fn();
+ const onFilterCreated = testing.fn();
+ const onFilterEditClick = testing.fn();
+ const onFilterRemoveSeverityClick = testing.fn();
+ const onFilterResetClick = testing.fn();
+ const onFilterRemoveClick = testing.fn();
+ const onInteraction = testing.fn();
+ const onRemoveFromAssetsClick = testing.fn();
+ const onReportDownloadClick = testing.fn();
+ const showError = testing.fn();
+ const showErrorMessage = testing.fn();
+ const showSuccessMessage = testing.fn();
+ const onSortChange = testing.fn();
+ const onTagSuccess = testing.fn();
+ const onTargetEditClick = testing.fn();
+ const onTlsCertificateDownloadClick = testing.fn();
+
+ const sorting = {
+ apps: {sortField: 'severity', sortReverse: true},
+ closedcves: {sortField: 'severity', sortReverse: true},
+ cves: {sortField: 'severity', sortReverse: true},
+ errors: {sortField: 'error', sortReverse: true},
+ hosts: {sortField: 'severity', sortReverse: true},
+ os: {sortField: 'severity', sortReverse: true},
+ ports: {sortField: 'severity', sortReverse: true},
+ results: {sortField: 'severity', sortReverse: true},
+ tlscerts: {sortField: 'dn', sortReverse: true},
+ };
+
+ const {entity} = getMockAuditDeltaReport();
+
+ const filters = [filterWithName];
+
+ const gmp = {
+ settings: {manualUrl, reportResultsThreshold: 10},
+ user: {currentSettings, getReportComposerDefaults},
+ };
+
+ const {render, store} = rendererWith({
+ gmp,
+ capabilities: caps,
+ router: true,
+ store: true,
+ });
+
+ store.dispatch(setTimezone('CET'));
+ store.dispatch(setUsername('admin'));
+
+ const {baseElement, getAllByTestId} = render(
+ ,
+ );
+
+ const icons = baseElement.querySelectorAll('svg');
+ const inputs = baseElement.querySelectorAll('input');
+ const header = baseElement.querySelectorAll('th');
+ const rows = baseElement.querySelectorAll('tr');
+ const selects = getAllByTestId('select-selected-value');
+ const bars = getAllByTestId('progressbar-box');
+
+ // Toolbar Icons
+ expect(icons.length).toEqual(24)
+
+ // Powerfilter
+ expect(inputs[0]).toHaveAttribute('name', 'userFilterString');
+ expect(selects[0]).toHaveAttribute('title', 'Loaded filter');
+ expect(selects[0]).toHaveTextContent('--');
+
+ // Header
+ expect(baseElement).toHaveTextContent(
+ 'Report:Mon, Jun 3, 2019 1:00 PM CEST',
+ );
+ expect(bars[0]).toHaveAttribute('title', 'Done');
+ expect(bars[0]).toHaveTextContent('Done');
+ expect(baseElement).toHaveTextContent(
+ 'Created:Sun, Jun 2, 2019 2:00 PM CEST',
+ );
+ expect(baseElement).toHaveTextContent(
+ 'Modified:Mon, Jun 3, 2019 1:00 PM CEST',
+ );
+ expect(baseElement).toHaveTextContent('Owner:admin');
+
+ // Tabs
+ expect(baseElement).toHaveTextContent('Information');
+ expect(baseElement).toHaveTextContent('Results(2)');
+ expect(baseElement).toHaveTextContent('User Tags(0)');
+
+ // Results
+
+ // Headings
+ expect(header[0]).toHaveTextContent('Delta');
+ expect(header[1]).toHaveTextContent('Vulnerability');
+ expect(header[3]).toHaveTextContent('Compliant');
+ expect(header[4]).toHaveTextContent('QoD');
+ expect(header[5]).toHaveTextContent('Host');
+ expect(header[6]).toHaveTextContent('Location');
+ expect(header[7]).toHaveTextContent('Created');
+ expect(header[8]).toHaveTextContent('IP');
+ expect(header[9]).toHaveTextContent('Name');
+
+ // Row 1
+ expect(rows[2]).toHaveTextContent('[ = ]');
+ expect(rows[2]).toHaveTextContent('Result 1');
+ expect(bars[1]).toHaveAttribute('title', 'Yes');
+ expect(bars[1]).toHaveTextContent('Yes');
+ expect(rows[2]).toHaveTextContent('80 %');
+ expect(rows[2]).toHaveTextContent('123.456.78.910');
+ expect(rows[2]).toHaveTextContent('80/tcp');
+ expect(rows[2]).toHaveTextContent('Mon, Jun 3, 2019 1:06 PM CEST');
+
+ // Row 2
+ expect(rows[3]).toHaveTextContent('[ = ]');
+ expect(rows[3]).toHaveTextContent('Result 2');
+ expect(bars[2]).toHaveAttribute('title', 'Incomplete');
+ expect(bars[2]).toHaveTextContent('Incomplete');
+ expect(rows[3]).toHaveTextContent('70 %');
+ expect(rows[3]).toHaveTextContent('109.876.54.321');
+ expect(rows[3]).toHaveTextContent('80/tcp');
+ expect(rows[3]).toHaveTextContent('Mon, Jun 3, 2019 1:06 PM CEST');
+
+ // Filter
+ expect(baseElement).toHaveTextContent(
+ '(Applied filter: apply_overrides=0 compliance_levels=ynui rows=10 min_qod=70 first=1 sort=compliant)',
+ );
+ });
+});
diff --git a/src/web/pages/reports/__tests__/auditdetailscontent.jsx b/src/web/pages/reports/__tests__/auditdetailscontent.jsx
new file mode 100644
index 0000000000..fa8ccd693f
--- /dev/null
+++ b/src/web/pages/reports/__tests__/auditdetailscontent.jsx
@@ -0,0 +1,394 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {describe, test, expect, testing} from '@gsa/testing';
+import React from 'react';
+
+import Capabilities from 'gmp/capabilities/capabilities';
+
+import Filter from 'gmp/models/filter';
+
+import {setTimezone, setUsername} from 'web/store/usersettings/actions';
+
+import {rendererWith} from 'web/utils/testing';
+
+import {getMockAuditReport} from 'web/pages/reports/__mocks__/mockauditreport';
+
+import DetailsContent from 'web/pages/reports/auditdetailscontent';
+
+const filter = Filter.fromString(
+ 'apply_overrides=0 compliance_levels=ynui rows=10 min_qod=70 first=1 sort=compliant',
+);
+
+const filterWithName = Filter.fromElement({
+ term: 'apply_overrides=0 compliance_levels=ynui rows=10 min_qod=70 first=1 sort=compliant',
+ name: 'foo',
+ id: '123',
+});
+
+const resetFilter = Filter.fromString(
+ 'first=1 compliance_levels=ynui sort=compliant',
+);
+
+const caps = new Capabilities(['everything']);
+
+const manualUrl = 'test/';
+
+const currentSettings = testing.fn().mockResolvedValue({
+ foo: 'bar',
+});
+
+const getReportComposerDefaults = testing.fn().mockResolvedValue({
+ foo: 'bar',
+});
+
+describe('Audit Report Details Content tests', () => {
+ test('should render Audit Report Details Content', () => {
+ const onActivateTab = testing.fn();
+ const onAddToAssetsClick = testing.fn();
+ const onError = testing.fn();
+ const onFilterAddLogLevelClick = testing.fn();
+ const onFilterDecreaseMinQoDClick = testing.fn();
+ const onFilterChanged = testing.fn();
+ const onFilterCreated = testing.fn();
+ const onFilterEditClick = testing.fn();
+ const onFilterRemoveSeverityClick = testing.fn();
+ const onFilterResetClick = testing.fn();
+ const onFilterRemoveClick = testing.fn();
+ const onInteraction = testing.fn();
+ const onRemoveFromAssetsClick = testing.fn();
+ const onReportDownloadClick = testing.fn();
+ const showError = testing.fn();
+ const showErrorMessage = testing.fn();
+ const showSuccessMessage = testing.fn();
+ const onSortChange = testing.fn();
+ const onTagSuccess = testing.fn();
+ const onTargetEditClick = testing.fn();
+ const onTlsCertificateDownloadClick = testing.fn();
+
+ const sorting = {
+ errors: {sortField: 'error', sortReverse: true},
+ hosts: {sortField: 'compliant', sortReverse: true},
+ os: {sortField: 'compliant', sortReverse: true},
+ results: {sortField: 'compliant', sortReverse: true},
+ tlscerts: {sortField: 'dn', sortReverse: true},
+ };
+
+ const {entity} = getMockAuditReport();
+
+ const filters = [filterWithName];
+
+ const gmp = {
+ settings: {manualUrl, reportResultsThreshold: 10},
+ user: {currentSettings, getReportComposerDefaults},
+ };
+
+ const {render, store} = rendererWith({
+ gmp,
+ capabilities: caps,
+ router: true,
+ store: true,
+ });
+
+ store.dispatch(setTimezone('CET'));
+ store.dispatch(setUsername('admin'));
+
+ const {baseElement, getAllByTestId} = render(
+ ,
+ );
+
+ const icons = baseElement.querySelectorAll('svg');
+ const inputs = baseElement.querySelectorAll('input');
+ const links = baseElement.querySelectorAll('a');
+ const tableData = baseElement.querySelectorAll('td');
+ const selects = getAllByTestId('select-selected-value');
+ const bars = getAllByTestId('progressbar-box');
+
+ // Toolbar Icons
+ expect(icons.length).toEqual(16)
+
+ // Powerfilter
+ expect(inputs[0]).toHaveAttribute('name', 'userFilterString');
+ expect(selects[0]).toHaveAttribute('title', 'Loaded filter');
+ expect(selects[0]).toHaveTextContent('Loading...');
+
+ // Header
+ expect(baseElement).toHaveTextContent(
+ 'Report:Mon, Jun 3, 2019 1:00 PM CEST',
+ );
+ expect(bars[0]).toHaveAttribute('title', 'Done');
+ expect(bars[0]).toHaveTextContent('Done');
+ expect(baseElement).toHaveTextContent(
+ 'Created:Sun, Jun 2, 2019 2:00 PM CEST',
+ );
+ expect(baseElement).toHaveTextContent(
+ 'Modified:Mon, Jun 3, 2019 1:00 PM CEST',
+ );
+ expect(baseElement).toHaveTextContent('Owner:admin');
+
+ // Tabs
+ expect(baseElement).toHaveTextContent('Information');
+ expect(baseElement).toHaveTextContent('Results(2 of 3)');
+ expect(baseElement).toHaveTextContent('Hosts(2 of 2)');
+ expect(baseElement).toHaveTextContent('Operating Systems(2 of 2)');
+ expect(baseElement).toHaveTextContent('TLS Certificates(2 of 2)');
+ expect(baseElement).toHaveTextContent('Error Messages(2 of 2)');
+ expect(baseElement).toHaveTextContent('User Tags(0)');
+
+ // Summary
+ expect(tableData[0]).toHaveTextContent('Task Name');
+ expect(links[7]).toHaveAttribute('href', '/task/314');
+ expect(tableData[1]).toHaveTextContent('foo');
+
+ expect(tableData[2]).toHaveTextContent('Comment');
+ expect(tableData[3]).toHaveTextContent('bar');
+
+ expect(tableData[4]).toHaveTextContent('Scan Time');
+ expect(tableData[5]).toHaveTextContent(
+ 'Mon, Jun 3, 2019 1:00 PM CEST - Mon, Jun 3, 2019 1:31 PM CEST',
+ );
+
+ expect(tableData[6]).toHaveTextContent('Scan Duration');
+ expect(tableData[7]).toHaveTextContent('0:31 h');
+
+ expect(tableData[8]).toHaveTextContent('Scan Status');
+ expect(bars[1]).toHaveAttribute('title', 'Done');
+ expect(bars[1]).toHaveTextContent('Done');
+
+ expect(tableData[10]).toHaveTextContent('Hosts scanned');
+ expect(tableData[11]).toHaveTextContent('3');
+
+ expect(tableData[12]).toHaveTextContent('Filter');
+ expect(tableData[13]).toHaveTextContent(
+ 'apply_overrides=0 compliance_levels=ynui min_qod=70',
+ );
+
+ expect(tableData[14]).toHaveTextContent('Timezone');
+ expect(tableData[15]).toHaveTextContent('UTC (UTC)');
+ });
+
+ test('should render audit threshold panel', () => {
+ const onActivateTab = testing.fn();
+ const onAddToAssetsClick = testing.fn();
+ const onError = testing.fn();
+ const onFilterAddLogLevelClick = testing.fn();
+ const onFilterDecreaseMinQoDClick = testing.fn();
+ const onFilterChanged = testing.fn();
+ const onFilterCreated = testing.fn();
+ const onFilterEditClick = testing.fn();
+ const onFilterRemoveSeverityClick = testing.fn();
+ const onFilterResetClick = testing.fn();
+ const onFilterRemoveClick = testing.fn();
+ const onInteraction = testing.fn();
+ const onRemoveFromAssetsClick = testing.fn();
+ const onReportDownloadClick = testing.fn();
+ const showError = testing.fn();
+ const showErrorMessage = testing.fn();
+ const showSuccessMessage = testing.fn();
+ const onSortChange = testing.fn();
+ const onTagSuccess = testing.fn();
+ const onTargetEditClick = testing.fn();
+ const onTlsCertificateDownloadClick = testing.fn();
+
+ const sorting = {
+ errors: {sortField: 'error', sortReverse: true},
+ hosts: {sortField: 'compliant', sortReverse: true},
+ os: {sortField: 'compliant', sortReverse: true},
+ results: {sortField: 'compliant', sortReverse: true},
+ tlscerts: {sortField: 'dn', sortReverse: true},
+ };
+
+ const {entity} = getMockAuditReport();
+
+ const filters = [filterWithName];
+
+ const gmp = {
+ settings: {manualUrl, reportResultsThreshold: 1},
+ user: {currentSettings, getReportComposerDefaults},
+ };
+
+ const {render, store} = rendererWith({
+ gmp,
+ capabilities: caps,
+ router: true,
+ store: true,
+ });
+
+ store.dispatch(setTimezone('CET'));
+ store.dispatch(setUsername('admin'));
+
+ const {baseElement, getAllByTestId} = render(
+ ,
+ );
+
+ const icons = baseElement.querySelectorAll('svg');
+ const inputs = baseElement.querySelectorAll('input');
+ const selects = getAllByTestId('select-selected-value');
+ const bars = getAllByTestId('progressbar-box');
+
+ // Toolbar Icons
+ expect(icons.length).toEqual(20)
+
+ // Powerfilter
+ expect(inputs[0]).toHaveAttribute('name', 'userFilterString');
+ expect(selects[0]).toHaveAttribute('title', 'Loaded filter');
+ expect(selects[0]).toHaveTextContent('Loading...');
+
+ // Header
+ expect(baseElement).toHaveTextContent(
+ 'Report:Mon, Jun 3, 2019 1:00 PM CEST',
+ );
+ expect(bars[0]).toHaveAttribute('title', 'Done');
+ expect(bars[0]).toHaveTextContent('Done');
+ expect(baseElement).toHaveTextContent(
+ 'Created:Sun, Jun 2, 2019 2:00 PM CEST',
+ );
+ expect(baseElement).toHaveTextContent(
+ 'Modified:Mon, Jun 3, 2019 1:00 PM CEST',
+ );
+ expect(baseElement).toHaveTextContent('Owner:admin');
+
+ // Tabs
+ expect(baseElement).toHaveTextContent('Information');
+ expect(baseElement).toHaveTextContent('Results(2 of 3)');
+ expect(baseElement).toHaveTextContent('Hosts(2 of 2)');
+ expect(baseElement).toHaveTextContent('Operating Systems(2 of 2)');
+ expect(baseElement).toHaveTextContent('TLS Certificates(2 of 2)');
+ expect(baseElement).toHaveTextContent('Error Messages(2 of 2)');
+ expect(baseElement).toHaveTextContent('User Tags(0)');
+
+ // Should include
+ expect(baseElement).toHaveTextContent(
+ "The Hosts cannot be displayed in order to maintain the performance within the browser's capabilities.",
+ );
+ expect(baseElement).toHaveTextContent(
+ 'Please decrease the number of results below the threshold of 1 by applying a more refined filter.',
+ );
+
+ expect(baseElement).toHaveTextContent(
+ 'Results with compliance "Yes" are currently included.',
+ );
+
+ expect(baseElement).toHaveTextContent(
+ 'Filter out results with compliance "Yes".',
+ );
+
+ expect(baseElement).toHaveTextContent(
+ 'Results with compliance "Undefined" are currently included.',
+ );
+
+ expect(baseElement).toHaveTextContent(
+ 'Filter out results with compliance "Undefined".',
+ );
+
+ expect(baseElement).toHaveTextContent(
+ 'Results with compliance "Incomplete" are currently included.',
+ );
+ expect(baseElement).toHaveTextContent(
+ 'Filter out results with compliance "Incomplete".',
+ );
+
+ expect(baseElement).toHaveTextContent(
+ 'Your filter settings may be too unrefined.',
+ );
+
+ expect(baseElement).toHaveTextContent(
+ 'Adjust and update your filter settings.',
+ );
+ expect(baseElement).toHaveTextContent(
+ '(Applied filter: apply_overrides=0 compliance_levels=ynui min_qod=70)',
+ );
+
+ // // Should not Include
+ expect(baseElement).not.toHaveTextContent('IP-Adress');
+ expect(baseElement).not.toHaveTextContent('Hostname');
+ expect(baseElement).not.toHaveTextContent('Apps');
+ expect(baseElement).not.toHaveTextContent('Distance');
+ });
+});
diff --git a/src/web/pages/reports/__tests__/auditfilterdialog.jsx b/src/web/pages/reports/__tests__/auditfilterdialog.jsx
new file mode 100644
index 0000000000..f9d29e5809
--- /dev/null
+++ b/src/web/pages/reports/__tests__/auditfilterdialog.jsx
@@ -0,0 +1,66 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {describe, test, expect, testing} from '@gsa/testing';
+import React from 'react';
+
+import Capabilities from 'gmp/capabilities/capabilities';
+
+import Filter from 'gmp/models/filter';
+
+import {rendererWith} from 'web/utils/testing';
+
+import AuditReportFilter from 'web/pages/reports/auditfilterdialog';
+
+const caps = new Capabilities(['everything']);
+
+const manualUrl = 'test/';
+
+describe('Filter Dialog for Audit report', () => {
+ test('should render filter with compliance level group', () => {
+ const onFilterChanged = testing.fn();
+ const onFilterCreated = testing.fn();
+ const onCloseClick = testing.fn();
+
+ const filter = Filter.fromString(
+ 'apply_overrides=0 levels=hmlg rows=100 min_qod=70 first=1 sort=compliant',
+ );
+
+ const gmp = {
+ settings: {manualUrl, reportResultsThreshold: 10},
+ };
+
+ const {render} = rendererWith({
+ gmp,
+ capabilities: caps,
+ });
+
+ const {getAllByTestId} = render(
+ ,
+ );
+
+ const formgroups = getAllByTestId('formgroup-title');
+ const content = getAllByTestId('formgroup-content');
+ const radioTitles = getAllByTestId('radio-title');
+
+ expect(formgroups[0]).toHaveTextContent('Filter');
+ expect(formgroups[1]).toHaveTextContent('Compliance');
+ expect(content[1]).toHaveTextContent('YesNoIncompleteUndefined');
+ expect(formgroups[2]).toHaveTextContent('QoD');
+ expect(formgroups[3]).toHaveTextContent('From Task (name)');
+ expect(formgroups[4]).toHaveTextContent('First result');
+ expect(formgroups[5]).toHaveTextContent('Results per page');
+ expect(formgroups[6]).toHaveTextContent('Sort by');
+ expect(radioTitles[0]).toHaveTextContent('Ascending');
+ expect(radioTitles[1]).toHaveTextContent('Descending');
+ });
+});
diff --git a/src/web/pages/reports/__tests__/auditreportrow.jsx b/src/web/pages/reports/__tests__/auditreportrow.jsx
new file mode 100644
index 0000000000..ff49d98ac5
--- /dev/null
+++ b/src/web/pages/reports/__tests__/auditreportrow.jsx
@@ -0,0 +1,54 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {describe, test, expect, testing} from '@gsa/testing';
+import React from 'react';
+import {rendererWith} from 'web/utils/testing';
+import AuditRow from '../auditreportrow';
+import {setTimezone} from 'web/store/usersettings/actions';
+
+import {getMockAuditReport} from 'web/pages/reports/__mocks__/mockauditreport';
+
+describe('Audit report row', () => {
+ test('should render row for Audit report', () => {
+ const {entity} = getMockAuditReport();
+ const onReportDeleteClick = testing.fn();
+ const onReportDeltaSelect = testing.fn();
+
+ const {render, store} = rendererWith({
+ capabilities: true,
+ store: true,
+ router: true,
+ });
+
+ store.dispatch(setTimezone('CET'));
+
+ const {baseElement, getAllByTestId} = render(
+ ,
+ );
+
+ const bars = getAllByTestId('progressbar-box');
+ const links = baseElement.querySelectorAll('a');
+ const rows = baseElement.querySelectorAll('tr');
+
+ expect(links[0]).toHaveAttribute('href', '/auditreport/1234');
+ expect(rows[0]).toHaveTextContent('Mon, Jun 3, 2019 1:00 PM');
+ expect(bars[0]).toHaveAttribute('title', 'Done');
+ expect(bars[0]).toHaveTextContent('Done');
+ expect(rows[0]).toHaveTextContent('foo');
+ expect(links[1]).toHaveAttribute('href', '/task/314');
+ expect(bars[1]).toHaveAttribute('title', 'No');
+ expect(bars[1]).toHaveTextContent('No');
+ expect(rows[0]).toHaveTextContent('321'); // yes: 3, no: 2, incomplete: 1
+ });
+});
diff --git a/src/web/pages/reports/__tests__/auditreportslistpage.jsx b/src/web/pages/reports/__tests__/auditreportslistpage.jsx
new file mode 100644
index 0000000000..0539914828
--- /dev/null
+++ b/src/web/pages/reports/__tests__/auditreportslistpage.jsx
@@ -0,0 +1,267 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {describe, test, expect, testing} from '@gsa/testing';
+import React from 'react';
+import {act} from 'react-dom/test-utils';
+
+import CollectionCounts from 'gmp/collection/collectioncounts';
+
+import Filter from 'gmp/models/filter';
+
+import {setTimezone, setUsername} from 'web/store/usersettings/actions';
+import {entitiesActions} from 'web/store/entities/auditreports';
+import {loadingActions} from 'web/store/usersettings/defaults/actions';
+import {defaultFilterLoadingActions} from 'web/store/usersettings/defaultfilters/actions';
+
+import {rendererWith, waitFor, fireEvent} from 'web/utils/testing';
+import {getMockAuditReport} from 'web/pages/reports/__mocks__/mockauditreport';
+import AuditReportsPage from '../auditreportslistpage';
+
+window.URL.createObjectURL = testing.fn();
+
+const {entity} = getMockAuditReport();
+
+const reloadInterval = 1;
+const manualUrl = 'test/';
+
+const currentSettings = testing.fn().mockResolvedValue({
+ foo: 'bar',
+});
+
+const getFilters = testing.fn().mockReturnValue(
+ Promise.resolve({
+ data: [],
+ meta: {
+ filter: Filter.fromString(),
+ counts: new CollectionCounts(),
+ },
+ }),
+);
+
+const getDashboardSetting = testing.fn().mockResolvedValue({
+ data: [],
+ meta: {
+ filter: Filter.fromString(),
+ counts: new CollectionCounts(),
+ },
+});
+
+const getUserSetting = testing.fn().mockResolvedValue({
+ filter: null,
+});
+
+const getComplianceAggregates = testing.fn().mockResolvedValue({
+ data: [],
+ meta: {
+ filter: Filter.fromString(),
+ counts: new CollectionCounts(),
+ },
+});
+
+const getReports = testing.fn().mockResolvedValue({
+ data: [entity],
+ meta: {
+ filter: Filter.fromString(),
+ counts: new CollectionCounts(),
+ },
+});
+
+const getAll = testing.fn().mockResolvedValue({
+ data: [],
+ meta: {
+ filter: Filter.fromString(),
+ counts: new CollectionCounts(),
+ },
+});
+
+const getReportFormats = testing.fn().mockResolvedValue({
+ data: [],
+ meta: {
+ filter: Filter.fromString(),
+ counts: new CollectionCounts(),
+ },
+});
+
+describe('AuditReportsPage tests', () => {
+ test('should render full AuditReports Page', async () => {
+ const gmp = {
+ auditreports: {
+ get: getReports,
+ getComplianceAggregates: getComplianceAggregates,
+ },
+ filters: {
+ get: getFilters,
+ },
+ reportformats: {
+ get: getReportFormats,
+ },
+ dashboard: {
+ getSetting: getDashboardSetting,
+ },
+ reloadInterval,
+ settings: {manualUrl},
+ user: {currentSettings, getSetting: getUserSetting},
+ };
+
+ const {render, store} = rendererWith({
+ gmp,
+ capabilities: true,
+ store: true,
+ router: true,
+ });
+
+ store.dispatch(setTimezone('CET'));
+ store.dispatch(setUsername('admin'));
+
+ const defaultSettingfilter = Filter.fromString('foo=bar');
+ store.dispatch(loadingActions.success({rowsperpage: {value: '2'}}));
+ store.dispatch(
+ defaultFilterLoadingActions.success('auditreport', defaultSettingfilter),
+ );
+
+ const counts = new CollectionCounts({
+ first: 1,
+ all: 1,
+ filtered: 1,
+ length: 1,
+ rows: 10,
+ });
+ const filter = Filter.fromString('first=1 rows=10');
+ const loadedFilter = Filter.fromString('first=1 rows=10');
+ store.dispatch(
+ entitiesActions.success([entity], filter, loadedFilter, counts),
+ );
+
+ const {baseElement, getAllByTestId} = render( );
+
+ await waitFor(() => baseElement.querySelectorAll('table'));
+
+ const display = getAllByTestId('grid-item');
+ const icons = getAllByTestId('svg-icon');
+ const inputs = baseElement.querySelectorAll('input');
+ const header = baseElement.querySelectorAll('th');
+ const row = baseElement.querySelectorAll('tr');
+ const selects = getAllByTestId('select-selected-value');
+
+ // Toolbar Icons
+ expect(icons[0]).toHaveAttribute('title', 'Help: Audit Reports');
+
+ // Powerfilter
+ expect(inputs[0]).toHaveAttribute('name', 'userFilterString');
+ expect(icons[1]).toHaveAttribute('title', 'Update Filter');
+ expect(icons[2]).toHaveAttribute('title', 'Remove Filter');
+ expect(icons[3]).toHaveAttribute('title', 'Reset to Default Filter');
+ expect(icons[4]).toHaveAttribute('title', 'Help: Powerfilter');
+ expect(icons[5]).toHaveAttribute('title', 'Edit Filter');
+ expect(selects[0]).toHaveAttribute('title', 'Loaded filter');
+ expect(selects[0]).toHaveTextContent('--');
+
+ // // Dashboard
+ expect(icons[7]).toHaveAttribute('title', 'Add new Dashboard Display');
+ expect(icons[8]).toHaveAttribute('title', 'Reset to Defaults');
+ expect(display[0]).toHaveTextContent(
+ 'Audit Reports by Compliance (Total: 0)',
+ );
+ expect(display[1]).toHaveTextContent(
+ 'Audit Reports by Compliance (Total: 0)',
+ );
+
+ // Table
+ expect(header[0]).toHaveTextContent('Date');
+ expect(header[1]).toHaveTextContent('Status');
+ expect(header[2]).toHaveTextContent('Task');
+ expect(header[3]).toHaveTextContent('Compliant');
+ expect(header[4]).toHaveTextContent('Yes');
+ expect(header[5]).toHaveTextContent('No');
+ expect(header[6]).toHaveTextContent('Incomplete');
+ expect(header[7]).toHaveTextContent('Actions');
+
+ expect(row[1]).toHaveTextContent('Mon, Jun 3, 2019 1:00 PM');
+ expect(row[1]).toHaveTextContent('Done');
+ expect(row[1]).toHaveTextContent('foo');
+ expect(row[1]).toHaveTextContent('No');
+ expect(row[1]).toHaveTextContent('321'); // yes: 3, no: 2, incomplete: 1
+ });
+
+ test('should call commands for bulk actions', async () => {
+ const deleteByFilter = testing.fn().mockResolvedValue({
+ foo: 'bar',
+ });
+
+ const exportByFilter = testing.fn().mockResolvedValue({
+ foo: 'bar',
+ });
+
+ const gmp = {
+ auditreports: {
+ get: getReports,
+ getComplianceAggregates: getComplianceAggregates,
+ deleteByFilter,
+ exportByFilter,
+ },
+ filters: {
+ get: getFilters,
+ },
+ reportformats: {
+ get: getReportFormats,
+ },
+ dashboard: {
+ getSetting: getDashboardSetting,
+ },
+ tags: {
+ getAll: getAll,
+ },
+ reloadInterval,
+ settings: {manualUrl},
+ user: {currentSettings, getSetting: getUserSetting},
+ };
+
+ const {render, store} = rendererWith({
+ gmp,
+ capabilities: true,
+ store: true,
+ router: true,
+ });
+
+ store.dispatch(setTimezone('CET'));
+ store.dispatch(setUsername('admin'));
+
+ const defaultSettingfilter = Filter.fromString('foo=bar');
+ store.dispatch(loadingActions.success({rowsperpage: {value: '2'}}));
+ store.dispatch(
+ defaultFilterLoadingActions.success('auditreport', defaultSettingfilter),
+ );
+
+ const counts = new CollectionCounts({
+ first: 1,
+ all: 1,
+ filtered: 1,
+ length: 1,
+ rows: 10,
+ });
+ const filter = Filter.fromString('first=1 rows=10');
+ const loadedFilter = Filter.fromString('first=1 rows=10');
+ store.dispatch(
+ entitiesActions.success([entity], filter, loadedFilter, counts),
+ );
+
+ const {baseElement, getAllByTestId} = render( );
+
+ await waitFor(() => baseElement.querySelectorAll('table'));
+
+ const icons = getAllByTestId('svg-icon');
+
+ await act(async () => {
+ expect(icons[19]).toHaveAttribute('title', 'Add tag to page contents');
+ fireEvent.click(icons[19]);
+ expect(getAll).toHaveBeenCalled();
+
+ expect(icons[20]).toHaveAttribute('title', 'Delete page contents');
+ fireEvent.click(icons[20]);
+ expect(deleteByFilter).toHaveBeenCalled();
+ });
+ });
+});
diff --git a/src/web/pages/reports/__tests__/detailsfilterdialog.jsx b/src/web/pages/reports/__tests__/detailsfilterdialog.jsx
new file mode 100644
index 0000000000..4c26cc56bb
--- /dev/null
+++ b/src/web/pages/reports/__tests__/detailsfilterdialog.jsx
@@ -0,0 +1,119 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {describe, test, expect, testing} from '@gsa/testing';
+import React from 'react';
+
+import Capabilities from 'gmp/capabilities/capabilities';
+
+import Filter from 'gmp/models/filter';
+
+import {rendererWith} from 'web/utils/testing';
+
+import FilterDialog from 'web/pages/reports/detailsfilterdialog';
+
+const caps = new Capabilities(['everything']);
+
+const manualUrl = 'test/';
+
+describe('Details Filter Dialog for Audit report', () => {
+ test('should render compliance levels filter group', () => {
+ const onFilterChanged = testing.fn();
+ const onFilterCreated = testing.fn();
+ const onCloseClick = testing.fn();
+
+ const filter = Filter.fromString(
+ 'apply_overrides=0 levels=hmlg rows=100 min_qod=70 first=1 sort=compliant',
+ );
+
+ const gmp = {
+ settings: {manualUrl, reportResultsThreshold: 10},
+ };
+
+ const {render} = rendererWith({
+ gmp,
+ capabilities: caps,
+ });
+
+ const {getAllByTestId} = render(
+ ,
+ );
+
+ const formgroups = getAllByTestId('formgroup-title');
+ const content = getAllByTestId('formgroup-content');
+
+ expect(formgroups[0]).toHaveTextContent('Filter');
+ expect(formgroups[1]).toHaveTextContent(
+ 'Only show hosts that have results',
+ );
+ expect(formgroups[2]).toHaveTextContent('QoD');
+ expect(formgroups[3]).toHaveTextContent('Compliance');
+ expect(content[3]).toHaveTextContent('YesNoIncompleteUndefined');
+ expect(formgroups[4]).toHaveTextContent('Solution Type');
+ expect(formgroups[5]).toHaveTextContent('Vulnerability');
+ expect(formgroups[6]).toHaveTextContent('Host (IP)');
+ expect(formgroups[7]).toHaveTextContent('Location (eg. port/protocol)');
+ expect(formgroups[8]).toHaveTextContent('First result');
+ expect(formgroups[9]).toHaveTextContent('Results per page');
+ });
+
+ test('should render severity levels filter group', () => {
+ const onFilterChanged = testing.fn();
+ const onFilterCreated = testing.fn();
+ const onCloseClick = testing.fn();
+
+ const filter = Filter.fromString(
+ 'apply_overrides=0 levels=hmlg rows=100 min_qod=70 first=1 sort=severity',
+ );
+
+ const gmp = {
+ settings: {manualUrl, reportResultsThreshold: 10},
+ };
+
+ const {render} = rendererWith({
+ gmp,
+ capabilities: caps,
+ });
+
+ const {getAllByTestId} = render(
+ ,
+ );
+
+ const formgroups = getAllByTestId('formgroup-title');
+ const content = getAllByTestId('formgroup-content');
+
+ expect(formgroups[0]).toHaveTextContent('Filter');
+ expect(formgroups[1]).toHaveTextContent('Apply Overrides');
+ expect(formgroups[2]).toHaveTextContent(
+ 'Only show hosts that have results',
+ );
+ expect(formgroups[3]).toHaveTextContent('QoD');
+ expect(formgroups[4]).toHaveTextContent('Severity (Class)');
+ expect(content[4]).toHaveTextContent('HighMediumLowLogFalse Pos.');
+ expect(formgroups[5]).toHaveTextContent('Severity');
+ expect(formgroups[6]).toHaveTextContent('Solution Type');
+ expect(formgroups[7]).toHaveTextContent('Vulnerability');
+ expect(formgroups[8]).toHaveTextContent('Host (IP)');
+ expect(formgroups[9]).toHaveTextContent('Location (eg. port/protocol)');
+ expect(formgroups[10]).toHaveTextContent('First result');
+ expect(formgroups[11]).toHaveTextContent('Results per page');
+ });
+});
diff --git a/src/web/pages/reports/auditdashboard/index.jsx b/src/web/pages/reports/auditdashboard/index.jsx
new file mode 100644
index 0000000000..ab590e00b1
--- /dev/null
+++ b/src/web/pages/reports/auditdashboard/index.jsx
@@ -0,0 +1,36 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+
+import Dashboard from 'web/components/dashboard/dashboard';
+
+import {
+ ReportComplianceDisplay,
+ ReportComplianceTableDisplay,
+} from './statusdisplay';
+
+export const AUDIT_REPORTS_DASHBOARD_ID =
+ '8083d77b-05bb-4b17-ab39-c81175cb512c';
+
+export const AUDIT_REPORTS_DISPLAYS = [
+ ReportComplianceDisplay.displayId,
+ ReportComplianceTableDisplay.displayId,
+];
+
+const AuditReportsDashboard = props => (
+
+);
+
+export default AuditReportsDashboard;
\ No newline at end of file
diff --git a/src/web/pages/reports/auditdashboard/loaders.jsx b/src/web/pages/reports/auditdashboard/loaders.jsx
new file mode 100644
index 0000000000..54ddad147f
--- /dev/null
+++ b/src/web/pages/reports/auditdashboard/loaders.jsx
@@ -0,0 +1,30 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import Loader, {
+ loadFunc,
+ loaderPropTypes,
+} from 'web/store/dashboard/data/loader';
+
+export const REPORTS_COMPLIANCE = 'reports-compliance';
+
+export const reportComplianceLoader = loadFunc(
+ ({gmp, filter}) =>
+ gmp.auditreports.getComplianceAggregates({filter}).then(r => r.data),
+ REPORTS_COMPLIANCE,
+);
+
+export const ReportCompianceLoader = ({children, filter}) => (
+
+ {children}
+
+);
+
+ReportCompianceLoader.propTypes = loaderPropTypes;
\ No newline at end of file
diff --git a/src/web/pages/reports/auditdashboard/statusdisplay.jsx b/src/web/pages/reports/auditdashboard/statusdisplay.jsx
new file mode 100644
index 0000000000..7305781531
--- /dev/null
+++ b/src/web/pages/reports/auditdashboard/statusdisplay.jsx
@@ -0,0 +1,89 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+
+import {_, _l} from 'gmp/locale/lang';
+
+import {AUDIT_REPORTS_FILTER_FILTER} from 'gmp/models/filter';
+import {getTranslatableReportCompliance} from 'gmp/models/auditreport';
+
+import {registerDisplay} from 'web/components/dashboard/registry';
+import {
+ complianceColorScale,
+ totalCount,
+ percent,
+} from 'web/components/dashboard/display/utils';
+
+import createDisplay from 'web/components/dashboard/display/createDisplay';
+import DataTable from 'web/components/dashboard/display/datatable';
+import DataTableDisplay from 'web/components/dashboard/display/datatabledisplay'; // eslint-disable-line max-len
+
+import StatusDisplay from 'web/components/dashboard/display/status/statusdisplay'; // eslint-disable-line max-len
+
+import {ReportCompianceLoader} from './loaders';
+
+const transformStatusData = (data = {}) => {
+ const {groups = []} = data;
+
+ const sum = totalCount(groups);
+
+ const tdata = groups.map(group => {
+ const {count, value} = group;
+ const translatableValue = getTranslatableReportCompliance(value);
+ const perc = percent(count, sum);
+ return {
+ value: count,
+ label: translatableValue,
+ toolTip: `${translatableValue}: ${perc}% (${count})`,
+ color: complianceColorScale(value),
+ filterValue: value,
+ };
+ });
+
+ tdata.total = sum;
+
+ return tdata;
+};
+
+export const ReportComplianceDisplay = createDisplay({
+ dataTransform: transformStatusData,
+ displayComponent: StatusDisplay,
+ filterTerm: 'compliant',
+ displayId: 'report-by-compliance',
+ title: ({data: tdata}) =>
+ _('Audit Reports by Compliance (Total: {{count}})', {
+ count: tdata.total,
+ }),
+ filtersFilter: AUDIT_REPORTS_FILTER_FILTER,
+ loaderComponent: ReportCompianceLoader,
+});
+
+export const ReportComplianceTableDisplay = createDisplay({
+ chartComponent: DataTable,
+ displayComponent: DataTableDisplay,
+ loaderComponent: ReportCompianceLoader,
+ dataTransform: transformStatusData,
+ dataTitles: [_l('Status'), _l('# of Reports')],
+ dataRow: row => [row.label, row.value],
+ title: ({data: tdata}) =>
+ _('Audit Reports by Compliance (Total: {{count}})', {
+ count: tdata.total,
+ }),
+ displayId: 'report-by-compliance-table',
+ displayName: 'ReportComplianceTableDisplay',
+ filtersFilter: AUDIT_REPORTS_FILTER_FILTER,
+});
+
+registerDisplay(ReportComplianceDisplay.displayId, ReportComplianceDisplay, {
+ title: _l('Chart: Audit Reports by Compliance'),
+});
+
+registerDisplay(
+ ReportComplianceTableDisplay.displayId,
+ ReportComplianceTableDisplay,
+ {
+ title: _l('Table: Audit Reports by Compliance'),
+ },
+);
\ No newline at end of file
diff --git a/src/web/pages/reports/auditdeltadetailspage.jsx b/src/web/pages/reports/auditdeltadetailspage.jsx
new file mode 100644
index 0000000000..2a65928c1f
--- /dev/null
+++ b/src/web/pages/reports/auditdeltadetailspage.jsx
@@ -0,0 +1,565 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+
+import React, {useEffect, useState} from 'react';
+
+import {useDispatch, useSelector, shallowEqual} from 'react-redux';
+
+import {useRouteMatch} from 'react-router-dom';
+
+import useTranslation from 'web/hooks/useTranslation';
+
+import logger from 'gmp/log';
+
+import Filter, {
+ ALL_FILTER,
+ RESET_FILTER,
+ RESULTS_FILTER_FILTER
+} from 'gmp/models/filter';
+import {isActive} from 'gmp/models/task';
+
+import {first} from 'gmp/utils/array';
+import {isDefined, hasValue} from 'gmp/utils/identity';
+
+import withDownload from 'web/components/form/withDownload';
+
+import Reload, {
+ NO_RELOAD,
+ USE_DEFAULT_RELOAD_INTERVAL_ACTIVE,
+} from 'web/components/loading/reload';
+
+import withDialogNotification from 'web/components/notification/withDialogNotifiaction'; // eslint-disable-line max-len
+
+import DownloadReportDialog from 'web/pages/reports/downloadreportdialog';
+
+import {
+ loadAllEntities as loadFilters,
+ selector as filterSelector,
+} from 'web/store/entities/filters';
+
+import {
+ loadAllEntities as loadReportFormats,
+ selector as reportFormatsSelector,
+} from 'web/store/entities/reportformats';
+
+import {
+ loadAllEntities as loadReportConfigs,
+ selector as reportConfigsSelector,
+} from 'web/store/entities/reportconfigs';
+
+import {loadDeltaAuditReport} from 'web/store/entities/report/actions';
+
+import {deltaAuditReportSelector} from 'web/store/entities/report/selectors';
+
+import {
+ loadReportComposerDefaults,
+ renewSessionTimeout,
+ saveReportComposerDefaults,
+} from 'web/store/usersettings/actions';
+
+import {loadUserSettingDefaults} from 'web/store/usersettings/defaults/actions';
+import {getUserSettingsDefaults} from 'web/store/usersettings/defaults/selectors';
+import {getUserSettingsDefaultFilter} from 'web/store/usersettings/defaultfilters/selectors';
+
+import {
+ getReportComposerDefaults,
+ getUsername,
+} from 'web/store/usersettings/selectors';
+
+import compose from 'web/utils/compose';
+import {generateFilename} from 'web/utils/render';
+import PropTypes from 'web/utils/proptypes';
+import useGmp from 'web/hooks/useGmp';
+
+import TargetComponent from '../targets/component';
+
+import Page from './deltadetailscontent';
+import FilterDialog from './detailsfilterdialog';
+
+const log = logger.getLogger('web.pages.report.deltadetailspage');
+
+const DEFAULT_FILTER = Filter.fromString(
+ 'levels=hmlg rows=100 min_qod=70 first=1 sort-reverse=compliant',
+);
+
+const REPORT_FORMATS_FILTER = Filter.fromString('active=1 and trust=1 rows=-1');
+
+const getTarget = (entity = {}) => {
+ const {report = {}} = entity;
+ const {task = {}} = report;
+ return task.target;
+};
+
+const DeltaAuditReportDetails = props => {
+ const [activeTab, setActiveTab] = useState(0);
+ const [showFilterDialog, setShowFilterDialog] = useState(false);
+ const [showDownloadReportDialog, setShowDownloadReportDialog] =
+ useState(false);
+ const [reportFormatId, setReportFormatId] = useState();
+ const [isUpdating, setIsUpdating] = useState(false);
+ // storeAsDefault is set in SaveDialogContent
+ // eslint-disable-next-line no-unused-vars
+ const [storeAsDefault, setStoreAsDefault] = useState();
+
+ const [sorting, setSorting] = useState({
+ results: {
+ sortField: 'compliant',
+ sortReverse: true,
+ },
+ errors: {
+ sortField: 'error',
+ sortReverse: false,
+ },
+ });
+
+ const [_] = useTranslation();
+ const gmp = useGmp();
+ const dispatch = useDispatch();
+ const match = useRouteMatch();
+ const {id: reportId, deltaid: deltaReportId} = match.params;
+
+ const reportFormatsSel = useSelector(reportFormatsSelector);
+ const reportConfigsSel = useSelector(reportConfigsSelector);
+ const reportFormats = reportFormatsSel?.getAllEntities(REPORT_FORMATS_FILTER);
+ const reportConfigs = reportConfigsSel?.getAllEntities(ALL_FILTER);
+ const userDefaultFilterSel = useSelector(
+ rootState => getUserSettingsDefaultFilter(rootState, 'result'),
+ shallowEqual,
+ );
+ const resultDefaultFilter = userDefaultFilterSel?.getFilter('result');
+ const reportComposerDefaults = useSelector(getReportComposerDefaults);
+ const userDefaultsSelector = useSelector(
+ getUserSettingsDefaults,
+ shallowEqual,
+ );
+ const reportExportFileName = userDefaultsSelector?.getValueByName(
+ 'reportexportfilename',
+ );
+ const username = useSelector(getUsername);
+ const filterSel = useSelector(filterSelector);
+ const filters = filterSel?.getAllEntities(RESULTS_FILTER_FILTER);
+ const [entity, entityError] = useSelector(state => {
+ const deltaSel = deltaAuditReportSelector(state);
+ return [
+ deltaSel?.getEntity(reportId, deltaReportId),
+ deltaSel?.getError(reportId, deltaReportId),
+ ];
+ });
+ const isLoading = !isDefined(entity);
+
+ useEffect(() => {
+ dispatch(loadUserSettingDefaults(gmp)());
+ dispatch(loadFilters(gmp)(RESULTS_FILTER_FILTER));
+ dispatch(loadReportFormats(gmp)(REPORT_FORMATS_FILTER));
+ dispatch(loadReportConfigs(gmp)(ALL_FILTER));
+ dispatch(loadReportComposerDefaults(gmp)());
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+
+ useEffect(() => {
+ if (
+ !isDefined(reportFormatId) &&
+ isDefined(reportFormats) &&
+ reportFormats.length > 0
+ ) {
+ // set initial report format id if available
+ const initialReportFormatId = first(reportFormats).id;
+ if (isDefined(initialReportFormatId)) {
+ // ensure the report format id is only set if we really have one
+ // if no report format id is available we would create an infinite
+ // render loop here
+ setReportFormatId({initialReportFormatId});
+ } else {
+ // if there is no report format at all, throw a proper error message
+ // instead of just showing x is undefined JS stacktrace
+ const noReportFormatError = _(
+ 'The report cannot be displayed because' +
+ ' no report format is available.' +
+ ' This could be due to a missing gvmd data feed. Please update' +
+ ' the gvmd data feed, check the "feed import owner" setting, the' +
+ ' feed status page, or contact your system administrator.',
+ );
+ throw new Error(noReportFormatError);
+ }
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [reportFormats, reportFormatId]);
+
+ useEffect(() => {
+ load();
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [reportId, deltaReportId]);
+
+ const load = filter => {
+ log.debug('Loading report', {
+ filter,
+ });
+ const {reportFilter: prevFilter} = props;
+
+ setIsUpdating(!isDefined(prevFilter) || !prevFilter.equals(filter));
+
+ props
+ .reload(filter)
+ .then(() => {
+ setIsUpdating(false);
+ })
+ .catch(() => {
+ setIsUpdating(false);
+ });
+ };
+
+ const reload = () => {
+ // reload data from backend
+ load(props.reportFilter);
+ };
+
+ const handleChanged = () => {
+ reload();
+ };
+
+ const handleError = error => {
+ const {showError} = props;
+ log.error(error);
+ showError(error);
+ };
+
+ const handleFilterChange = filter => {
+ handleInteraction();
+ load(filter);
+ };
+
+ const handleFilterRemoveClick = () => {
+ handleFilterChange(RESET_FILTER);
+ };
+
+ const handleFilterResetClick = () => {
+ if (hasValue(resultDefaultFilter)) {
+ handleFilterChange(resultDefaultFilter);
+ } else {
+ handleFilterChange(DEFAULT_FILTER);
+ }
+ };
+
+ const handleActivateTab = index => {
+ handleInteraction();
+ setActiveTab(index);
+ };
+
+ const handleAddToAssets = () => {
+ const {showSuccessMessage, reportFilter: filter} = props;
+
+ handleInteraction();
+
+ gmp.auditreport.addAssets(entity, {filter}).then(() => {
+ showSuccessMessage(
+ _(
+ 'Report content added to Assets with QoD>=70% and Overrides enabled.',
+ ),
+ );
+ reload();
+ }, handleError);
+ };
+
+ const handleRemoveFromAssets = () => {
+ const {showSuccessMessage, reportFilter: filter} = props;
+
+ handleInteraction();
+
+ gmp.auditreport.removeAssets(entity, {filter}).then(() => {
+ showSuccessMessage(_('Report content removed from Assets.'));
+ reload();
+ }, handleError);
+ };
+
+ const handleFilterEditClick = () => {
+ handleInteraction();
+
+ setShowFilterDialog(true);
+ };
+
+ const handleFilterDialogClose = () => {
+ handleInteraction();
+ setShowFilterDialog(false);
+ };
+
+ const handleOpenDownloadReportDialog = () => {
+ setShowDownloadReportDialog(true);
+ };
+
+ const handleCloseDownloadReportDialog = () => {
+ setShowDownloadReportDialog(false);
+ };
+
+ const handleReportDownload = state => {
+ const {reportFilter, onDownload} = props;
+ // eslint-disable-next-line no-shadow
+ const {includeNotes, includeOverrides, reportFormatId, storeAsDefault} =
+ state;
+
+ const newFilter = reportFilter.copy();
+ newFilter.set('notes', includeNotes);
+ newFilter.set('overrides', includeOverrides);
+
+ if (storeAsDefault) {
+ const defaults = {
+ ...reportComposerDefaults,
+ defaultReportFormatId: reportFormatId,
+ includeNotes,
+ includeOverrides,
+ };
+ dispatch(saveReportComposerDefaults(gmp)(defaults));
+ }
+
+ const report_format = reportFormats
+ ? reportFormats.find(format => reportFormatId === format.id)
+ : undefined;
+
+ const extension = isDefined(report_format)
+ ? report_format.extension
+ : 'unknown'; // unknown should never happen but we should be save here
+
+ handleInteraction();
+
+ return gmp.auditreport
+ .download(entity, {
+ reportFormatId,
+ deltaReportId,
+ filter: newFilter,
+ })
+ .then(response => {
+ setShowDownloadReportDialog(false);
+ const {data} = response;
+ const filename = generateFilename({
+ creationTime: entity.creationTime,
+ extension,
+ fileNameFormat: reportExportFileName,
+ id: entity.id,
+ modificationTime: entity.modificationTime,
+ reportFormat: report_format?.name,
+ resourceName: entity.task.name,
+ resourceType: 'report',
+ username,
+ });
+
+ onDownload({filename, data});
+ }, handleError);
+ };
+
+ const handleFilterCreated = filter => {
+ handleInteraction();
+ load(filter);
+ dispatch(loadFilters(gmp)(RESULTS_FILTER_FILTER));
+ };
+
+ const handleFilterDecreaseMinQoD = () => {
+ const {reportFilter} = props;
+
+ handleInteraction();
+
+ if (reportFilter.has('min_qod')) {
+ const lfilter = reportFilter.copy();
+ lfilter.set('min_qod', 30);
+ load(lfilter);
+ }
+ };
+
+ const handleSortChange = (name, sortField) => {
+ handleInteraction();
+
+ const prev = sorting[name];
+
+ const sortReverse =
+ sortField === prev.sortField ? !prev.sortReverse : false;
+
+ const newSorting = {
+ ...sorting,
+ [name]: {
+ sortField,
+ sortReverse,
+ },
+ };
+ setSorting(newSorting);
+ };
+
+ const handleInteraction = () => dispatch(renewSessionTimeout(gmp)());
+
+ const loadTarget = () => {
+ const target = getTarget(entity);
+ return gmp.target.get({id: target.id});
+ };
+
+ const {reportFilter, showError, showErrorMessage, showSuccessMessage} = props;
+
+ const {report} = entity || {};
+
+ return (
+
+
+ {({edit}) => (
+
+ loadTarget().then(response => edit(response.data))
+ }
+ showError={showError}
+ showErrorMessage={showErrorMessage}
+ showSuccessMessage={showSuccessMessage}
+ />
+ )}
+
+ {showFilterDialog && (
+
+ )}
+ {showDownloadReportDialog && (
+
+ )}
+
+ );
+};
+
+DeltaAuditReportDetails.propTypes = {
+ defaultFilter: PropTypes.filter,
+ location: PropTypes.object.isRequired,
+ reload: PropTypes.func.isRequired,
+ reportFilter: PropTypes.filter,
+ showError: PropTypes.func.isRequired,
+ showErrorMessage: PropTypes.func.isRequired,
+ showSuccessMessage: PropTypes.func.isRequired,
+ target: PropTypes.model,
+ username: PropTypes.string,
+ onDownload: PropTypes.func.isRequired,
+};
+
+const reloadInterval = report =>
+ isDefined(report) && isActive(report.report.scan_run_status)
+ ? USE_DEFAULT_RELOAD_INTERVAL_ACTIVE
+ : NO_RELOAD; // report doesn't change anymore. no need to reload
+
+const load =
+ ({defaultFilter, reportId, deltaReportId, dispatch, gmp, reportFilter}) =>
+ filter => {
+ if (!hasValue(filter)) {
+ // use loaded filter after initial loading
+ filter = reportFilter;
+ }
+
+ if (!hasValue(filter)) {
+ // use filter from user setting
+ filter = defaultFilter;
+ }
+
+ if (!hasValue(filter)) {
+ // use fallback filter
+ filter = DEFAULT_FILTER;
+ }
+
+ // to avoid confusion of loaded results with different sort terms and
+ // directions, always load the report with sort=name from gvmd (the user's
+ // sort term will be handled by GSA in the browser)
+ filter.delete('sort-reverse');
+ filter.set('sort', 'name');
+ return dispatch(
+ loadDeltaAuditReport(gmp)(reportId, deltaReportId, filter),
+ ).then(() =>
+ dispatch(loadDeltaAuditReport(gmp)(reportId, deltaReportId, filter)),
+ );
+ };
+
+const DeltaAuditReportDetailsWrapper = ({defaultFilter, ...props}) => {
+ const gmp = useGmp();
+ const dispatch = useDispatch();
+ const match = useRouteMatch();
+
+ const {id: reportId, deltaid: deltaReportId} = match.params;
+ const deltaSel = useSelector(deltaAuditReportSelector, shallowEqual);
+ const entity = deltaSel.getEntity(reportId, deltaReportId);
+ const reportFilter = entity?.report?.filter;
+
+ return (
+ reloadInterval(entity)}
+ >
+ {({reload}) => (
+
+ )}
+
+ );
+};
+
+DeltaAuditReportDetailsWrapper.propTypes = {
+ defaultFilter: PropTypes.filter,
+};
+
+export default compose(
+ withDialogNotification,
+ withDownload,
+)(DeltaAuditReportDetailsWrapper);
\ No newline at end of file
diff --git a/src/web/pages/reports/auditdetailscontent.jsx b/src/web/pages/reports/auditdetailscontent.jsx
new file mode 100644
index 0000000000..9006567e62
--- /dev/null
+++ b/src/web/pages/reports/auditdetailscontent.jsx
@@ -0,0 +1,448 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+
+import React from 'react';
+
+import styled from 'styled-components';
+
+import useTranslation from 'web/hooks/useTranslation';
+
+import {TASK_STATUS} from 'gmp/models/task';
+
+import {isDefined} from 'gmp/utils/identity';
+
+import StatusBar from 'web/components/bar/statusbar';
+import ToolBar from 'web/components/bar/toolbar';
+
+import DateTime from 'web/components/date/datetime';
+
+import ErrorPanel from 'web/components/error/errorpanel';
+
+import ReportIcon from 'web/components/icon/reporticon';
+
+import Divider from 'web/components/layout/divider';
+import Layout from 'web/components/layout/layout';
+
+import Loading from 'web/components/loading/loading';
+
+import Powerfilter from 'web/components/powerfilter/powerfilter';
+
+import Tab from 'web/components/tab/tab';
+import TabLayout from 'web/components/tab/tablayout';
+import TabList from 'web/components/tab/tablist';
+import TabPanel from 'web/components/tab/tabpanel';
+import TabPanels from 'web/components/tab/tabpanels';
+import Tabs from 'web/components/tab/tabs';
+
+import Section from 'web/components/section/section';
+import SectionHeader from 'web/components/section/header';
+
+import EntityInfo from 'web/entity/info';
+import EntityTags from 'web/entity/tags';
+
+import PropTypes from 'web/utils/proptypes';
+import useGmp from 'web/hooks/useGmp';
+
+import ErrorsTab from './details/errorstab';
+import HostsTab from './details/hoststab';
+import OperatingSystemsTab from './details/operatingsystemstab';
+import ResultsTab from './details/resultstab';
+import Summary from './details/summary';
+import TabTitle from './details/tabtitle';
+import AuditThresholdPanel from './details/auditthresholdpanel';
+import TLSCertificatesTab from './details/tlscertificatestab';
+import ToolBarIcons from './details/toolbaricons';
+
+const Span = styled.span`
+ margin-top: 2px;
+`;
+
+const PageContent = ({
+ activeTab,
+ entity,
+ errorsCounts,
+ filters,
+ hostsCounts,
+ isLoading = true,
+ isLoadingFilters = true,
+ isUpdating = false,
+ operatingSystemsCounts,
+ pageFilter,
+ reportError,
+ reportFilter,
+ reportId,
+ resetFilter,
+ resultsCounts,
+ sorting,
+ showError,
+ showErrorMessage,
+ showSuccessMessage,
+ task,
+ tlsCertificatesCounts,
+ onActivateTab,
+ onAddToAssetsClick,
+ onTlsCertificateDownloadClick,
+ onError,
+ onFilterChanged,
+ onFilterCreated,
+ onFilterDecreaseMinQoDClick,
+ onFilterEditClick,
+ onFilterRemoveClick,
+ onFilterResetClick,
+ onInteraction,
+ onRemoveFromAssetsClick,
+ onReportDownloadClick,
+ onSortChange,
+ onTagSuccess,
+ onTargetEditClick,
+}) => {
+ const hasReport = isDefined(entity);
+
+ const report = hasReport ? entity.report : undefined;
+
+ const userTags = hasReport ? report.userTags : undefined;
+ const userTagsCount = isDefined(userTags) ? userTags.length : 0;
+ const gmp = useGmp();
+ const [_] = useTranslation();
+
+ const {
+ errors = {},
+ hosts = {},
+ operatingSystems = {},
+ results = {},
+ tlsCertificates = {},
+ timestamp,
+ scan_run_status,
+ } = report || {};
+
+ if (!hasReport && isDefined(reportError)) {
+ return (
+
+ );
+ }
+
+ const threshold = gmp.settings.reportResultsThreshold;
+
+ const showThresholdMessage =
+ !isLoading && hasReport && results.counts.filtered > threshold;
+
+ const isContainer = isDefined(task) && task.isContainer();
+ const status = isContainer ? TASK_STATUS.container : scan_run_status;
+ const progress = isDefined(task) ? task.progress : 0;
+
+ const showIsLoading = isLoading && !hasReport;
+
+ const showInitialLoading =
+ isLoading &&
+ !isDefined(reportError) &&
+ !showThresholdMessage &&
+ (!isDefined(results.entities) || results.entities.length === 0);
+
+ const header_title = (
+
+ {_('Audit Report:')}
+ {showIsLoading ? (
+ {_('Loading')}
+ ) : (
+
+
+
+
+
+
+ )}
+
+ );
+
+ const header = (
+ } title={header_title}>
+ {hasReport && }
+
+ );
+
+ return (
+
+
+
+
+
+
+
+
+
+ {showIsLoading ? (
+
+ ) : (
+
+
+
+ {_('Information')}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {hasReport ? (
+
+
+
+
+
+
+
+ onSortChange('results', sortField)
+ }
+ onTargetEditClick={onTargetEditClick}
+ />
+
+
+ {showInitialLoading ? (
+
+ ) : showThresholdMessage ? (
+
+ ) : (
+
+ onSortChange('hosts', sortField)
+ }
+ />
+ )}
+
+
+ {showInitialLoading ? (
+
+ ) : showThresholdMessage ? (
+
+ ) : (
+
+ onSortChange('os', sortField)
+ }
+ />
+ )}
+
+
+ {showInitialLoading ? (
+
+ ) : showThresholdMessage ? (
+
+ ) : (
+
+ onSortChange('tlscerts', sortField)
+ }
+ onTlsCertificateDownloadClick={
+ onTlsCertificateDownloadClick
+ }
+ />
+ )}
+
+
+
+ onSortChange('errors', sortField)
+ }
+ />
+
+
+
+
+
+
+ ) : (
+
+ )}
+
+ )}
+
+
+ );
+};
+
+PageContent.propTypes = {
+ activeTab: PropTypes.number,
+ applicationsCounts: PropTypes.counts,
+ closedCvesCounts: PropTypes.counts,
+ cvesCounts: PropTypes.counts,
+ entity: PropTypes.model,
+ errorsCounts: PropTypes.counts,
+ filters: PropTypes.array,
+ hostsCounts: PropTypes.counts,
+ isLoading: PropTypes.bool,
+ isLoadingFilters: PropTypes.bool,
+ isUpdating: PropTypes.bool,
+ operatingSystemsCounts: PropTypes.counts,
+ pageFilter: PropTypes.filter,
+ portsCounts: PropTypes.counts,
+ reportError: PropTypes.error,
+ reportFilter: PropTypes.filter,
+ reportId: PropTypes.id.isRequired,
+ resetFilter: PropTypes.filter,
+ resultsCounts: PropTypes.counts,
+ showError: PropTypes.func.isRequired,
+ showErrorMessage: PropTypes.func.isRequired,
+ showSuccessMessage: PropTypes.func.isRequired,
+ sorting: PropTypes.object,
+ task: PropTypes.model,
+ tlsCertificatesCounts: PropTypes.counts,
+ onActivateTab: PropTypes.func.isRequired,
+ onAddToAssetsClick: PropTypes.func.isRequired,
+ onError: PropTypes.func.isRequired,
+ onFilterChanged: PropTypes.func.isRequired,
+ onFilterCreated: PropTypes.func.isRequired,
+ onFilterDecreaseMinQoDClick: PropTypes.func.isRequired,
+ onFilterEditClick: PropTypes.func.isRequired,
+ onFilterRemoveClick: PropTypes.func.isRequired,
+ onFilterResetClick: PropTypes.func.isRequired,
+ onInteraction: PropTypes.func.isRequired,
+ onRemoveFromAssetsClick: PropTypes.func.isRequired,
+ onReportDownloadClick: PropTypes.func.isRequired,
+ onSortChange: PropTypes.func.isRequired,
+ onTagSuccess: PropTypes.func.isRequired,
+ onTargetEditClick: PropTypes.func.isRequired,
+ onTlsCertificateDownloadClick: PropTypes.func.isRequired,
+};
+
+export default PageContent;
\ No newline at end of file
diff --git a/src/web/pages/reports/auditdetailspage.jsx b/src/web/pages/reports/auditdetailspage.jsx
new file mode 100644
index 0000000000..b0585d6ffa
--- /dev/null
+++ b/src/web/pages/reports/auditdetailspage.jsx
@@ -0,0 +1,705 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+
+import React, {useEffect, useState} from 'react';
+
+import {useDispatch, useSelector, shallowEqual} from 'react-redux';
+
+import {useRouteMatch} from 'react-router-dom';
+
+import useTranslation from 'web/hooks/useTranslation';
+
+import logger from 'gmp/log';
+
+import Filter, {
+ ALL_FILTER,
+ RESET_FILTER,
+ RESULTS_FILTER_FILTER
+} from 'gmp/models/filter';
+import {isActive} from 'gmp/models/task';
+
+import {first} from 'gmp/utils/array';
+import {isDefined, hasValue} from 'gmp/utils/identity';
+
+import withDownload from 'web/components/form/withDownload';
+
+import Reload, {
+ NO_RELOAD,
+ USE_DEFAULT_RELOAD_INTERVAL_ACTIVE,
+} from 'web/components/loading/reload';
+
+import withDialogNotification from 'web/components/notification/withDialogNotifiaction'; // eslint-disable-line max-len
+
+import FilterProvider from 'web/entities/filterprovider';
+
+import DownloadReportDialog from 'web/pages/reports/downloadreportdialog';
+
+import {
+ loadAllEntities as loadFilters,
+ selector as filterSelector,
+} from 'web/store/entities/filters';
+
+import {
+ loadAllEntities as loadReportFormats,
+ selector as reportFormatsSelector,
+} from 'web/store/entities/reportformats';
+
+import {
+ loadAllEntities as loadReportConfigs,
+ selector as reportConfigsSelector,
+} from 'web/store/entities/reportconfigs';
+
+import {loadAuditReportWithThreshold} from 'web/store/entities/report/actions';
+import {auditReportSelector} from 'web/store/entities/report/selectors';
+
+import {
+ loadReportComposerDefaults,
+ renewSessionTimeout,
+ saveReportComposerDefaults,
+} from 'web/store/usersettings/actions';
+
+import {loadUserSettingDefaults} from 'web/store/usersettings/defaults/actions';
+import {getUserSettingsDefaults} from 'web/store/usersettings/defaults/selectors';
+import {getUserSettingsDefaultFilter} from 'web/store/usersettings/defaultfilters/selectors';
+
+import {
+ getReportComposerDefaults,
+ getUsername,
+} from 'web/store/usersettings/selectors';
+
+import {create_pem_certificate} from 'web/utils/cert';
+import compose from 'web/utils/compose';
+import {generateFilename} from 'web/utils/render';
+import PropTypes from 'web/utils/proptypes';
+
+import TargetComponent from '../targets/component';
+import PageTitle from 'web/components/layout/pagetitle';
+
+import Page from './auditdetailscontent';
+
+import FilterDialog from './detailsfilterdialog';
+import {pageFilter as setPageFilter} from 'web/store/pages/actions';
+import getPage from 'web/store/pages/selectors';
+import useGmp from 'web/hooks/useGmp';
+
+const log = logger.getLogger('web.pages.auditreport.detailspage');
+
+const DEFAULT_FILTER = Filter.fromString(
+ 'levels=hmlg rows=100 min_qod=70 first=1 compliance_levels=yniu sort=compliant',
+);
+
+export const AUDIT_REPORT_RESET_FILTER = RESET_FILTER.copy()
+ .setSortOrder('sort')
+ .setSortBy('compliant');
+
+const REPORT_FORMATS_FILTER = Filter.fromString('active=1 and trust=1 rows=-1');
+
+const getReportPageName = id => `report-${id}`;
+
+const getTarget = (entity = {}) => {
+ const {report = {}} = entity;
+ const {task = {}} = report;
+ return task.target;
+};
+
+const ReportDetails = props => {
+ const [activeTab, setActiveTab] = useState(0);
+ const [showFilterDialog, setShowFilterDialog] = useState(false);
+ const [showDownloadReportDialog, setShowDownloadReportDialog] =
+ useState(false);
+ const [sorting, setSorting] = useState({
+ results: {
+ sortField: 'compliant',
+ sortReverse: true,
+ },
+ hosts: {
+ sortField: 'compliant',
+ sortReverse: true,
+ },
+ os: {
+ sortField: 'compliant',
+ sortReverse: true,
+ },
+ tlscerts: {
+ sortField: 'dn',
+ sortReverse: false,
+ },
+ errors: {
+ sortField: 'error',
+ sortReverse: false,
+ },
+ });
+
+ const [entity, setEntity] = useState();
+ const [resultsCounts, setResultsCounts] = useState();
+ const [hostsCounts, setHostsCounts] = useState();
+ const [operatingSystemsCounts, setOperatingSystemsCounts] = useState();
+ const [tlsCertificatesCounts, setTlsCertificatesCounts] = useState();
+ const [reportFormatId, setReportFormatId] = useState();
+ const [errorsCounts, setErrorsCounts] = useState();
+ const [reportFilter, setReportFilter] = useState();
+ const [isUpdating, setIsUpdating] = useState(false);
+ // storeAsDefault is set in SaveDialogContent
+ // eslint-disable-next-line no-unused-vars
+ const [storeAsDefault, setStoreAsDefault] = useState();
+
+ const [_] = useTranslation();
+ const gmp = useGmp();
+ const dispatch = useDispatch();
+ const match = useRouteMatch();
+ const {id: reportId} = match.params;
+
+ const pSelector = useSelector(getPage, shallowEqual);
+ const pageFilter = pSelector?.getFilter(getReportPageName(reportId));
+
+ const [selectedEntity, reportError, isLoading] = useSelector(state => {
+ const reportSel = auditReportSelector(state);
+ return [
+ reportSel?.getEntity(reportId, pageFilter),
+ reportSel?.getEntityError(reportId, pageFilter),
+ reportSel?.isLoadingEntity(reportId, pageFilter),
+ ];
+ }, shallowEqual);
+
+ const userDefaultsSelector = useSelector(
+ getUserSettingsDefaults,
+ shallowEqual,
+ );
+ const reportExportFileName = userDefaultsSelector?.getValueByName(
+ 'reportexportfilename',
+ );
+
+ const reportFormatsSel = useSelector(reportFormatsSelector);
+ const reportConfigsSel = useSelector(reportConfigsSelector);
+ const reportFormats = reportFormatsSel?.getAllEntities(REPORT_FORMATS_FILTER);
+ const reportConfigs = reportConfigsSel?.getAllEntities(ALL_FILTER);
+ const reportComposerDefaults = useSelector(getReportComposerDefaults);
+ const userDefaultFilterSel = useSelector(
+ rootState => getUserSettingsDefaultFilter(rootState, 'result'),
+ shallowEqual,
+ );
+ const resultDefaultFilter = userDefaultFilterSel?.getFilter();
+ const username = useSelector(getUsername);
+
+ useEffect(() => {
+ dispatch(loadUserSettingDefaults(gmp)());
+ dispatch(loadFilters(gmp)(RESULTS_FILTER_FILTER));
+ dispatch(loadReportFormats(gmp)(REPORT_FORMATS_FILTER));
+ dispatch(loadReportConfigs(gmp)(ALL_FILTER));
+ dispatch(loadReportComposerDefaults(gmp)());
+
+ if (isDefined(selectedEntity)) {
+ setEntity(entity);
+ updateReportCounts(selectedEntity);
+ setReportFilter(props.reportFilter);
+ setIsUpdating(false);
+ } else {
+ setIsUpdating(true);
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+
+ useEffect(() => {
+ if (isDefined(selectedEntity)) {
+ // update only if a new report is available to avoid having no report
+ // when the filter changes
+ setEntity(selectedEntity);
+ updateReportCounts(selectedEntity);
+ setReportFilter(props.reportFilter);
+ setIsUpdating(false);
+ } else {
+ // report is not in the store and is currently loaded
+ setIsUpdating(true);
+ }
+ }, [selectedEntity, props.reportFilter]);
+
+ useEffect(() => {
+ if (
+ !isDefined(reportFormatId) &&
+ isDefined(reportFormats) &&
+ reportFormats.length > 0
+ ) {
+ // set initial report format id if available
+ const initialReportFormatId = first(reportFormats).id;
+ if (isDefined(initialReportFormatId)) {
+ // ensure the report format id is only set if we really have one
+ // if no report format id is available we would create an infinite
+ // render loop here
+ setReportFormatId({initialReportFormatId});
+ } else {
+ // if there is no report format at all, throw a proper error message
+ // instead of just showing x is undefined JS stacktrace
+ const noReportFormatError = _(
+ 'The report cannot be displayed because' +
+ ' no report format is available.' +
+ ' This could be due to a missing gvmd data feed. Please update' +
+ ' the gvmd data feed, check the "feed import owner" setting, the' +
+ ' feed status page, or contact your system administrator.',
+ );
+ throw new Error(noReportFormatError);
+ }
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [reportFormats, reportFormatId]);
+
+ useEffect(() => {
+ load();
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [reportId]);
+
+ const updateReportCounts = reportEntity => {
+ const {report = {}} = reportEntity;
+ const {
+ results = {},
+ hosts = {},
+ operatingSystems = {},
+ tlsCertificates = {},
+ errors = {},
+ } = report;
+
+ if (isDefined(results.counts)) {
+ setResultsCounts(results.counts);
+ }
+ if (isDefined(hosts.counts)) {
+ setHostsCounts(hosts.counts);
+ }
+ if (isDefined(operatingSystems.counts)) {
+ setOperatingSystemsCounts(operatingSystems.counts);
+ }
+ if (isDefined(tlsCertificates.counts)) {
+ setTlsCertificatesCounts(tlsCertificates.counts);
+ }
+ if (isDefined(errors.counts)) {
+ setErrorsCounts(errors.counts);
+ }
+ };
+
+ const load = newFilter => {
+ log.debug('Loading report', {
+ newFilter,
+ });
+ const {reportFilter: filter} = props;
+
+ setIsUpdating(!isDefined(filter) || !filter.equals(newFilter)); // show update indicator if filter has changed
+
+ props
+ .reload(newFilter)
+ .then(() => {
+ setIsUpdating(false);
+ })
+ .catch(() => {
+ setIsUpdating(false);
+ });
+ };
+
+ const reload = () => {
+ // reload data from backend
+ load(props.reportFilter);
+ };
+
+ const handleChanged = () => {
+ reload();
+ };
+
+ const handleError = error => {
+ const {showError} = props;
+ log.error(error);
+ showError(error);
+ };
+
+ const handleFilterChange = filter => {
+ handleInteraction();
+ load(filter);
+ };
+
+ const handleFilterRemoveClick = () => {
+ handleFilterChange(AUDIT_REPORT_RESET_FILTER);
+ };
+
+ const handleFilterResetClick = () => {
+ if (hasValue(resultDefaultFilter)) {
+ handleFilterChange(resultDefaultFilter);
+ } else {
+ handleFilterChange(DEFAULT_FILTER);
+ }
+ };
+
+ const handleActivateTab = index => {
+ handleInteraction();
+ setActiveTab(index);
+ };
+
+ const handleAddToAssets = () => {
+ const {showSuccessMessage, reportFilter: filter} = props;
+
+ handleInteraction();
+
+ gmp.auditreport.addAssets(selectedEntity, {filter}).then(() => {
+ showSuccessMessage(
+ _(
+ 'Report content added to Assets with QoD>=70% and Overrides enabled.',
+ ),
+ );
+ reload();
+ }, handleError);
+ };
+
+ const handleRemoveFromAssets = () => {
+ const {showSuccessMessage, reportFilter: filter} = props;
+
+ handleInteraction();
+
+ gmp.auditreport.removeAssets(selectedEntity, {filter}).then(() => {
+ showSuccessMessage(_('Report content removed from Assets.'));
+ reload();
+ }, handleError);
+ };
+
+ const handleFilterEditClick = () => {
+ handleInteraction();
+ setShowFilterDialog(true);
+ };
+
+ const handleFilterDialogClose = () => {
+ handleInteraction();
+ setShowFilterDialog(false);
+ };
+
+ const handleOpenDownloadReportDialog = () => {
+ setShowDownloadReportDialog(true);
+ };
+
+ const handleCloseDownloadReportDialog = () => {
+ setShowDownloadReportDialog(false);
+ };
+
+ const handleReportDownload = state => {
+ const {reportFilter: filter, onDownload} = props;
+
+ const {
+ includeNotes,
+ includeOverrides,
+ // eslint-disable-next-line no-shadow
+ reportFormatId,
+ // eslint-disable-next-line no-shadow
+ storeAsDefault,
+ } = state;
+
+ const newFilter = filter.copy();
+ newFilter.set('notes', includeNotes);
+ newFilter.set('overrides', includeOverrides);
+
+ if (storeAsDefault) {
+ const defaults = {
+ ...reportComposerDefaults,
+ defaultReportFormatId: reportFormatId,
+ includeNotes,
+ includeOverrides,
+ };
+ dispatch(saveReportComposerDefaults(gmp)(defaults));
+ }
+
+ const report_format = reportFormats
+ ? reportFormats.find(format => reportFormatId === format.id)
+ : undefined;
+
+ const extension = isDefined(report_format)
+ ? report_format.extension
+ : 'unknown'; // unknown should never happen but we should be save here
+
+ handleInteraction();
+
+ return gmp.auditreport
+ .download(selectedEntity, {
+ reportFormatId,
+ filter: newFilter,
+ })
+ .then(response => {
+ setShowDownloadReportDialog(false);
+ const {data} = response;
+ const filename = generateFilename({
+ creationTime: selectedEntity.creationTime,
+ extension,
+ fileNameFormat: reportExportFileName,
+ id: selectedEntity.id,
+ modificationTime: selectedEntity.modificationTime,
+ reportFormat: report_format?.name,
+ resourceName: selectedEntity.task.name,
+ resourceType: 'report',
+ username,
+ });
+
+ onDownload({filename, data});
+ }, handleError);
+ };
+
+ const handleTlsCertificateDownload = cert => {
+ const {onDownload} = props;
+
+ const {data, serial} = cert;
+
+ handleInteraction();
+
+ onDownload({
+ filename: 'tls-cert-' + serial + '.pem',
+ mimetype: 'application/x-x509-ca-cert',
+ data: create_pem_certificate(data),
+ });
+ };
+
+ const handleFilterCreated = filter => {
+ handleInteraction();
+ load(filter);
+ dispatch(loadFilters(gmp)(RESULTS_FILTER_FILTER));
+ };
+
+ const handleFilterDecreaseMinQoD = () => {
+ const {reportFilter: filter} = props;
+
+ handleInteraction();
+
+ if (filter.has('min_qod')) {
+ const lfilter = filter.copy();
+ lfilter.set('min_qod', 30);
+ load(lfilter);
+ }
+ };
+
+ const handleSortChange = (name, sortField) => {
+ handleInteraction();
+
+ const prev = sorting[name];
+
+ const sortReverse =
+ sortField === prev.sortField ? !prev.sortReverse : false;
+
+ const newSort = {
+ ...sorting,
+ [name]: {
+ sortField,
+ sortReverse,
+ },
+ };
+ setSorting(newSort);
+ };
+
+ const handleInteraction = () => dispatch(renewSessionTimeout(gmp)());
+
+ const loadTarget = () => {
+ const target = getTarget(selectedEntity);
+ return gmp.target.get({id: target.id});
+ };
+
+ const {showError, showErrorMessage, showSuccessMessage} = props;
+
+ const report = isDefined(entity) ? entity.report : undefined;
+
+ const threshold = gmp.settings.reportResultsThreshold;
+
+ const showThresholdMessage =
+ isDefined(report) && report.results.counts.filtered > threshold;
+
+ const [filters, isLoadingFilters] = useSelector(state => {
+ const filterSel = filterSelector(state);
+ return [
+ filterSel?.getAllEntities(RESULTS_FILTER_FILTER),
+ filterSel?.isLoadingAllEntities(RESULTS_FILTER_FILTER),
+ ];
+ });
+
+ return (
+
+
+
+ {({edit}) => (
+
+ loadTarget().then(response => edit(response.data))
+ }
+ onTlsCertificateDownloadClick={handleTlsCertificateDownload}
+ showError={showError}
+ showErrorMessage={showErrorMessage}
+ showSuccessMessage={showSuccessMessage}
+ />
+ )}
+
+ {showFilterDialog && (
+
+ )}
+ {showDownloadReportDialog && (
+
+ )}
+
+ );
+};
+
+ReportDetails.propTypes = {
+ location: PropTypes.object.isRequired,
+ reload: PropTypes.func.isRequired,
+ reportFilter: PropTypes.filter,
+ showError: PropTypes.func.isRequired,
+ showErrorMessage: PropTypes.func.isRequired,
+ showSuccessMessage: PropTypes.func.isRequired,
+ target: PropTypes.model,
+ username: PropTypes.string,
+ onDownload: PropTypes.func.isRequired,
+};
+
+const reloadInterval = report =>
+ isDefined(report) && isActive(report.report.scan_run_status)
+ ? USE_DEFAULT_RELOAD_INTERVAL_ACTIVE
+ : NO_RELOAD; // report doesn't change anymore. no need to reload
+
+const load =
+ ({
+ defaultFilter,
+ reportId,
+ // eslint-disable-next-line no-shadow
+ dispatch,
+ gmp,
+ match,
+ pageFilter,
+ reportFilter,
+ }) =>
+ filter => {
+ if (!hasValue(filter)) {
+ // use loaded filter after initial loading
+ filter = reportFilter;
+ }
+
+ if (!hasValue(filter)) {
+ // use filter from store
+ filter = pageFilter;
+ }
+
+ if (!hasValue(filter)) {
+ // use filter from user setting
+ filter = defaultFilter;
+ }
+
+ if (!hasValue(filter)) {
+ // use fallback filter
+ filter = DEFAULT_FILTER;
+ }
+ dispatch(setPageFilter(getReportPageName(match.params.id), filter));
+ return dispatch(loadAuditReportWithThreshold(gmp)(reportId, {filter}));
+ };
+
+const ReportDetailsWrapper = props => {
+ const dispatch = useDispatch();
+ const gmp = useGmp();
+ const match = useRouteMatch();
+
+ const {id: reportId} = match.params;
+ const reportSel = useSelector(auditReportSelector, shallowEqual);
+ const pSelector = useSelector(getPage, shallowEqual);
+
+ const pageFilter = pSelector.getFilter(getReportPageName(reportId));
+ const entity = reportSel.getEntity(reportId, pageFilter);
+ const reportFilter = entity?.report?.filter;
+
+ return (
+
+ {({filter}) => (
+ reloadInterval(entity)}
+ >
+ {({reload}) => (
+
+ )}
+
+ )}
+
+ );
+};
+
+export default compose(
+ withDialogNotification,
+ withDownload,
+)(ReportDetailsWrapper);
\ No newline at end of file
diff --git a/src/web/pages/reports/auditfilterdialog.jsx b/src/web/pages/reports/auditfilterdialog.jsx
new file mode 100644
index 0000000000..aa0db7183b
--- /dev/null
+++ b/src/web/pages/reports/auditfilterdialog.jsx
@@ -0,0 +1,134 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import React from 'react';
+
+import Layout from 'web/components/layout/layout';
+
+import useCapabilities from 'web/hooks/useCapabilities';
+
+import useTranslation from 'web/hooks/useTranslation';
+
+/* eslint-disable max-len */
+
+import CreateNamedFilterGroup from 'web/components/powerfilter/createnamedfiltergroup';
+import FilterStringGroup from 'web/components/powerfilter/filterstringgroup';
+import FirstResultGroup from 'web/components/powerfilter/firstresultgroup';
+import MinQodGroup from 'web/components/powerfilter/minqodgroup';
+import ResultsPerPageGroup from 'web/components/powerfilter/resultsperpagegroup';
+import SortByGroup from 'web/components/powerfilter/sortbygroup';
+import withFilterDialog from 'web/components/powerfilter/withFilterDialog';
+import FilterDialogPropTypes from 'web/components/powerfilter/dialogproptypes';
+import ComplianceLevelFilterGroup from 'web/components/powerfilter/compliancelevelsgroup';
+import FilterSearchGroup from 'web/components/powerfilter/filtersearchgroup';
+
+/* eslint-enable */
+
+const AuditReportFilterDialogComponent = ({
+ filter,
+ filterName,
+ filterstring,
+ onFilterChange,
+ saveNamedFilter,
+ onFilterStringChange,
+ onFilterValueChange,
+ onSearchTermChange,
+ onSortByChange,
+ onSortOrderChange,
+ onValueChange,
+}) => {
+ const [_] = useTranslation();
+ const capabilities = useCapabilities();
+ const handleRemoveCompliance = () =>
+ onFilterChange(filter.delete('report_compliance_levels'));
+ const SORT_FIELDS = [
+ {
+ name: 'date',
+ displayName: _('Date'),
+ },
+ {
+ name: 'status',
+ displayName: _('Status'),
+ },
+ {
+ name: 'task',
+ displayName: _('Task'),
+ },
+ {
+ name: 'compliant',
+ displayName: _('Compliant'),
+ },
+ {
+ name: 'compliance_yes',
+ displayName: _('Compliance: Yes'),
+ },
+ {
+ name: 'compliance_no',
+ displayName: _('Compliance: No'),
+ },
+ {
+ name: 'compliance_incomplete',
+ displayName: _('Compliance: Incomplete'),
+ },
+ ];
+
+ if (!filter) {
+ return null;
+ }
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {capabilities.mayCreate('filter') && (
+
+ )}
+
+ );
+};
+
+AuditReportFilterDialogComponent.propTypes = FilterDialogPropTypes;
+
+export default withFilterDialog()(AuditReportFilterDialogComponent);
\ No newline at end of file
diff --git a/src/web/pages/reports/auditreportrow.jsx b/src/web/pages/reports/auditreportrow.jsx
new file mode 100644
index 0000000000..28334e9b3d
--- /dev/null
+++ b/src/web/pages/reports/auditreportrow.jsx
@@ -0,0 +1,147 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+
+import React from 'react';
+
+import useTranslation from 'web/hooks/useTranslation';
+
+import {isDefined} from 'gmp/utils/identity';
+
+import {TASK_STATUS, isActive} from 'gmp/models/task';
+
+import StatusBar from 'web/components/bar/statusbar';
+
+import DateTime from 'web/components/date/datetime';
+
+import DeleteIcon from 'web/components/icon/deleteicon';
+import DeltaIcon from 'web/components/icon/deltaicon';
+import DeltaSecondIcon from 'web/components/icon/deltasecondicon';
+
+import IconDivider from 'web/components/layout/icondivider';
+
+import DetailsLink from 'web/components/link/detailslink';
+
+import TableData from 'web/components/table/data';
+import TableRow from 'web/components/table/row';
+
+import withEntitiesActions from 'web/entities/withEntitiesActions';
+
+import ComplianceBar from 'web/components/bar/compliancebar';
+
+import PropTypes from 'web/utils/proptypes';
+
+const Actions = withEntitiesActions(
+ ({entity, selectedDeltaReport, onReportDeleteClick, onReportDeltaSelect}) => {
+ const {report} = entity;
+
+ const scanActive = isActive(report.scan_run_status);
+
+ const [_] = useTranslation();
+ const title = scanActive ? _('Scan is active') : _('Delete Report');
+
+ return (
+
+ {isDefined(selectedDeltaReport) ? (
+ entity.id === selectedDeltaReport.id ? (
+
+ ) : (
+
+ )
+ ) : (
+
+ )}
+
+
+ );
+ },
+);
+
+Actions.propTypes = {
+ entity: PropTypes.model.isRequired,
+ selectedDeltaReport: PropTypes.model,
+ onReportDeleteClick: PropTypes.func.isRequired,
+ onReportDeltaSelect: PropTypes.func.isRequired,
+};
+
+const AuditRow = ({
+ actionsComponent: ActionsComponent = Actions,
+ entity,
+ links = true,
+ ...props
+}) => {
+ const {report} = entity;
+ const {scan_run_status, task} = report;
+
+ let status = scan_run_status;
+ let progress;
+
+ if (isDefined(task)) {
+ if (task.isContainer() && status !== TASK_STATUS.processing) {
+ status =
+ status === TASK_STATUS.interrupted
+ ? TASK_STATUS.uploadinginterrupted
+ : status === TASK_STATUS.running || status === TASK_STATUS.processing
+ ? TASK_STATUS.uploading
+ : TASK_STATUS.container;
+ }
+ progress = task.progress;
+ }
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {entity.task.name}
+
+
+
+
+
+
+ {report.complianceCounts.yes.filtered}
+ {report.complianceCounts.no.filtered}
+
+ {report.complianceCounts.incomplete.filtered}
+
+
+
+ );
+};
+
+AuditRow.propTypes = {
+ actionsComponent: PropTypes.component,
+ entity: PropTypes.model.isRequired,
+ links: PropTypes.bool,
+};
+
+export default AuditRow;
\ No newline at end of file
diff --git a/src/web/pages/reports/auditreportslistpage.jsx b/src/web/pages/reports/auditreportslistpage.jsx
new file mode 100644
index 0000000000..b12d3739a0
--- /dev/null
+++ b/src/web/pages/reports/auditreportslistpage.jsx
@@ -0,0 +1,169 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+
+import React, {useEffect, useState} from 'react';
+
+import {useHistory} from 'react-router-dom';
+
+import useTranslation from 'web/hooks/useTranslation';
+
+import Filter, {AUDIT_REPORTS_FILTER_FILTER} from 'gmp/models/filter';
+
+import {isActive} from 'gmp/models/task';
+
+import {isDefined} from 'gmp/utils/identity';
+
+import EntitiesPage from 'web/entities/page';
+import withEntitiesContainer from 'web/entities/withEntitiesContainer';
+
+import DashboardControls from 'web/components/dashboard/controls';
+
+import ManualIcon from 'web/components/icon/manualicon';
+import ReportIcon from 'web/components/icon/reporticon';
+
+import IconDivider from 'web/components/layout/icondivider';
+import PageTitle from 'web/components/layout/pagetitle';
+
+import {
+ USE_DEFAULT_RELOAD_INTERVAL,
+ USE_DEFAULT_RELOAD_INTERVAL_ACTIVE,
+} from 'web/components/loading/reload';
+
+import {
+ loadEntities,
+ selector as entitiesSelector,
+} from 'web/store/entities/auditreports';
+
+import PropTypes from 'web/utils/proptypes';
+
+import AuditFilterDialog from './auditfilterdialog';
+import AuditReportsTable from './auditreportstable';
+
+import AuditReportsDashboard, {
+ AUDIT_REPORTS_DASHBOARD_ID,
+} from './auditdashboard';
+
+const ToolBarIcons = () => {
+ const [_] = useTranslation();
+ return (
+
+
+
+ )
+};
+
+const AuditReportsPage = ({
+ filter,
+ onFilterChanged,
+ onInteraction,
+ onDelete,
+ ...props
+}) => {
+ const [selectedDeltaReport, setSelectedDeltaReport] = useState();
+ const [beforeSelectFilter, setBeforeSelectFilter] = useState();
+ const history = useHistory();
+ const [_] = useTranslation();
+
+ useEffect(() => {
+ if (
+ isDefined(selectedDeltaReport) &&
+ (!isDefined(filter) ||
+ filter.get('task_id') !== selectedDeltaReport.task.id)
+ ) {
+ // filter has changed. reset delta report selection
+ setSelectedDeltaReport();
+ }
+ }, [filter, selectedDeltaReport]);
+
+ const handleReportDeleteClick = onDelete;
+
+ const handleReportDeltaSelect = report => {
+ if (isDefined(selectedDeltaReport)) {
+ onFilterChanged(beforeSelectFilter);
+
+ history.push(
+ '/auditreport/delta/' + selectedDeltaReport.id + '/' + report.id,
+ );
+ } else {
+ if (!isDefined(filter)) {
+ filter = new Filter();
+ }
+
+ onFilterChanged(
+ filter
+ .copy()
+ .set('first', 1) // reset to first page
+ .set('task_id', report.task.id),
+ );
+ setSelectedDeltaReport(report);
+ setBeforeSelectFilter(filter);
+ }
+ };
+
+ return (
+
+
+ (
+
+ )}
+ dashboardControls={() => (
+
+ )}
+ filtersFilter={AUDIT_REPORTS_FILTER_FILTER}
+ filterEditDialog={AuditFilterDialog}
+ table={AuditReportsTable}
+ toolBarIcons={ToolBarIcons}
+ title={_('Audit Reports')}
+ sectionIcon={ }
+ filter={filter}
+ onFilterChanged={onFilterChanged}
+ onInteraction={onInteraction}
+ onReportDeltaSelect={handleReportDeltaSelect}
+ onReportDeleteClick={handleReportDeleteClick}
+ />
+
+ );
+};
+
+AuditReportsPage.propTypes = {
+ filter: PropTypes.filter,
+ history: PropTypes.object.isRequired,
+ onChanged: PropTypes.func.isRequired,
+ onDelete: PropTypes.func.isRequired,
+ onError: PropTypes.func.isRequired,
+ onFilterChanged: PropTypes.func.isRequired,
+ onInteraction: PropTypes.func.isRequired,
+};
+
+const reportsReloadInterval = ({entities = []}) =>
+ entities.some(entity => isActive(entity.report.scan_run_status))
+ ? USE_DEFAULT_RELOAD_INTERVAL_ACTIVE
+ : USE_DEFAULT_RELOAD_INTERVAL;
+
+const FALLBACK_AUDIT_REPORT_LIST_FILTER = Filter.fromString(
+ 'report_compliance_levels=yniu sort-reverse=date first=1',
+);
+
+export default withEntitiesContainer('auditreport', {
+ fallbackFilter: FALLBACK_AUDIT_REPORT_LIST_FILTER,
+ entitiesSelector,
+ loadEntities,
+ reloadInterval: reportsReloadInterval,
+ })(AuditReportsPage);
\ No newline at end of file
diff --git a/src/web/pages/reports/auditreportstable.jsx b/src/web/pages/reports/auditreportstable.jsx
new file mode 100644
index 0000000000..4608cf114f
--- /dev/null
+++ b/src/web/pages/reports/auditreportstable.jsx
@@ -0,0 +1,130 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import React from 'react';
+
+import {_l} from 'gmp/locale/lang';
+import useTranslation from 'web/hooks/useTranslation';
+
+import {isDefined} from 'gmp/utils/identity';
+
+import PropTypes from 'web/utils/proptypes';
+
+import {createEntitiesFooter} from 'web/entities/footer';
+import {createEntitiesTable} from 'web/entities/table';
+
+import ComplianceState from 'web/components/label/compliancestate';
+
+import TableHead from 'web/components/table/head';
+import TableHeader from 'web/components/table/header';
+import TableRow from 'web/components/table/row';
+
+import AuditReportRow from './auditreportrow';
+
+const Header = ({
+ actionsColumn,
+ sort = true,
+ currentSortBy,
+ currentSortDir,
+ onSortChange,
+}) => {
+ const [_] = useTranslation();
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {isDefined(actionsColumn) ? (
+ actionsColumn
+ ) : (
+
+ {_('Actions')}
+
+ )}
+
+
+ );
+};
+
+Header.propTypes = {
+ actionsColumn: PropTypes.element,
+ currentSortBy: PropTypes.string,
+ currentSortDir: PropTypes.string,
+ sort: PropTypes.bool,
+ onSortChange: PropTypes.func,
+};
+
+const Footer = createEntitiesFooter({
+ span: 10,
+ delete: true,
+});
+
+export default createEntitiesTable({
+ emptyTitle: _l('No reports available'),
+ header: Header,
+ footer: Footer,
+ row: AuditReportRow,
+ toggleDetailsIcon: false,
+});
\ No newline at end of file
diff --git a/src/web/pages/reports/deltadetailscontent.jsx b/src/web/pages/reports/deltadetailscontent.jsx
index 97141d8c48..b2379a4258 100644
--- a/src/web/pages/reports/deltadetailscontent.jsx
+++ b/src/web/pages/reports/deltadetailscontent.jsx
@@ -56,6 +56,7 @@ const Span = styled.span`
const PageContent = ({
activeTab,
+ audit = false,
entity,
entityError,
filter,
@@ -70,7 +71,6 @@ const PageContent = ({
task,
onActivateTab,
onAddToAssetsClick,
- onTlsCertificateDownloadClick,
onError,
onFilterAddLogLevelClick,
onFilterChanged,
@@ -92,7 +92,13 @@ const PageContent = ({
const {userTags = {}} = report;
const userTagsCount = userTags.length;
- const {results = {}, result_count = {}, timestamp, scan_run_status} = report;
+ const {
+ results = {},
+ complianceCounts = {},
+ result_count = {},
+ timestamp,
+ scan_run_status,
+ } = report;
const hasReport = isDefined(entity);
@@ -126,12 +132,13 @@ const PageContent = ({
);
- const {filtered} = result_count;
+ const {filtered} = audit ? complianceCounts : result_count;
return (
this.loadTarget().then(response => edit(response.data))
}
- onTlsCertificateDownloadClick={this.handleTlsCertificateDownload}
showError={showError}
showErrorMessage={showErrorMessage}
showSuccessMessage={showSuccessMessage}
diff --git a/src/web/pages/reports/details/__tests__/hoststab.jsx b/src/web/pages/reports/details/__tests__/hoststab.jsx
index f96cd8716c..d1ab375865 100644
--- a/src/web/pages/reports/details/__tests__/hoststab.jsx
+++ b/src/web/pages/reports/details/__tests__/hoststab.jsx
@@ -14,6 +14,7 @@ import {setTimezone, setUsername} from 'web/store/usersettings/actions';
import {rendererWith} from 'web/utils/testing';
import {getMockReport} from 'web/pages/reports/__mocks__/mockreport';
+import {getMockAuditReport} from 'web/pages/reports/__mocks__/mockauditreport';
import HostsTab from '../hoststab';
@@ -114,3 +115,107 @@ describe('Report Hosts Tab tests', () => {
);
});
});
+
+const auditfilter = Filter.fromString(
+ 'apply_overrides=0 levels=hmlg rows=3 min_qod=70 first=1 sort=compliant',
+);
+
+describe('Audit Report Hosts Tab tests', () => {
+ test('should render Audit Report Hosts Tab', () => {
+ const {hosts} = getMockAuditReport();
+
+ const onSortChange = testing.fn();
+ const onInteraction = testing.fn();
+
+ const {render, store} = rendererWith({
+ gmp,
+ capabilities: caps,
+ router: true,
+ store: true,
+ });
+
+ store.dispatch(setTimezone('CET'));
+ store.dispatch(setUsername('admin'));
+
+ const {baseElement, getAllByTestId} = render(
+ onSortChange('hosts', sortField)}
+ />,
+ );
+
+ const images = baseElement.querySelectorAll('img');
+ const links = baseElement.querySelectorAll('a');
+ const header = baseElement.querySelectorAll('th');
+ const rows = baseElement.querySelectorAll('tr');
+
+ const bars = getAllByTestId('progressbar-box');
+
+ // Headings
+ expect(header[0]).toHaveTextContent('IP Address');
+ expect(header[1]).toHaveTextContent('Hostname');
+ expect(header[2]).toHaveTextContent('OS');
+ expect(header[3]).toHaveTextContent('Ports');
+ expect(header[4]).toHaveTextContent('Apps');
+ expect(header[5]).toHaveTextContent('Distance');
+ expect(header[6]).toHaveTextContent('Auth');
+ expect(header[7]).toHaveTextContent('Start');
+ expect(header[8]).toHaveTextContent('End');
+ expect(header[9]).toHaveTextContent('Yes');
+ expect(header[10]).toHaveTextContent('No');
+ expect(header[11]).toHaveTextContent('Incomplete');
+ expect(header[12]).toHaveTextContent('Total');
+ expect(header[13]).toHaveTextContent('Compliant');
+
+ // Row 1
+ expect(links[13]).toHaveAttribute(
+ 'href',
+ '/hosts?filter=name%3D109.876.54.321',
+ ); // filter by name because host has no asset id
+ expect(links[13]).toHaveTextContent('109.876.54.321');
+ expect(rows[1]).toHaveTextContent('lorem.ipsum');
+ expect(images[0]).toHaveAttribute('src', '/img/os_unknown.svg');
+ expect(rows[1]).toHaveTextContent('1521'); // 15 Ports, 2 Apps, 1 Distance
+ expect(rows[1]).toHaveTextContent('Mon, Jun 3, 2019 1:15 PM CEST');
+ expect(rows[1]).toHaveTextContent('Mon, Jun 3, 2019 1:31 PM CEST');
+ expect(rows[1]).toHaveTextContent('170540'); // 17 Yes, 0 No, 5 Incomplete, 40 Total
+ expect(bars[0]).toHaveAttribute('title', 'Incomplete');
+ expect(bars[0]).toHaveTextContent('Incomplete');
+
+ // Row 2
+ expect(links[14]).toHaveAttribute('href', '/host/123');
+ expect(links[14]).toHaveTextContent('123.456.78.910');
+ expect(rows[2]).toHaveTextContent('foo.bar');
+ expect(images[0]).toHaveAttribute('src', '/img/os_unknown.svg');
+ expect(rows[2]).toHaveTextContent('1032'); // 10 Ports, 3 Apps, 2 Distance
+ expect(rows[2]).toHaveTextContent('Mon, Jun 3, 2019 1:00 PM CEST');
+ expect(rows[2]).toHaveTextContent('Mon, Jun 3, 2019 1:15 PM CEST');
+ expect(rows[2]).toHaveTextContent('7301450'); // 7 Yes, 30 No, 14 Incomplete, 50 Total
+ expect(bars[1]).toHaveAttribute('title', 'No');
+ expect(bars[1]).toHaveTextContent('No');
+
+ // Row 3
+ expect(links[15]).toHaveAttribute('href', '/host/123');
+ expect(links[15]).toHaveTextContent('123.456.78.810');
+ expect(rows[3]).toHaveTextContent('foo.bar');
+ expect(images[0]).toHaveAttribute('src', '/img/os_unknown.svg');
+ expect(rows[3]).toHaveTextContent('1032'); // 10 Ports, 3 Apps, 2 Distance
+ expect(rows[3]).toHaveTextContent('Mon, Jun 3, 2019 1:00 PM CEST');
+ expect(rows[3]).toHaveTextContent('Mon, Jun 3, 2019 1:15 PM CEST');
+ expect(rows[3]).toHaveTextContent('200020'); // 20 Yes, 0 No, 0 Incomplete, 20 Total
+ expect(bars[2]).toHaveAttribute('title', 'Yes');
+ expect(bars[2]).toHaveTextContent('Yes');
+
+ // Filter
+ expect(baseElement).toHaveTextContent(
+ '(Applied filter: apply_overrides=0 levels=hmlg rows=3 min_qod=70 first=1 sort=compliant)',
+ );
+ });
+});
diff --git a/src/web/pages/reports/details/__tests__/operatingsystemstab.jsx b/src/web/pages/reports/details/__tests__/operatingsystemstab.jsx
index cb382d0b38..fe335de140 100644
--- a/src/web/pages/reports/details/__tests__/operatingsystemstab.jsx
+++ b/src/web/pages/reports/details/__tests__/operatingsystemstab.jsx
@@ -13,6 +13,8 @@ import {rendererWith} from 'web/utils/testing';
import {getMockReport} from 'web/pages/reports/__mocks__/mockreport';
+import {getMockAuditReport} from 'web/pages/reports/__mocks__/mockauditreport';
+
import OperatingSystemsTab from '../operatingsystemstab';
const filter = Filter.fromString(
@@ -94,3 +96,84 @@ describe('Report Operating Systems Tab tests', () => {
);
});
});
+
+const auditfilter = Filter.fromString(
+ 'apply_overrides=0 levels=hmlg rows=3 min_qod=70 first=1 sort=compliant',
+);
+
+describe('Audit Report Operating Systems Tab tests', () => {
+ test('should render Audit Report Operating Systems Tab', () => {
+ const {operatingsystems} = getMockAuditReport();
+
+ const onSortChange = testing.fn();
+ const onInteraction = testing.fn();
+
+ const {render, store} = rendererWith({
+ router: true,
+ store: true,
+ });
+
+ store.dispatch(setTimezone('CET'));
+ store.dispatch(setUsername('admin'));
+
+ const {baseElement, getAllByTestId} = render(
+ ,
+ );
+
+ const images = baseElement.querySelectorAll('img');
+ const links = baseElement.querySelectorAll('a');
+ const header = baseElement.querySelectorAll('th');
+ const bars = getAllByTestId('progressbar-box');
+
+ // Headings
+ expect(header[0]).toHaveTextContent('Operating System');
+ expect(header[1]).toHaveTextContent('CPE');
+ expect(header[2]).toHaveTextContent('Hosts');
+ expect(header[3]).toHaveTextContent('Compliant');
+
+ // Row 1
+ expect(images[0]).toHaveAttribute('src', '/img/os_unknown.svg');
+ expect(links[4]).toHaveAttribute(
+ 'href',
+ '/operatingsystems?filter=name%3Dcpe%3A%2Ffoo%2Fbar',
+ );
+ expect(links[4]).toHaveTextContent('Foo OS');
+ expect(links[5]).toHaveAttribute(
+ 'href',
+ '/operatingsystems?filter=name%3Dcpe%3A%2Ffoo%2Fbar',
+ );
+ expect(links[5]).toHaveTextContent('cpe:/foo/bar');
+ expect(bars[0]).toHaveAttribute('title', 'No');
+ expect(bars[0]).toHaveTextContent('No');
+
+ // Row 2
+ expect(images[1]).toHaveAttribute('src', '/img/os_unknown.svg');
+ expect(links[6]).toHaveAttribute(
+ 'href',
+ '/operatingsystems?filter=name%3Dcpe%3A%2Florem%2Fipsum',
+ );
+ expect(links[6]).toHaveTextContent('Lorem OS');
+ expect(links[7]).toHaveAttribute(
+ 'href',
+ '/operatingsystems?filter=name%3Dcpe%3A%2Florem%2Fipsum',
+ );
+ expect(links[7]).toHaveTextContent('cpe:/lorem/ipsum');
+ expect(bars[1]).toHaveAttribute('title', 'Incomplete');
+ expect(bars[1]).toHaveTextContent('Incomplete');
+
+ // Filter
+ expect(baseElement).toHaveTextContent(
+ '(Applied filter: apply_overrides=0 levels=hmlg rows=3 min_qod=70 first=1 sort=compliant)',
+ );
+ });
+});
diff --git a/src/web/pages/reports/details/__tests__/resultstab.jsx b/src/web/pages/reports/details/__tests__/resultstab.jsx
new file mode 100644
index 0000000000..736267d6f8
--- /dev/null
+++ b/src/web/pages/reports/details/__tests__/resultstab.jsx
@@ -0,0 +1,369 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {describe, test, expect, testing} from '@gsa/testing';
+import React from 'react';
+
+import Filter from 'gmp/models/filter';
+
+import {setTimezone, setUsername} from 'web/store/usersettings/actions';
+import CollectionCounts from 'gmp/collection/collectioncounts';
+
+import {rendererWith, wait} from 'web/utils/testing';
+import Result from 'gmp/models/result';
+import {loadingActions} from 'web/store/usersettings/defaults/actions';
+import {defaultFilterLoadingActions} from 'web/store/usersettings/defaultfilters/actions';
+import {entitiesLoadingActions} from 'web/store/entities/results';
+
+import ResultsTab from '../resultstab';
+
+const reloadInterval = 1;
+const manualUrl = 'test/';
+
+// mock entities
+export const result1 = Result.fromElement({
+ _id: '101',
+ name: 'Result 1',
+ owner: {name: 'admin'},
+ comment: 'Comment 1',
+ creation_time: '2019-06-03T11:06:31Z',
+ modification_time: '2019-06-03T11:06:31Z',
+ host: {__text: '123.456.78.910', hostname: 'foo'},
+ port: '80/tcp',
+ nvt: {
+ _oid: '201',
+ type: 'nvt',
+ name: 'nvt1',
+ tags: 'solution_type=Mitigation',
+ refs: {ref: [{_type: 'cve', _id: 'CVE-2019-1234'}]},
+ },
+ threat: 'High',
+ severity: 10.0,
+ qod: {value: 80},
+ compliance: 'yes',
+});
+
+export const result2 = Result.fromElement({
+ _id: '102',
+ name: 'Result 2',
+ owner: {name: 'admin'},
+ comment: 'Comment 2',
+ creation_time: '2019-06-03T11:06:31Z',
+ modification_time: '2019-06-03T11:06:31Z',
+ host: {__text: '109.876.54.321'},
+ port: '80/tcp',
+ nvt: {
+ _oid: '202',
+ type: 'nvt',
+ name: 'nvt2',
+ tags: 'solution_type=VendorFix',
+ refs: {ref: [{_type: 'cve', _id: 'CVE-2019-5678'}]},
+ },
+ threat: 'Medium',
+ severity: 5.0,
+ qod: {value: 70},
+ compliance: 'no',
+});
+
+export const result3 = Result.fromElement({
+ _id: '103',
+ name: 'Result 3',
+ owner: {name: 'admin'},
+ comment: 'Comment 3',
+ creation_time: '2019-06-03T11:06:31Z',
+ modification_time: '2019-06-03T11:06:31Z',
+ host: {__text: '109.876.54.321', hostname: 'bar'},
+ port: '80/tcp',
+ nvt: {
+ _oid: '201',
+ type: 'nvt',
+ name: 'nvt1',
+ tags: 'solution_type=Mitigation',
+ refs: {ref: [{_type: 'cve', _id: 'CVE-2019-1234'}]},
+ solution: {
+ _type: 'Mitigation',
+ },
+ },
+ threat: 'Medium',
+ severity: 5.0,
+ qod: {value: 80},
+ compliance: 'incomplete',
+});
+
+const results = [result1, result2, result3];
+
+let currentSettings;
+let getAggregates;
+let getDashboardSetting;
+let getFilters;
+let getResults;
+
+beforeEach(() => {
+ // mock gmp commands
+
+ getResults = testing.fn().mockResolvedValue({
+ data: results,
+ meta: {
+ filter: Filter.fromString(),
+ counts: new CollectionCounts(),
+ },
+ });
+
+ getFilters = testing.fn().mockReturnValue(
+ Promise.resolve({
+ data: [],
+ meta: {
+ filter: Filter.fromString(),
+ counts: new CollectionCounts(),
+ },
+ }),
+ );
+
+ getDashboardSetting = testing.fn().mockResolvedValue({
+ data: [],
+ meta: {
+ filter: Filter.fromString(),
+ counts: new CollectionCounts(),
+ },
+ });
+
+ getAggregates = testing.fn().mockResolvedValue({
+ data: [],
+ meta: {
+ filter: Filter.fromString(),
+ counts: new CollectionCounts(),
+ },
+ });
+
+ currentSettings = testing.fn().mockResolvedValue({
+ foo: 'bar',
+ });
+});
+
+describe('Report Results Tab tests', () => {
+ test('should render Results Tab with compliance information', async () => {
+ const reload = testing.fn();
+ const onFilterAddLogLevelClick = testing.fn();
+ const onFilterDecreaseMinQoDClick = testing.fn();
+ const onFilterEditClick = testing.fn();
+ const onFilterRemoveClick = testing.fn();
+ const onFilterRemoveSeverityClick = testing.fn();
+ const onTargetEditClick = testing.fn();
+
+ const gmp = {
+ results: {
+ get: getResults,
+ getSeverityAggregates: getAggregates,
+ getWordCountsAggregates: getAggregates,
+ },
+ filters: {
+ get: getFilters,
+ },
+ dashboard: {
+ getSetting: getDashboardSetting,
+ },
+ settings: {manualUrl, reloadInterval},
+ user: {currentSettings},
+ };
+
+ const {render, store} = rendererWith({
+ gmp,
+ capabilities: true,
+ store: true,
+ router: true,
+ });
+
+ store.dispatch(setTimezone('CET'));
+ store.dispatch(setUsername('admin'));
+
+ const defaultSettingfilter = Filter.fromString('foo=bar');
+ store.dispatch(loadingActions.success({rowsperpage: {value: '2'}}));
+ store.dispatch(
+ defaultFilterLoadingActions.success('result', defaultSettingfilter),
+ );
+
+ const counts = new CollectionCounts({
+ first: 1,
+ all: 1,
+ filtered: 1,
+ length: 1,
+ rows: 10,
+ });
+ const filter = Filter.fromString('first=1 rows=10');
+ const loadedFilter = Filter.fromString('first=1 rows=10');
+ store.dispatch(
+ entitiesLoadingActions.success(results, filter, loadedFilter, counts),
+ );
+
+ const {baseElement} = render(
+ ,
+ );
+
+ await wait();
+
+ const header = baseElement.querySelectorAll('th');
+ const row = baseElement.querySelectorAll('tr');
+
+ expect(header[0]).toHaveTextContent('Vulnerability');
+ expect(header[2]).toHaveTextContent('Compliant');
+ expect(header[3]).toHaveTextContent('QoD');
+ expect(header[4]).toHaveTextContent('Host');
+ expect(header[5]).toHaveTextContent('Location');
+ expect(header[6]).toHaveTextContent('Created');
+ expect(header[7]).toHaveTextContent('IP');
+ expect(header[8]).toHaveTextContent('Name');
+
+ expect(row[2]).toHaveTextContent('Result 1');
+ expect(row[2]).toHaveTextContent('Yes');
+ expect(row[2]).toHaveTextContent('80 %');
+ expect(row[2]).toHaveTextContent('123.456.78.910');
+ expect(row[2]).toHaveTextContent('foo');
+ expect(row[2]).toHaveTextContent('80/tcp');
+ expect(row[2]).toHaveTextContent('Mon, Jun 3, 2019 1:06 PM CEST');
+
+ expect(row[3]).toHaveTextContent('Result 2');
+ expect(row[3]).toHaveTextContent('No');
+ expect(row[3]).toHaveTextContent('70 %');
+ expect(row[3]).toHaveTextContent('109.876.54.321');
+ expect(row[3]).toHaveTextContent('80/tcp');
+ expect(row[3]).toHaveTextContent('Mon, Jun 3, 2019 1:06 PM CEST');
+
+ expect(row[4]).toHaveTextContent('Result 3');
+ expect(row[4]).toHaveTextContent('Incomplete');
+ expect(row[4]).toHaveTextContent('80 %');
+ expect(row[4]).toHaveTextContent('109.876.54.321');
+ expect(row[4]).toHaveTextContent('bar');
+ expect(row[4]).toHaveTextContent('80/tcp');
+ expect(row[4]).toHaveTextContent('Mon, Jun 3, 2019 1:06 PM CEST');
+ });
+
+ test('should render Results Tab with compliance information', async () => {
+ const reload = testing.fn();
+ const onFilterAddLogLevelClick = testing.fn();
+ const onFilterDecreaseMinQoDClick = testing.fn();
+ const onFilterEditClick = testing.fn();
+ const onFilterRemoveClick = testing.fn();
+ const onFilterRemoveSeverityClick = testing.fn();
+ const onTargetEditClick = testing.fn();
+
+ const gmp = {
+ results: {
+ get: getResults,
+ getSeverityAggregates: getAggregates,
+ getWordCountsAggregates: getAggregates,
+ },
+ filters: {
+ get: getFilters,
+ },
+ dashboard: {
+ getSetting: getDashboardSetting,
+ },
+ settings: {manualUrl, reloadInterval},
+ user: {currentSettings},
+ };
+
+ const {render, store} = rendererWith({
+ gmp,
+ capabilities: true,
+ store: true,
+ router: true,
+ });
+
+ store.dispatch(setTimezone('CET'));
+ store.dispatch(setUsername('admin'));
+
+ const defaultSettingfilter = Filter.fromString('foo=bar');
+ store.dispatch(loadingActions.success({rowsperpage: {value: '2'}}));
+ store.dispatch(
+ defaultFilterLoadingActions.success('result', defaultSettingfilter),
+ );
+
+ const counts = new CollectionCounts({
+ first: 1,
+ all: 1,
+ filtered: 1,
+ length: 1,
+ rows: 10,
+ });
+ const filter = Filter.fromString('first=1 rows=10');
+ const loadedFilter = Filter.fromString('first=1 rows=10');
+ store.dispatch(
+ entitiesLoadingActions.success(results, filter, loadedFilter, counts),
+ );
+
+ const {baseElement} = render(
+ ,
+ );
+
+ await wait();
+
+ const header = baseElement.querySelectorAll('th');
+ const row = baseElement.querySelectorAll('tr');
+
+ expect(header[0]).toHaveTextContent('Vulnerability');
+ expect(header[2]).toHaveTextContent('Severity');
+ expect(header[3]).toHaveTextContent('QoD');
+ expect(header[4]).toHaveTextContent('Host');
+ expect(header[5]).toHaveTextContent('Location');
+ expect(header[6]).toHaveTextContent('Created');
+ expect(header[7]).toHaveTextContent('IP');
+ expect(header[8]).toHaveTextContent('Name');
+
+ expect(row[2]).toHaveTextContent('Result 1');
+ expect(row[2]).toHaveTextContent('10.0 (High)');
+ expect(row[2]).toHaveTextContent('80 %');
+ expect(row[2]).toHaveTextContent('123.456.78.910');
+ expect(row[2]).toHaveTextContent('foo');
+ expect(row[2]).toHaveTextContent('80/tcp');
+ expect(row[2]).toHaveTextContent('Mon, Jun 3, 2019 1:06 PM CEST');
+
+ expect(row[3]).toHaveTextContent('Result 2');
+ expect(row[3]).toHaveTextContent('5.0 (Medium)');
+ expect(row[3]).toHaveTextContent('70 %');
+ expect(row[3]).toHaveTextContent('109.876.54.321');
+ expect(row[3]).toHaveTextContent('80/tcp');
+ expect(row[3]).toHaveTextContent('Mon, Jun 3, 2019 1:06 PM CEST');
+
+ expect(row[4]).toHaveTextContent('Result 3');
+ expect(row[4]).toHaveTextContent('5.0 (Medium)');
+ expect(row[4]).toHaveTextContent('80 %');
+ expect(row[4]).toHaveTextContent('109.876.54.321');
+ expect(row[4]).toHaveTextContent('bar');
+ expect(row[4]).toHaveTextContent('80/tcp');
+ expect(row[4]).toHaveTextContent('Mon, Jun 3, 2019 1:06 PM CEST');
+ });
+});
diff --git a/src/web/pages/reports/details/auditthresholdpanel.jsx b/src/web/pages/reports/details/auditthresholdpanel.jsx
new file mode 100644
index 0000000000..d9b141a1b7
--- /dev/null
+++ b/src/web/pages/reports/details/auditthresholdpanel.jsx
@@ -0,0 +1,150 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import React from 'react';
+
+import styled from 'styled-components';
+
+import useTranslation from 'web/hooks/useTranslation';
+
+import Divider from 'web/components/layout/divider';
+
+import InfoPanel from 'web/components/panel/infopanel';
+
+import FilterIcon from 'web/components/icon/filtericon';
+
+import PropTypes from 'web/utils/proptypes';
+
+import ReportPanel from './reportpanel';
+import EditIcon from 'web/components/icon/editicon';
+import FootNote from 'web/components/footnote/footnote';
+import Layout from 'web/components/layout/layout';
+
+const UpdatingDivider = styled(({isUpdating, ...props}) => (
+
+))`
+ opacity: ${props => (props.isUpdating ? '0.2' : '1.0')};
+`;
+
+const AuditThresholdPanel = ({
+ entityType,
+ filter,
+ isUpdating = false,
+ threshold,
+ onFilterChanged,
+ onFilterEditClick,
+}) => {
+ const [_] = useTranslation();
+
+ const compliance = filter.get('compliance_levels', '');
+
+ const handleRemoveComplianceYes = () => {
+ if (compliance.includes('y')) {
+ const newCompliance = compliance.replace('y', '');
+ const lfilter = filter.copy();
+ lfilter.set('compliance_levels', newCompliance);
+
+ onFilterChanged(lfilter);
+ }
+ };
+
+ const handleRemoveComplianceUndefined = () => {
+ if (compliance.includes('u')) {
+ const newCompliance = compliance.replace('u', '');
+ const lfilter = filter.copy();
+ lfilter.set('compliance_levels', newCompliance);
+
+ onFilterChanged(lfilter);
+ }
+ };
+
+ const handleRemoveComplianceIncomplete = () => {
+ if (compliance.includes('i')) {
+ const newCompliance = compliance.replace('i', '');
+ const lfilter = filter.copy();
+ lfilter.set('compliance_levels', newCompliance);
+
+ onFilterChanged(lfilter);
+ }
+ };
+
+ return (
+
+
+
+ {compliance.includes('y') && (
+ }
+ title={_('Results with compliance "Yes" are currently included.')}
+ onClick={handleRemoveComplianceYes}
+ >
+ {_('Filter out results with compliance "Yes".')}
+
+ )}
+ {compliance.includes('u') && (
+ }
+ title={_(
+ 'Results with compliance "Undefined" are currently included.',
+ )}
+ onClick={handleRemoveComplianceUndefined}
+ >
+ {_('Filter out results with compliance "Undefined".')}
+
+ )}
+ {compliance.includes('i') && (
+ }
+ title={_(
+ 'Results with compliance "Incomplete" are currently included.',
+ )}
+ onClick={handleRemoveComplianceIncomplete}
+ >
+ {_('Filter out results with compliance "Incomplete".')}
+
+ )}
+ }
+ title={_('Your filter settings may be too unrefined.')}
+ onClick={onFilterEditClick}
+ >
+ {_('Adjust and update your filter settings.')}
+
+
+
+
+ {_('(Applied filter: {{- filter}})', {
+ filter: filter.simple().toFilterString(),
+ })}
+
+
+
+ );
+};
+
+AuditThresholdPanel.propTypes = {
+ entityType: PropTypes.string.isRequired,
+ filter: PropTypes.filter.isRequired,
+ isUpdating: PropTypes.bool,
+ threshold: PropTypes.number.isRequired,
+ onFilterChanged: PropTypes.func.isRequired,
+ onFilterEditClick: PropTypes.func.isRequired,
+};
+
+export default AuditThresholdPanel;
diff --git a/src/web/pages/reports/details/deltaresultstab.jsx b/src/web/pages/reports/details/deltaresultstab.jsx
index 4b3a52a4ba..95d37996df 100644
--- a/src/web/pages/reports/details/deltaresultstab.jsx
+++ b/src/web/pages/reports/details/deltaresultstab.jsx
@@ -32,9 +32,11 @@ const resultsSortFunctions = {
severity: makeCompareSeverity(),
solution_type: makeCompareString(entity => entity.nvt.solution?.type),
vulnerability: makeCompareString('vulnerability'),
+ compliant: makeCompareString('compliance'),
};
const ResultsTab = ({
+ audit = false,
counts,
delta = false,
filter,
@@ -99,6 +101,7 @@ const ResultsTab = ({
onPreviousClick,
}) => (
- {!levels.includes('g') && (
+ {!levels.includes('g') && isDefined(onFilterAddLogLevelClick) && (
}
title={_('Log messages are currently excluded.')}
@@ -66,7 +66,7 @@ const EmptyResultsReport = ({
)}
- {has_severity_filter && (
+ {has_severity_filter && isDefined(onFilterRemoveSeverityClick) && (
}
title={_(
@@ -117,11 +117,11 @@ const EmptyResultsReport = ({
EmptyResultsReport.propTypes = {
all: PropTypes.number.isRequired,
filter: PropTypes.filter.isRequired,
- onFilterAddLogLevelClick: PropTypes.func.isRequired,
+ onFilterAddLogLevelClick: PropTypes.func,
onFilterDecreaseMinQoDClick: PropTypes.func.isRequired,
onFilterEditClick: PropTypes.func.isRequired,
onFilterRemoveClick: PropTypes.func.isRequired,
- onFilterRemoveSeverityClick: PropTypes.func.isRequired,
+ onFilterRemoveSeverityClick: PropTypes.func,
};
export default EmptyResultsReport;
diff --git a/src/web/pages/reports/details/hoststab.jsx b/src/web/pages/reports/details/hoststab.jsx
index 5da00be099..60095d019e 100644
--- a/src/web/pages/reports/details/hoststab.jsx
+++ b/src/web/pages/reports/details/hoststab.jsx
@@ -37,9 +37,17 @@ const hostsSortFunctions = {
start: makeCompareDate(entity => entity.start),
end: makeCompareDate(entity => entity.end),
total: makeCompareNumber(entity => entity.result_counts.total),
+ complianceYes: makeCompareNumber(entity => entity.complianceCounts.yes),
+ complianceNo: makeCompareNumber(entity => entity.complianceCounts.no),
+ complianceIncomplete: makeCompareNumber(
+ entity => entity.complianceCounts.incomplete,
+ ),
+ complianceTotal: makeCompareNumber(entity => entity.complianceCounts.total),
+ compliant: makeCompareString('hostCompliance'),
};
const HostsTab = ({
+ audit = false,
counts,
hosts,
filter,
@@ -69,6 +77,7 @@ const HostsTab = ({
onPreviousClick,
}) => (
(
+const Header = ({
+ audit = false,
+ currentSortBy,
+ currentSortDir,
+ sort = true,
+ onSortChange,
+}) => (
(
onSortChange={onSortChange}
title={_('End')}
/>
-
-
-
-
-
-
-
+ {audit ? (
+
+ ) : (
+
+ )}
+ {audit ? (
+
+ ) : (
+
+ )}
+ {audit ? (
+
+ ) : (
+
+ )}
+ {!audit && (
+
+ )}
+ {!audit && (
+
+ )}
+ {audit ? (
+
+ ) : (
+
+ )}
+ {audit ? (
+
+ ) : (
+
+ )}
);
Header.propTypes = {
+ audit: PropTypes.bool,
currentSortBy: PropTypes.string,
currentSortDir: PropTypes.string,
sort: PropTypes.bool,
@@ -206,14 +273,16 @@ const renderAuthIcons = authSuccess => {
);
};
-const Row = ({entity, links = true}) => {
+const Row = ({entity, links = true, audit = false}) => {
const {
asset = {},
authSuccess,
details = {},
end,
+ hostCompliance,
ip,
result_counts = {},
+ complianceCounts = {},
severity,
start,
portsCount,
@@ -251,20 +320,43 @@ const Row = ({entity, links = true}) => {
- {result_counts.high}
- {result_counts.warning}
- {result_counts.info}
- {result_counts.log}
- {result_counts.false_positive}
- {result_counts.total}
-
-
-
+ {audit ? (
+ {complianceCounts.yes}
+ ) : (
+ {result_counts.high}
+ )}
+ {audit ? (
+ {complianceCounts.no}
+ ) : (
+ {result_counts.warning}
+ )}
+ {audit ? (
+ {complianceCounts.incomplete}
+ ) : (
+ {result_counts.info}
+ )}
+ {!audit && {result_counts.log} }
+ {!audit && {result_counts.false_positive} }
+ {audit ? (
+ {complianceCounts.total}
+ ) : (
+ {result_counts.total}
+ )}
+ {audit ? (
+
+
+
+ ) : (
+
+
+
+ )}
);
};
Row.propTypes = {
+ audit: PropTypes.bool,
entity: PropTypes.object.isRequired,
links: PropTypes.bool,
};
diff --git a/src/web/pages/reports/details/operatingsystemstab.jsx b/src/web/pages/reports/details/operatingsystemstab.jsx
index 66dca4b897..86f04fa524 100644
--- a/src/web/pages/reports/details/operatingsystemstab.jsx
+++ b/src/web/pages/reports/details/operatingsystemstab.jsx
@@ -18,9 +18,11 @@ const operatingssystemsSortFunctions = {
cpe: makeCompareString('id'),
hosts: makeCompareNumber(entity => entity.hosts.count),
severity: makeCompareNumber('severity', 0),
+ compliant: makeCompareString('compliance'),
};
const OperatingSystemsTab = ({
+ audit = false,
counts,
filter,
operatingsystems,
@@ -50,6 +52,7 @@ const OperatingSystemsTab = ({
onPreviousClick,
}) => (
(
+const Header = ({
+ audit = false,
+ currentSortDir,
+ currentSortBy,
+ sort = true,
+ onSortChange,
+}) => (
(
onSortChange={onSortChange}
title={_('Hosts')}
/>
-
+ {audit ? (
+
+ ) : (
+
+ )}
);
Header.propTypes = {
+ audit: PropTypes.bool,
currentSortBy: PropTypes.string,
currentSortDir: PropTypes.string,
sort: PropTypes.bool,
onSortChange: PropTypes.func,
};
-const Row = ({entity, links = true}) => {
- const {name, cpe, hosts, severity} = entity;
+const Row = ({audit = false, entity, links = true}) => {
+ const {name, cpe, hosts, severity, compliance} = entity;
return (
@@ -86,14 +106,21 @@ const Row = ({entity, links = true}) => {
{hosts.count}
-
-
-
+ {audit && isDefined(compliance) ? (
+
+
+
+ ) : (
+
+
+
+ )}
);
};
Row.propTypes = {
+ audit: PropTypes.bool,
entity: PropTypes.object.isRequired,
links: PropTypes.bool,
};
diff --git a/src/web/pages/reports/details/resultstab.jsx b/src/web/pages/reports/details/resultstab.jsx
index 37371e83b5..0acc2e8d24 100644
--- a/src/web/pages/reports/details/resultstab.jsx
+++ b/src/web/pages/reports/details/resultstab.jsx
@@ -148,6 +148,7 @@ class ResultsTab extends React.Component {
render() {
const {isUpdating, results, resultsCounts} = this.state;
const {
+ audit = false,
hasTarget,
isLoading = true,
progress,
@@ -225,6 +226,7 @@ class ResultsTab extends React.Component {
}
return (
isActive(status) ? USE_DEFAULT_RELOAD_INTERVAL_ACTIVE : NO_RELOAD; // report doesn't change anymore. no need to reload
-const loadInitial = ({
- reportFilter,
- reportId,
- resultsFilter,
- // eslint-disable-next-line no-shadow
- loadResults,
- updateFilter,
-}) => () => {
- let newFilter = resultsFilter;
-
- if (isDefined(resultsFilter) && isDefined(reportFilter)) {
- const simplifiedResultsFilter = resultsFilter
- .copy()
- .delete(resultsFilter.getSortOrder())
- .delete('first')
- .delete('_and_report_id');
- const simplifiedReportFilter = reportFilter
- .copy()
- .delete(reportFilter.getSortOrder())
- .delete('first');
-
- if (!simplifiedReportFilter.equals(simplifiedResultsFilter)) {
- // report filter has changed
+const loadInitial =
+ ({
+ reportFilter,
+ reportId,
+ resultsFilter,
+ // eslint-disable-next-line no-shadow
+ loadResults,
+ updateFilter,
+ }) =>
+ () => {
+ let newFilter = resultsFilter;
+
+ if (isDefined(resultsFilter) && isDefined(reportFilter)) {
+ const simplifiedResultsFilter = resultsFilter
+ .copy()
+ .delete(resultsFilter.getSortOrder())
+ .delete('first')
+ .delete('_and_report_id');
+ const simplifiedReportFilter = reportFilter
+ .copy()
+ .delete(reportFilter.getSortOrder())
+ .delete('first');
+
+ if (!simplifiedReportFilter.equals(simplifiedResultsFilter)) {
+ // report filter has changed
+ newFilter = reportFilter;
+ }
+ } else if (isDefined(resultsFilter)) {
+ newFilter = resultsFilter;
+ } else {
newFilter = reportFilter;
}
- } else if (isDefined(resultsFilter)) {
- newFilter = resultsFilter;
- } else {
- newFilter = reportFilter;
- }
- newFilter = filterWithReportId(newFilter, reportId);
- updateFilter(newFilter);
+ newFilter = filterWithReportId(newFilter, reportId);
+ updateFilter(newFilter);
- return loadResults(newFilter);
-};
+ return loadResults(newFilter);
+ };
-const load = ({
- reportFilter,
- reportId,
- resultsFilter,
- // eslint-disable-next-line no-shadow
- loadResults,
- updateFilter,
-}) => newFilter => {
- if (!hasValue(newFilter)) {
- newFilter = resultsFilter;
- }
+const load =
+ ({
+ reportFilter,
+ reportId,
+ resultsFilter,
+ // eslint-disable-next-line no-shadow
+ loadResults,
+ updateFilter,
+ }) =>
+ newFilter => {
+ if (!hasValue(newFilter)) {
+ newFilter = resultsFilter;
+ }
- if (!hasValue(newFilter)) {
- newFilter = reportFilter;
- }
+ if (!hasValue(newFilter)) {
+ newFilter = reportFilter;
+ }
- newFilter = filterWithReportId(newFilter, reportId);
- updateFilter(newFilter);
+ newFilter = filterWithReportId(newFilter, reportId);
+ updateFilter(newFilter);
- return loadResults(newFilter);
-};
+ return loadResults(newFilter);
+ };
const ResultsTabWrapper = props => (
{
export default compose(
withGmp,
connect(mapStateToProps, mapDispatchToProps),
-)(ResultsTabWrapper);
-
-// vim: set ts=2 sw=2 tw=80:
+)(ResultsTabWrapper);
\ No newline at end of file
diff --git a/src/web/pages/reports/details/toolbaricons.jsx b/src/web/pages/reports/details/toolbaricons.jsx
index 3caadaef46..7a61def7f5 100644
--- a/src/web/pages/reports/details/toolbaricons.jsx
+++ b/src/web/pages/reports/details/toolbaricons.jsx
@@ -33,6 +33,7 @@ import PropTypes from 'web/utils/proptypes';
import AlertActions from './alertactions';
const ToolBarIcons = ({
+ audit = false,
delta = false,
filter,
isLoading,
@@ -56,7 +57,11 @@ const ToolBarIcons = ({
anchor="reading-a-report"
title={_('Help: Reading Reports')}
/>
-
+ {audit ? (
+
+ ) : (
+
+ )}
{!isLoading && (
@@ -86,13 +91,15 @@ const ToolBarIcons = ({
>
-
-
-
+ {!audit && (
+
+
+
+ )}
{!delta && (
{
const result_hosts_only = filter.get('result_hosts_only');
const handleRemoveLevels = () => onFilterChange(filter.delete('levels'));
+ const handleRemoveCompliance = () =>
+ onFilterChange(filter.delete('compliance_levels'));
+
return (
)}
-
+ {!audit && (
+
+ )}
-
+ {audit ? (
+
+ ) : (
+
+ )}
-
+ {!audit && (
+
+ )}
diff --git a/src/web/pages/results/__tests__/row.jsx b/src/web/pages/results/__tests__/row.jsx
index e061adf30e..b8f6b103cf 100644
--- a/src/web/pages/results/__tests__/row.jsx
+++ b/src/web/pages/results/__tests__/row.jsx
@@ -142,3 +142,147 @@ describe('Delta reports V2 with same severity, qod and hostname', () => {
expect(icons.length).toBe(0);
});
});
+
+describe('Audit reports with compliance', () => {
+ const {render} = rendererWith({gmp, store: true});
+
+ test('should render Audit report with compliance yes', () => {
+ const entity = Result.fromElement({
+ _id: '101',
+ name: 'Result 1',
+ host: {__text: '123.456.78.910', hostname: 'foo'},
+ port: '80/tcp',
+ severity: 10.0,
+ qod: {value: 80},
+ notes: [],
+ overrides: [],
+ tickets: [],
+ compliance: 'yes',
+ });
+
+ const {getAllByTestId} = render(
+ ,
+ );
+ const bars = getAllByTestId('progressbar-box');
+
+ expect(bars[0]).toHaveAttribute('title', 'Yes');
+ expect(bars[0]).toHaveTextContent('Yes');
+ });
+
+ test('should render Audit report with compliance no', () => {
+ const entity = Result.fromElement({
+ _id: '101',
+ name: 'Result 1',
+ host: {__text: '123.456.78.910', hostname: 'foo'},
+ port: '80/tcp',
+ severity: 10.0,
+ qod: {value: 80},
+ notes: [],
+ overrides: [],
+ tickets: [],
+ compliance: 'no',
+ });
+
+ const {getAllByTestId} = render(
+ ,
+ );
+ const bars = getAllByTestId('progressbar-box');
+ expect(bars[0]).toHaveAttribute('title', 'No');
+ expect(bars[0]).toHaveTextContent('No');
+ });
+
+ test('should render Audit report with compliance incomplete', () => {
+ const entity = Result.fromElement({
+ _id: '101',
+ name: 'Result 1',
+ host: {__text: '123.456.78.910', hostname: 'foo'},
+ port: '80/tcp',
+ severity: 10.0,
+ qod: {value: 80},
+ notes: [],
+ overrides: [],
+ tickets: [],
+ compliance: 'incomplete',
+ });
+
+ const {getAllByTestId} = render(
+ ,
+ );
+ const bars = getAllByTestId('progressbar-box');
+ expect(bars[0]).toHaveAttribute('title', 'Incomplete');
+ expect(bars[0]).toHaveTextContent('Incomplete');
+ });
+
+ test('should render Audit report with compliance undefined', () => {
+ const entity = Result.fromElement({
+ _id: '101',
+ name: 'Result 1',
+ host: {__text: '123.456.78.910', hostname: 'foo'},
+ port: '80/tcp',
+ severity: 10.0,
+ qod: {value: 80},
+ notes: [],
+ overrides: [],
+ tickets: [],
+ compliance: 'undefined',
+ });
+
+ const {getAllByTestId} = render(
+ ,
+ );
+ const bars = getAllByTestId('progressbar-box');
+ expect(bars[0]).toHaveAttribute('title', 'Undefined');
+ expect(bars[0]).toHaveTextContent('Undefined');
+ });
+
+ test('Delta audit report with changed compliance', () => {
+ const entity = Result.fromElement({
+ _id: '101',
+ name: 'Result 1',
+ host: {__text: '123.456.78.910', hostname: 'foo'},
+ port: '80/tcp',
+ severity: 10.0,
+ qod: {value: 80},
+ notes: [],
+ overrides: [],
+ tickets: [],
+ compliance: 'undefined',
+ delta: {
+ delta_type: 'changed',
+ result: {
+ compliance: 'yes',
+ },
+ },
+ });
+
+ const {getAllByTestId} = render(
+ ,
+ );
+ const icons = getAllByTestId('svg-icon');
+ expect(icons.length).toEqual(1);
+ expect(icons[0]).toHaveAttribute(
+ 'title',
+ 'Compliance is changed from yes.',
+ );
+ });
+});
diff --git a/src/web/pages/results/row.jsx b/src/web/pages/results/row.jsx
index addef1f093..18ee6ad6ed 100644
--- a/src/web/pages/results/row.jsx
+++ b/src/web/pages/results/row.jsx
@@ -13,6 +13,7 @@ import {isDefined, isNumber} from 'gmp/utils/identity';
import {shorten} from 'gmp/utils/string';
import SeverityBar from 'web/components/bar/severitybar';
+import ComplianceBar from 'web/components/bar/compliancebar';
import DateTime from 'web/components/date/datetime';
@@ -42,6 +43,7 @@ import useGmp from "web/hooks/useGmp";
const Row = ({
actionsComponent: ActionsComponent = EntitiesActions,
+ audit = false,
delta = false,
entity,
links = true,
@@ -59,6 +61,7 @@ const Row = ({
entity.overrides.filter(override => override.isActive()).length > 0;
const hasTickets = entity.tickets.length > 0;
const deltaSeverity = entity.delta?.result?.severity;
+ const deltaCompliance = entity.delta?.result?.compliance;
const deltaHostname = entity.delta?.result?.host?.hostname;
const deltaQoD = entity.delta?.result?.qod?.value;
const epssScore = entity?.information?.epss?.max_severity?.score
@@ -95,16 +98,30 @@ const Row = ({
)}
-
-
- {isDefined(deltaSeverity) && entity.severity !== deltaSeverity && (
-
- )}
-
+ {audit ? (
+
+
+ {isDefined(deltaCompliance) &&
+ entity.compliance !== deltaCompliance && (
+
+ )}
+
+ ) : (
+
+ { }
+ {isDefined(deltaSeverity) && entity.severity !== deltaSeverity && (
+
+ )}
+
+ )}
@@ -165,6 +182,7 @@ const Row = ({
Row.propTypes = {
actionsComponent: PropTypes.component,
+ audit: PropTypes.bool,
delta: PropTypes.bool,
entity: PropTypes.model.isRequired,
links: PropTypes.bool,
diff --git a/src/web/pages/results/table.jsx b/src/web/pages/results/table.jsx
index 30e4344b04..ff936cba57 100644
--- a/src/web/pages/results/table.jsx
+++ b/src/web/pages/results/table.jsx
@@ -30,6 +30,7 @@ import useGmp from "web/hooks/useGmp";
const Header = ({
actionsColumn,
+ audit = false,
delta = false,
links = true,
sort = true,
@@ -72,15 +73,27 @@ const Header = ({
)}
-
+ {audit ? (
+
+ ) : (
+
+ )}
(
+}) => {
+ const caps = useCapabilities();
+ const displayIds = [
+ ...ALL_DISPLAYS,
+ ...(caps.featureEnabled('COMPLIANCE_REPORTS')
+ ? AUDIT_REPORTS_DISPLAYS
+ : [])
+ ];
+ return (
-);
+)};
StartDashboard.propTypes = {
id: PropTypes.id.isRequired,
diff --git a/src/web/pages/tags/component.jsx b/src/web/pages/tags/component.jsx
index 870f8eaf47..fa868aaa99 100644
--- a/src/web/pages/tags/component.jsx
+++ b/src/web/pages/tags/component.jsx
@@ -29,6 +29,7 @@ export const MAX_RESOURCES = 40; // concerns listing in "Assigned Resources" tab
const TYPES = [
'alert',
+ 'audit',
'host',
'operatingsystem',
'cpe',
@@ -42,6 +43,7 @@ const TYPES = [
'nvt',
'override',
'permission',
+ 'policy',
'portlist',
'report',
'reportconfig',
@@ -106,7 +108,13 @@ class TagComponent extends React.Component {
getResourceTypes() {
const {capabilities} = this.props;
- return TYPES.map(type =>
+ const types = [
+ ...TYPES,
+ ...(capabilities.featureEnabled('COMPLIANCE_REPORTS')
+ ? ['auditreport']
+ : [])
+ ].sort();
+ return types.map(type =>
capabilities.mayAccess(type) ? [type, typeName(type)] : undefined,
).filter(isDefined);
}
diff --git a/src/web/pages/tags/dialog.jsx b/src/web/pages/tags/dialog.jsx
index 7499f94073..003d738620 100644
--- a/src/web/pages/tags/dialog.jsx
+++ b/src/web/pages/tags/dialog.jsx
@@ -42,6 +42,7 @@ const ScrollableContent = styled.div`
`;
const types = {
+ auditreport: 'audit_report',
operatingsystem: 'os',
certbund: 'cert_bund_adv',
dfncert: 'dfn_cert_adv',
diff --git a/src/web/pages/tasks/status.jsx b/src/web/pages/tasks/status.jsx
index 03a6778574..8fcf3cb9d8 100644
--- a/src/web/pages/tasks/status.jsx
+++ b/src/web/pages/tasks/status.jsx
@@ -23,7 +23,7 @@ const StyledDetailsLink = styled(DetailsLink)`
}
`;
-const TaskStatus = ({task, links = true}) => {
+const TaskStatus = ({task, links = true, isAudit = false}) => {
let report_id;
if (isDefined(task.current_report)) {
report_id = task.current_report.id;
@@ -35,16 +35,20 @@ const TaskStatus = ({task, links = true}) => {
}
return (
-
+
{
};
TaskStatus.propTypes = {
+ isAudit: PropTypes.bool,
links: PropTypes.bool,
task: PropTypes.model.isRequired,
};
diff --git a/src/web/pages/usersettings/dialog.jsx b/src/web/pages/usersettings/dialog.jsx
index d458e546eb..eebb0c6ca2 100644
--- a/src/web/pages/usersettings/dialog.jsx
+++ b/src/web/pages/usersettings/dialog.jsx
@@ -69,6 +69,7 @@ let UserSettingsDialog = ({
defaultSchedule,
defaultTarget,
alertsFilter,
+ auditReportsFilter,
configsFilter,
credentialsFilter,
filtersFilter,
@@ -125,6 +126,7 @@ let UserSettingsDialog = ({
defaultSchedule,
defaultTarget,
alertsFilter,
+ auditReportsFilter,
configsFilter,
credentialsFilter,
filtersFilter,
@@ -157,11 +159,14 @@ let UserSettingsDialog = ({
const [error, setError] = useState();
const [formValues, handleValueChange] = useFormValues(settings);
- const handleSave = useCallback(values => {
- onSave(values).catch(err => {
- setError(err.message);
- })
- }, [onSave]);
+ const handleSave = useCallback(
+ values => {
+ onSave(values).catch(err => {
+ setError(err.message);
+ });
+ },
+ [onSave],
+ );
const {hasError, errors, validate} = useFormValidation(
userSettingsRules,
@@ -243,6 +248,7 @@ let UserSettingsDialog = ({
filters.filter(filter => filter.filter_type === type);
const FilterPart = ({
alertsFilter,
+ auditReportsFilter,
configsFilter,
credentialsFilter,
filtersFilter,
@@ -51,6 +52,7 @@ const FilterPart = ({
filters = [],
onChange,
}) => {
+ const caps = useCapabilities();
return (
@@ -64,6 +66,20 @@ const FilterPart = ({
onChange={onChange}
/>
+ {caps.featureEnabled('COMPLIANCE_REPORTS') && (
+
+
+
+ )
+ }
+ {capabilities.featureEnabled('COMPLIANCE_REPORTS') && (
+
+ )
+ }
{
const defaultSchedule = schedulesSel.getEntity(defaultScheduleId);
const defaultTarget = targetsSel.getEntity(defaultTargetId);
const alertsFilter = userDefaultFilterSelector.getFilter('alert');
+ const auditReportsFilter = userDefaultFilterSelector.getFilter('auditreport');
const configsFilter = userDefaultFilterSelector.getFilter('scanconfig');
const credentialsFilter = userDefaultFilterSelector.getFilter('credential');
const filtersFilter = userDefaultFilterSelector.getFilter('filter');
@@ -1006,6 +1022,7 @@ const mapStateToProps = rootState => {
defaultSchedule,
defaultTarget,
alertsFilter,
+ auditReportsFilter,
configsFilter,
credentialsFilter,
filtersFilter,
@@ -1046,6 +1063,7 @@ const mapDispatchToProps = (dispatch, {gmp}) => ({
loadFilterDefaults: () =>
Promise.all([
dispatch(loadUserSettingsDefaultFilter(gmp)('alert')),
+ dispatch(loadUserSettingsDefaultFilter(gmp)('auditreport')),
dispatch(loadUserSettingsDefaultFilter(gmp)('scanconfig')),
dispatch(loadUserSettingsDefaultFilter(gmp)('credential')),
dispatch(loadUserSettingsDefaultFilter(gmp)('filter')),
diff --git a/src/web/routes.jsx b/src/web/routes.jsx
index 63d0825356..80b99c7fad 100644
--- a/src/web/routes.jsx
+++ b/src/web/routes.jsx
@@ -11,6 +11,7 @@ import {createBrowserHistory} from 'history';
import {stringify, parse} from 'qs';
import qhistory from 'qhistory';
+import ConditionalRoute from 'web/components/conditionalRoute/ConditionalRoute';
import LocationObserver from 'web/components/observer/locationobserver';
import SessionObserver from 'web/components/observer/sessionobserver';
@@ -23,6 +24,8 @@ import AboutPage from './pages/help/about';
import AlertsPage from './pages/alerts/listpage';
import AlertDetailsPage from './pages/alerts/detailspage';
import AuditsPage from './pages/audits/listpage';
+import AuditReportDetailsPage from './pages/reports/auditdetailspage';
+import AuditReportsPage from './pages/reports/auditreportslistpage';
import AuditsDetailsPage from './pages/audits/detailspage';
import CertBundsPage from './pages/certbund/listpage';
import CertBundDetailsPage from './pages/certbund/detailspage';
@@ -66,6 +69,7 @@ import ReportFormatsPage from './pages/reportformats/listpage';
import ReportFormatDetailsPage from './pages/reportformats/detailspage';
import ReportsPage from './pages/reports/listpage';
import ReportDetailsPage from './pages/reports/detailspage';
+import DeltaAuditReportDetailsPage from './pages/reports/auditdeltadetailspage';
import DeltaReportDetailsPage from './pages/reports/deltadetailspage';
import ResultsPage from './pages/results/listpage';
import ResultDetailsPage from './pages/results/detailspage';
@@ -121,6 +125,18 @@ const Routes = () => (
+
+
+
diff --git a/src/web/store/entities/__tests__/reducers.js b/src/web/store/entities/__tests__/reducers.js
index 71e7a11e04..e9112b0c86 100644
--- a/src/web/store/entities/__tests__/reducers.js
+++ b/src/web/store/entities/__tests__/reducers.js
@@ -24,10 +24,12 @@ describe('entities reducer tests', () => {
expect(entitiesReducer(undefined, {})).toEqual({
alert: initState,
audit: initState,
+ auditreport: initState,
certbund: initState,
cpe: initState,
credential: initState,
cve: initState,
+ deltaAuditReport: initState,
deltaReport: initState,
dfncert: initState,
filter: initState,
diff --git a/src/web/store/entities/auditreports.js b/src/web/store/entities/auditreports.js
new file mode 100644
index 0000000000..95febbe2e3
--- /dev/null
+++ b/src/web/store/entities/auditreports.js
@@ -0,0 +1,62 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {
+ createEntitiesLoadingActions,
+ createLoadAllEntities,
+ createLoadEntities,
+ types,
+} from 'web/store/entities/utils/actions';
+
+import {createReducer, initialState} from 'web/store/entities/utils/reducers';
+import {createEntitiesSelector} from 'web/store/entities/utils/selectors';
+
+import {reportReducer} from './report/reducers';
+import {reportsReducer} from './reports/reducers';
+
+const reportsSelector = createEntitiesSelector('auditreport');
+const entitiesActions = createEntitiesLoadingActions('auditreport');
+const loadAllEntities = createLoadAllEntities({
+ selector: reportsSelector,
+ actions: entitiesActions,
+ entityType: 'auditreport',
+});
+const loadEntities = createLoadEntities({
+ selector: reportsSelector,
+ actions: entitiesActions,
+ entityType: 'auditreport',
+});
+
+const reducer = (state = initialState, action) => {
+ if (action.entityType !== 'auditreport') {
+ return state;
+ }
+
+ switch (action.type) {
+ case types.ENTITIES_LOADING_REQUEST:
+ case types.ENTITIES_LOADING_SUCCESS:
+ case types.ENTITIES_LOADING_ERROR:
+ return reportsReducer(state, action);
+
+ case types.ENTITY_LOADING_REQUEST:
+ case types.ENTITY_LOADING_SUCCESS:
+ case types.ENTITY_LOADING_ERROR:
+ return reportReducer(state, action);
+
+ default:
+ return state;
+ }
+};
+
+const deltaAuditReducer = createReducer('deltaAuditReport');
+
+export {
+ deltaAuditReducer,
+ loadAllEntities,
+ loadEntities,
+ reducer,
+ reportsSelector as selector,
+ entitiesActions,
+};
diff --git a/src/web/store/entities/reducers.js b/src/web/store/entities/reducers.js
index d12f11332f..7ec854db10 100644
--- a/src/web/store/entities/reducers.js
+++ b/src/web/store/entities/reducers.js
@@ -7,6 +7,10 @@ import {combineReducers} from 'redux';
import {reducer as alert} from './alerts';
import {reducer as audit} from './audits';
+import {
+ reducer as auditreport,
+ deltaAuditReducer as deltaAuditReport,
+} from './auditreports';
import {reducer as certbund} from './certbund';
import {reducer as cpe} from './cpes';
import {reducer as credential} from './credentials';
@@ -41,10 +45,12 @@ import {reducer as vuln} from './vulns';
const entitiesReducer = combineReducers({
alert,
audit,
+ auditreport,
certbund,
cpe,
credential,
cve,
+ deltaAuditReport,
deltaReport,
dfncert,
filter,
diff --git a/src/web/store/entities/report/__tests__/actions.js b/src/web/store/entities/report/__tests__/actions.js
index 5712358259..ca9bb8c2e5 100644
--- a/src/web/store/entities/report/__tests__/actions.js
+++ b/src/web/store/entities/report/__tests__/actions.js
@@ -14,18 +14,24 @@ import {types} from 'web/store/entities/utils/actions';
import {createState, testEntityActions} from 'web/store/entities/utils/testing';
import {
+ auditReportActions,
deltaReportActions,
loadReport,
+ loadAuditReport,
+ loadAuditReportIfNeeded,
+ loadAuditReportWithThreshold,
+ loadDeltaReport,
+ loadDeltaAuditReport,
loadReportIfNeeded,
loadReportWithThreshold,
reportActions,
- loadDeltaReport,
} from '../actions';
import {reportIdentifier} from '../selectors';
testEntityActions('report', reportActions);
testEntityActions('deltaReport', deltaReportActions);
+testEntityActions('auditreport', auditReportActions);
describe('loadReport function tests', () => {
test('should load report successfully', () => {
@@ -936,3 +942,936 @@ describe('loadDeltaReport function tests', () => {
});
});
});
+
+describe('loadAuditReport function tests', () => {
+ test('should load audit report successfully', () => {
+ const id = 'a1';
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [id]: false,
+ },
+ });
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const get = testing.fn().mockResolvedValue({
+ data: {foo: 'bar'},
+ });
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ };
+
+ expect(loadAuditReport).toBeDefined();
+ expect(isFunction(loadAuditReport)).toBe(true);
+
+ expect.assertions(7);
+
+ return loadAuditReport(gmp)(id)(dispatch, getState).then(() => {
+ expect(getState).toBeCalled();
+ expect(get).toBeCalledWith({id}, {details: true, filter: undefined});
+ expect(dispatch).toHaveBeenCalledTimes(2);
+ expect(dispatch).toHaveBeenNthCalledWith(1, {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(2, {
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'auditreport',
+ data: {foo: 'bar'},
+ id,
+ });
+ });
+ });
+
+ test('should load audit report with results filter successfully', () => {
+ const id = 'a1';
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [id]: false,
+ },
+ });
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const get = testing.fn().mockResolvedValue({
+ data: {foo: 'bar'},
+ });
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ };
+
+ const filter = Filter.fromString('foo=bar');
+
+ expect(loadAuditReport).toBeDefined();
+ expect(isFunction(loadAuditReport)).toBe(true);
+
+ expect.assertions(7);
+
+ return loadAuditReport(gmp)(id, {filter})(dispatch, getState).then(() => {
+ expect(getState).toBeCalled();
+ expect(get).toBeCalledWith({id}, {details: true, filter});
+ expect(dispatch).toHaveBeenCalledTimes(2);
+ expect(dispatch).toHaveBeenNthCalledWith(1, {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ filter,
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(2, {
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'auditreport',
+ filter,
+ data: {foo: 'bar'},
+ id,
+ });
+ });
+ });
+
+ test('should not load audit report if isLoading is true', () => {
+ const id = 'a1';
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [id]: true,
+ },
+ });
+
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const get = testing.fn().mockResolvedValue([{id: 'foo'}]);
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ };
+
+ expect.assertions(3);
+
+ return loadAuditReport(gmp)(id)(dispatch, getState).then(() => {
+ expect(getState).toBeCalled();
+ expect(dispatch).not.toBeCalled();
+ expect(get).not.toBeCalled();
+ });
+ });
+
+ test('should fail loading audit report with an error', () => {
+ const id = 'a1';
+ const rootState = createState('auditreport', {
+ [id]: {
+ isLoading: false,
+ },
+ });
+
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const get = testing.fn().mockRejectedValue('An Error');
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ };
+
+ expect.assertions(5);
+
+ return loadAuditReport(gmp)(id)(dispatch, getState).catch(() => {
+ expect(getState).toBeCalled();
+ expect(get).toBeCalledWith({id}, {details: true, filter: undefined});
+ expect(dispatch).toHaveBeenCalledTimes(2);
+ expect(dispatch).toHaveBeenNthCalledWith(1, {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(2, {
+ type: types.ENTITY_LOADING_ERROR,
+ entityType: 'auditreport',
+ error: 'An Error',
+ id,
+ });
+ });
+ });
+});
+
+describe('report loadAuditReportIfNeeded function tests', () => {
+ test('should load audit report successfully if needed', () => {
+ const id = 'a1';
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [id]: false,
+ },
+ });
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const get = testing.fn().mockResolvedValue({data: {foo: 'bar'}});
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ };
+
+ expect.assertions(7);
+
+ expect(loadAuditReportIfNeeded).toBeDefined();
+ expect(isFunction(loadAuditReportIfNeeded)).toBe(true);
+
+ return loadAuditReportIfNeeded(gmp)(id)(dispatch, getState).then(() => {
+ expect(getState).toBeCalled();
+ expect(get).toBeCalledWith({id}, {details: false, filter: undefined});
+ expect(dispatch).toHaveBeenCalledTimes(2);
+ expect(dispatch).toHaveBeenNthCalledWith(1, {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(2, {
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'auditreport',
+ data: {foo: 'bar'},
+ id,
+ });
+ });
+ });
+
+ test('should not load audit report if report is already in store', () => {
+ const id = 'a1';
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [id]: false,
+ },
+ byId: {
+ [id]: 'a1',
+ },
+ });
+
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const get = testing.fn().mockResolvedValue([{id: 'foo'}]);
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ };
+
+ expect.assertions(3);
+
+ return loadAuditReportIfNeeded(gmp)(id)(dispatch, getState).then(() => {
+ expect(getState).toBeCalled();
+ expect(dispatch).not.toBeCalled();
+ expect(get).not.toBeCalled();
+ });
+ });
+
+ test('should load audit report with results filter successfully if needed', () => {
+ const id = 'a1';
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [id]: false,
+ },
+ });
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const get = testing.fn().mockResolvedValue({data: {foo: 'bar'}});
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ };
+
+ const filter = Filter.fromString('foo=bar');
+
+ expect.assertions(7);
+
+ expect(loadAuditReportIfNeeded).toBeDefined();
+ expect(isFunction(loadAuditReportIfNeeded)).toBe(true);
+
+ return loadAuditReportIfNeeded(gmp)(id, {filter})(dispatch, getState).then(
+ () => {
+ expect(getState).toBeCalled();
+ expect(get).toBeCalledWith({id}, {details: false, filter});
+ expect(dispatch).toHaveBeenCalledTimes(2);
+ expect(dispatch).toHaveBeenNthCalledWith(1, {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ filter,
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(2, {
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'auditreport',
+ filter,
+ data: {foo: 'bar'},
+ id,
+ });
+ },
+ );
+ });
+
+ test('should not audit load report if isLoading is true', () => {
+ const id = 'a1';
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [id]: true,
+ },
+ });
+
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const get = testing.fn().mockResolvedValue([{id: 'foo'}]);
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ };
+
+ expect.assertions(3);
+
+ return loadAuditReportIfNeeded(gmp)(id)(dispatch, getState).then(() => {
+ expect(getState).toBeCalled();
+ expect(dispatch).not.toBeCalled();
+ expect(get).not.toBeCalled();
+ });
+ });
+
+ test('should fail loading audit report with an error', () => {
+ const id = 'a1';
+ const rootState = createState('auditreport', {
+ [id]: {
+ isLoading: false,
+ },
+ });
+
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const get = testing.fn().mockRejectedValue('An Error');
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ };
+
+ expect.assertions(5);
+
+ return loadAuditReportIfNeeded(gmp)(id)(dispatch, getState).catch(() => {
+ expect(getState).toBeCalled();
+ expect(get).toBeCalledWith({id}, {details: false, filter: undefined});
+ expect(dispatch).toHaveBeenCalledTimes(2);
+ expect(dispatch.mock.calls[0]).toEqual([
+ {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ id,
+ },
+ ]);
+ expect(dispatch.mock.calls[1]).toEqual([
+ {
+ type: types.ENTITY_LOADING_ERROR,
+ entityType: 'auditreport',
+ error: 'An Error',
+ id,
+ },
+ ]);
+ });
+ });
+});
+
+describe('loadAuditReportWithThreshold tests', () => {
+ test('should only load "simple" audit report', () => {
+ const id = 'a1';
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [id]: false,
+ },
+ });
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const auditreport = {
+ report: {
+ results: {
+ counts: {
+ filtered: 10000,
+ },
+ },
+ },
+ };
+
+ const get = testing.fn().mockResolvedValue({
+ data: auditreport,
+ });
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ settings: {
+ reportResultsThreshold: 1000,
+ },
+ };
+
+ expect(loadAuditReportWithThreshold).toBeDefined();
+ expect(isFunction(loadAuditReportWithThreshold)).toBe(true);
+
+ expect.assertions(7);
+
+ return loadAuditReportWithThreshold(gmp)(id)(dispatch, getState).then(
+ () => {
+ expect(getState).toBeCalled();
+ expect(get).toBeCalledWith({id}, {details: false, filter: undefined});
+ expect(dispatch).toHaveBeenCalledTimes(2);
+ expect(dispatch).toHaveBeenNthCalledWith(1, {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(2, {
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'auditreport',
+ data: auditreport,
+ id,
+ });
+ },
+ );
+ });
+
+ test('should load "full" audit report', () => {
+ const id = 'a1';
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [id]: false,
+ },
+ });
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const auditreport = {
+ report: {
+ results: {
+ counts: {
+ filtered: 10000,
+ },
+ },
+ },
+ };
+
+ const get = testing.fn().mockResolvedValue({
+ data: auditreport,
+ });
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ settings: {
+ reportResultsThreshold: 100001,
+ },
+ };
+
+ expect(loadAuditReportWithThreshold).toBeDefined();
+ expect(isFunction(loadAuditReportWithThreshold)).toBe(true);
+
+ expect.assertions(11);
+
+ return loadAuditReportWithThreshold(gmp)(id)(dispatch, getState).then(
+ () => {
+ expect(getState).toBeCalled();
+ expect(get).toHaveBeenCalledTimes(2);
+ expect(get).toHaveBeenNthCalledWith(
+ 1,
+ {id},
+ {details: false, filter: undefined},
+ );
+ expect(get).toHaveBeenNthCalledWith(
+ 2,
+ {id},
+ {details: true, filter: undefined},
+ );
+ expect(dispatch).toHaveBeenCalledTimes(4);
+ expect(dispatch).toHaveBeenNthCalledWith(1, {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(2, {
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'auditreport',
+ data: auditreport,
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(3, {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(4, {
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'auditreport',
+ data: auditreport,
+ id,
+ });
+ },
+ );
+ });
+
+ test('should only load "simple" audit report with filter', () => {
+ const id = 'a1';
+ const filter = Filter.fromString('foo=bar rows=10');
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [reportIdentifier(id, filter)]: false,
+ },
+ });
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const auditreport = {
+ report: {
+ results: {
+ counts: {
+ filtered: 10000,
+ },
+ },
+ },
+ };
+
+ const get = testing.fn().mockResolvedValue({
+ data: auditreport,
+ });
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ settings: {
+ reportResultsThreshold: 1000,
+ },
+ };
+
+ expect(loadAuditReportWithThreshold).toBeDefined();
+ expect(isFunction(loadAuditReportWithThreshold)).toBe(true);
+
+ expect.assertions(7);
+
+ return loadAuditReportWithThreshold(gmp)(id, {filter})(
+ dispatch,
+ getState,
+ ).then(() => {
+ expect(getState).toBeCalled();
+ expect(get).toBeCalledWith({id}, {details: false, filter});
+ expect(dispatch).toHaveBeenCalledTimes(2);
+ expect(dispatch).toHaveBeenNthCalledWith(1, {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ filter,
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(2, {
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'auditreport',
+ filter,
+ data: auditreport,
+ id,
+ });
+ });
+ });
+
+ test('should load "full" audit report with filter', () => {
+ const id = 'a1';
+ const filter = Filter.fromString('foo=bar rows=10');
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [reportIdentifier(id, filter)]: false,
+ },
+ });
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const auditreport = {
+ report: {
+ results: {
+ counts: {
+ filtered: 10000,
+ },
+ },
+ },
+ };
+
+ const get = testing.fn().mockResolvedValue({
+ data: auditreport,
+ });
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ settings: {
+ reportResultsThreshold: 100001,
+ },
+ };
+
+ expect(loadAuditReportWithThreshold).toBeDefined();
+ expect(isFunction(loadAuditReportWithThreshold)).toBe(true);
+
+ expect.assertions(11);
+
+ return loadAuditReportWithThreshold(gmp)(id, {filter})(
+ dispatch,
+ getState,
+ ).then(() => {
+ expect(getState).toBeCalled();
+ expect(get).toHaveBeenCalledTimes(2);
+ expect(get).toHaveBeenNthCalledWith(1, {id}, {details: false, filter});
+ expect(get).toHaveBeenNthCalledWith(2, {id}, {details: true, filter});
+ expect(dispatch).toHaveBeenCalledTimes(4);
+ expect(dispatch).toHaveBeenNthCalledWith(1, {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ filter,
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(2, {
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'auditreport',
+ filter,
+ data: auditreport,
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(3, {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ filter,
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(4, {
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'auditreport',
+ filter,
+ data: auditreport,
+ id,
+ });
+ });
+ });
+
+ test('should not load audit report if already loading', () => {
+ const id = 'a1';
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [id]: true,
+ },
+ });
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const auditreport = {
+ report: {
+ results: {
+ counts: {
+ filtered: 10000,
+ },
+ },
+ },
+ };
+
+ const get = testing.fn().mockResolvedValue({
+ data: auditreport,
+ });
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ settings: {
+ reportResultsThreshold: 1000,
+ },
+ };
+
+ expect(loadAuditReportWithThreshold).toBeDefined();
+ expect(isFunction(loadAuditReportWithThreshold)).toBe(true);
+
+ expect.assertions(5);
+
+ return loadAuditReportWithThreshold(gmp)(id)(dispatch, getState).then(
+ () => {
+ expect(getState).toBeCalled();
+ expect(get).not.toHaveBeenCalled();
+ expect(dispatch).not.toHaveBeenCalled();
+ },
+ );
+ });
+
+ test('should not audit load report if already loading with filter', () => {
+ const id = 'a1';
+ const filter = Filter.fromString('foo=bar rows=10');
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [reportIdentifier(id, filter)]: true,
+ },
+ });
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const auditreport = {
+ report: {
+ results: {
+ counts: {
+ filtered: 10000,
+ },
+ },
+ },
+ };
+
+ const get = testing.fn().mockResolvedValue({
+ data: auditreport,
+ });
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ settings: {
+ reportResultsThreshold: 1000,
+ },
+ };
+
+ expect(loadAuditReportWithThreshold).toBeDefined();
+ expect(isFunction(loadAuditReportWithThreshold)).toBe(true);
+
+ expect.assertions(5);
+
+ return loadAuditReportWithThreshold(gmp)(id, {filter})(
+ dispatch,
+ getState,
+ ).then(() => {
+ expect(getState).toBeCalled();
+ expect(get).not.toHaveBeenCalled();
+ expect(dispatch).not.toHaveBeenCalled();
+ });
+ });
+});
+
+describe('loadDeltaAuditReport function tests', () => {
+ test('should load delta audit report successfully', () => {
+ const id = 'a1';
+ const deltaId = 'a2';
+ const identifier = `${id}+${deltaId}`;
+
+ const rootState = createState('deltaAuditReport', {
+ isLoading: {
+ [identifier]: false,
+ },
+ });
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const getDelta = testing.fn().mockResolvedValue({
+ data: {foo: 'bar'},
+ });
+
+ const gmp = {
+ auditreport: {
+ getDelta,
+ },
+ };
+
+ expect(loadDeltaAuditReport).toBeDefined();
+ expect(isFunction(loadDeltaAuditReport)).toBe(true);
+
+ return loadDeltaAuditReport(gmp)(id, deltaId)(dispatch, getState).then(
+ () => {
+ expect(getState).toBeCalled();
+ expect(getDelta).toBeCalledWith(
+ {id},
+ {id: deltaId},
+ {filter: undefined},
+ );
+ expect(dispatch).toHaveBeenCalledTimes(2);
+ expect(dispatch.mock.calls[0]).toEqual([
+ {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'deltaAuditReport',
+ id: identifier,
+ },
+ ]);
+ expect(dispatch.mock.calls[1]).toEqual([
+ {
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'deltaAuditReport',
+ data: {foo: 'bar'},
+ id: identifier,
+ },
+ ]);
+ },
+ );
+ });
+
+ test('should load delta audit report with results filter successfully', () => {
+ const id = 'a1';
+ const deltaId = 'a2';
+ const identifier = `${id}+${deltaId}`;
+
+ const rootState = createState('deltaAuditReport', {
+ isLoading: {
+ [identifier]: false,
+ },
+ });
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const getDelta = testing.fn().mockResolvedValue({
+ data: {foo: 'bar'},
+ });
+
+ const gmp = {
+ auditreport: {
+ getDelta,
+ },
+ };
+
+ const filter = Filter.fromString('foo=bar');
+
+ expect(loadDeltaAuditReport).toBeDefined();
+ expect(isFunction(loadDeltaReport)).toBe(true);
+
+ return loadDeltaAuditReport(gmp)(
+ id,
+ deltaId,
+ filter,
+ )(dispatch, getState).then(() => {
+ expect(getState).toBeCalled();
+ expect(getDelta).toBeCalledWith({id}, {id: deltaId}, {filter});
+ expect(dispatch).toHaveBeenCalledTimes(2);
+ expect(dispatch.mock.calls[0]).toEqual([
+ {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'deltaAuditReport',
+ id: identifier,
+ },
+ ]);
+ expect(dispatch.mock.calls[1]).toEqual([
+ {
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'deltaAuditReport',
+ data: {foo: 'bar'},
+ id: identifier,
+ },
+ ]);
+ });
+ });
+
+ test('should not load audit delta report if isLoading is true', () => {
+ const id = 'a1';
+ const deltaId = 'a2';
+ const identifier = `${id}+${deltaId}`;
+ const rootState = createState('deltaAuditReport', {
+ isLoading: {
+ [identifier]: true,
+ },
+ });
+
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const getDelta = testing.fn().mockResolvedValue([{id: 'foo'}]);
+
+ const gmp = {
+ auditreport: {
+ getDelta,
+ },
+ };
+
+ return loadDeltaAuditReport(gmp)(id, deltaId)(dispatch, getState).then(
+ () => {
+ expect(getState).toBeCalled();
+ expect(dispatch).not.toBeCalled();
+ expect(getDelta).not.toBeCalled();
+ },
+ );
+ });
+
+ test('should fail loading audit delta report with an error', () => {
+ const id = 'a1';
+ const deltaId = 'a2';
+ const identifier = `${id}+${deltaId}`;
+ const rootState = createState('deltaAuditReport', {
+ [identifier]: {
+ isLoading: false,
+ },
+ });
+
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const getDelta = testing.fn().mockRejectedValue('An Error');
+
+ const gmp = {
+ auditreport: {
+ getDelta,
+ },
+ };
+
+ return loadDeltaAuditReport(gmp)(id, deltaId)(dispatch, getState).then(
+ () => {
+ expect(getState).toBeCalled();
+ expect(getDelta).toBeCalledWith(
+ {id},
+ {id: deltaId},
+ {filter: undefined},
+ );
+ expect(dispatch).toHaveBeenCalledTimes(2);
+ expect(dispatch.mock.calls[0]).toEqual([
+ {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'deltaAuditReport',
+ id: identifier,
+ },
+ ]);
+ expect(dispatch.mock.calls[1]).toEqual([
+ {
+ type: types.ENTITY_LOADING_ERROR,
+ entityType: 'deltaAuditReport',
+ error: 'An Error',
+ id: identifier,
+ },
+ ]);
+ },
+ );
+ });
+});
diff --git a/src/web/store/entities/report/actions.js b/src/web/store/entities/report/actions.js
index 264f97e7b4..a667af5cb4 100644
--- a/src/web/store/entities/report/actions.js
+++ b/src/web/store/entities/report/actions.js
@@ -11,146 +11,270 @@ import {
} from 'web/store/entities/utils/actions';
import {
+ auditReportSelector,
reportSelector,
deltaReportSelector,
+ deltaAuditReportSelector,
deltaReportIdentifier,
} from './selectors';
-const entityType = 'report';
-
export const reportActions = {
request: (id, filter) => ({
type: types.ENTITY_LOADING_REQUEST,
- entityType,
+ entityType: 'report',
filter,
id,
}),
success: (id, data, filter) => ({
type: types.ENTITY_LOADING_SUCCESS,
- entityType,
+ entityType: 'report',
data,
filter,
id,
}),
error: (id, error, filter) => ({
type: types.ENTITY_LOADING_ERROR,
- entityType,
+ entityType: 'report',
error,
filter,
id,
}),
};
-export const loadReport = gmp => (
- id,
- {filter, details = true, force = false} = {},
-) => (dispatch, getState) => {
- const rootState = getState();
- const state = reportSelector(rootState);
-
- if (!force && state.isLoadingEntity(id, filter)) {
- // we are already loading data
- return Promise.resolve();
- }
-
- dispatch(reportActions.request(id, filter));
-
- return gmp.report
- .get({id}, {filter, details})
- .then(
- response => response.data,
- error => {
- dispatch(reportActions.error(id, error, filter));
- return Promise.reject(error);
- },
- )
- .then(data => {
- dispatch(reportActions.success(id, data, filter));
- return data;
- });
+export const auditReportActions = {
+ request: (id, filter) => ({
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ filter,
+ id,
+ }),
+ success: (id, data, filter) => ({
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'auditreport',
+ data,
+ filter,
+ id,
+ }),
+ error: (id, error, filter) => ({
+ type: types.ENTITY_LOADING_ERROR,
+ entityType: 'auditreport',
+ error,
+ filter,
+ id,
+ }),
};
-export const loadReportWithThreshold = gmp => (id, {filter} = {}) => (
- dispatch,
- getState,
-) => {
- const rootState = getState();
- const state = reportSelector(rootState);
-
- if (state.isLoadingEntity(id, filter)) {
- // we are already loading data
- return Promise.resolve();
- }
-
- dispatch(reportActions.request(id, filter));
-
- const {reportResultsThreshold: threshold} = gmp.settings;
- return gmp.report
- .get({id}, {filter, details: false})
- .then(
- response => response.data,
- error => {
- dispatch(reportActions.error(id, error, filter));
- return Promise.reject(error);
- },
- )
- .then(report => {
- const fullReport =
- isDefined(report) &&
- isDefined(report.report) &&
- isDefined(report.report.results) &&
- report.report.results.counts.filtered < threshold;
-
- dispatch(reportActions.success(id, report, filter));
-
- if (fullReport) {
- return loadReport(gmp)(id, {filter, details: true, force: true})(
- dispatch,
- getState,
- );
- }
- });
-};
+export const loadReport =
+ gmp =>
+ (id, {filter, details = true, force = false} = {}) =>
+ (dispatch, getState) => {
+ const rootState = getState();
+ const state = reportSelector(rootState);
-export const loadReportIfNeeded = gmp => (
- id,
- {filter, details = false} = {},
-) => (dispatch, getState) => {
- // loads the small report (without details) if these information are not
- // yet in the store. resolve() otherwise
- const rootState = getState();
- const state = reportSelector(rootState);
-
- if (isDefined(state.getEntity(id, filter))) {
- // we are already loading data or have it in the store
- return Promise.resolve();
- }
- return loadReport(gmp)(id, {filter, details})(dispatch, getState);
-};
+ if (!force && state.isLoadingEntity(id, filter)) {
+ // we are already loading data
+ return Promise.resolve();
+ }
+
+ dispatch(reportActions.request(id, filter));
+
+ return gmp.report
+ .get({id}, {filter, details})
+ .then(
+ response => response.data,
+ error => {
+ dispatch(reportActions.error(id, error, filter));
+ return Promise.reject(error);
+ },
+ )
+ .then(data => {
+ dispatch(reportActions.success(id, data, filter));
+ return data;
+ });
+ };
+
+export const loadReportWithThreshold =
+ gmp =>
+ (id, {filter} = {}) =>
+ (dispatch, getState) => {
+ const rootState = getState();
+ const state = reportSelector(rootState);
+
+ if (state.isLoadingEntity(id, filter)) {
+ // we are already loading data
+ return Promise.resolve();
+ }
+
+ dispatch(reportActions.request(id, filter));
+
+ const {reportResultsThreshold: threshold} = gmp.settings;
+ return gmp.report
+ .get({id}, {filter, details: false})
+ .then(
+ response => response.data,
+ error => {
+ dispatch(reportActions.error(id, error, filter));
+ return Promise.reject(error);
+ },
+ )
+ .then(report => {
+ const fullReport =
+ isDefined(report) &&
+ isDefined(report.report) &&
+ isDefined(report.report.results) &&
+ report.report.results.counts.filtered < threshold;
+
+ dispatch(reportActions.success(id, report, filter));
+
+ if (fullReport) {
+ return loadReport(gmp)(id, {filter, details: true, force: true})(
+ dispatch,
+ getState,
+ );
+ }
+ });
+ };
+
+export const loadReportIfNeeded =
+ gmp =>
+ (id, {filter, details = false} = {}) =>
+ (dispatch, getState) => {
+ // loads the small report (without details) if these information are not
+ // yet in the store. resolve() otherwise
+ const rootState = getState();
+ const state = reportSelector(rootState);
+
+ if (isDefined(state.getEntity(id, filter))) {
+ // we are already loading data or have it in the store
+ return Promise.resolve();
+ }
+ return loadReport(gmp)(id, {filter, details})(dispatch, getState);
+ };
export const deltaReportActions = createEntityLoadingActions('deltaReport');
-export const loadDeltaReport = gmp => (id, deltaId, filter) => (
- dispatch,
- getState,
-) => {
- const rootState = getState();
- const state = deltaReportSelector(rootState);
+export const loadDeltaReport =
+ gmp => (id, deltaId, filter) => (dispatch, getState) => {
+ const rootState = getState();
+ const state = deltaReportSelector(rootState);
- if (state.isLoading(id, deltaId)) {
- // we are already loading data
- return Promise.resolve();
- }
+ if (state.isLoading(id, deltaId)) {
+ // we are already loading data
+ return Promise.resolve();
+ }
- const identifier = deltaReportIdentifier(id, deltaId);
+ const identifier = deltaReportIdentifier(id, deltaId);
- dispatch(deltaReportActions.request(identifier));
+ dispatch(deltaReportActions.request(identifier));
- return gmp.report
- .getDelta({id}, {id: deltaId}, {filter})
- .then(
+ return gmp.report.getDelta({id}, {id: deltaId}, {filter}).then(
response =>
dispatch(deltaReportActions.success(identifier, response.data)),
error => dispatch(deltaReportActions.error(identifier, error)),
);
-};
+ };
+
+export const loadAuditReport =
+ gmp =>
+ (id, {filter, details = true, force = false} = {}) =>
+ (dispatch, getState) => {
+ const rootState = getState();
+ const state = auditReportSelector(rootState);
+
+ if (!force && state.isLoadingEntity(id, filter)) {
+ return Promise.resolve();
+ }
+
+ dispatch(auditReportActions.request(id, filter));
+
+ return gmp.auditreport
+ .get({id}, {filter, details})
+ .then(
+ response => response.data,
+ error => {
+ dispatch(auditReportActions.error(id, error, filter));
+ return Promise.reject(error);
+ },
+ )
+ .then(data => {
+ dispatch(auditReportActions.success(id, data, filter));
+
+ return data;
+ });
+ };
+
+export const loadAuditReportWithThreshold =
+ gmp =>
+ (id, {filter} = {}) =>
+ (dispatch, getState) => {
+ const rootState = getState();
+ const state = auditReportSelector(rootState);
+
+ if (state.isLoadingEntity(id, filter)) {
+ return Promise.resolve();
+ }
+
+ dispatch(auditReportActions.request(id, filter));
+
+ const {reportResultsThreshold: threshold} = gmp.settings;
+ return gmp.auditreport
+ .get({id}, {filter, details: false})
+ .then(
+ response => response.data,
+ error => {
+ dispatch(auditReportActions.error(id, error, filter));
+ return Promise.reject(error);
+ },
+ )
+ .then(report => {
+ const fullReport =
+ isDefined(report) &&
+ isDefined(report.report) &&
+ isDefined(report.report.results) &&
+ report.report.results.counts.filtered < threshold;
+
+ dispatch(auditReportActions.success(id, report, filter));
+ if (fullReport) {
+ return loadAuditReport(gmp)(id, {filter, details: true, force: true})(
+ dispatch,
+ getState,
+ );
+ }
+ });
+ };
+
+export const loadAuditReportIfNeeded =
+ gmp =>
+ (id, {filter, details = false} = {}) =>
+ (dispatch, getState) => {
+ const rootState = getState();
+ const state = auditReportSelector(rootState);
+
+ if (isDefined(state.getEntity(id, filter))) {
+ return Promise.resolve();
+ }
+ return loadAuditReport(gmp)(id, {filter, details})(dispatch, getState);
+ };
+
+export const deltaAuditReportActions =
+ createEntityLoadingActions('deltaAuditReport');
+
+export const loadDeltaAuditReport =
+ gmp => (id, deltaId, filter) => (dispatch, getState) => {
+ const rootState = getState();
+ const state = deltaAuditReportSelector(rootState);
+
+ if (state.isLoading(id, deltaId)) {
+ return Promise.resolve();
+ }
+
+ const identifier = deltaReportIdentifier(id, deltaId);
+
+ dispatch(deltaAuditReportActions.request(identifier));
+
+ return gmp.auditreport.getDelta({id}, {id: deltaId}, {filter}).then(
+ response =>
+ dispatch(deltaAuditReportActions.success(identifier, response.data)),
+ error => dispatch(deltaAuditReportActions.error(identifier, error)),
+ );
+ };
diff --git a/src/web/store/entities/report/reducers.js b/src/web/store/entities/report/reducers.js
index 0166bac722..6a6dd2a4c8 100644
--- a/src/web/store/entities/report/reducers.js
+++ b/src/web/store/entities/report/reducers.js
@@ -70,7 +70,7 @@ const byId = (state = {}, action) => {
};
export const reportReducer = (state = {}, action) => {
- if (action.entityType !== 'report') {
+ if (action.entityType !== 'report' && action.entityType !== 'auditreport') {
return state;
}
diff --git a/src/web/store/entities/report/selectors.js b/src/web/store/entities/report/selectors.js
index 228b0d241a..26d7b3da4d 100644
--- a/src/web/store/entities/report/selectors.js
+++ b/src/web/store/entities/report/selectors.js
@@ -78,5 +78,11 @@ class DeltaReportSelector {
export const reportSelector = rootState =>
new ReportSelector(rootState.entities.report);
+export const auditReportSelector = rootState =>
+ new ReportSelector(rootState.entities.auditreport);
+
export const deltaReportSelector = rootState =>
new DeltaReportSelector(rootState.entities.deltaReport);
+
+export const deltaAuditReportSelector = rootState =>
+ new DeltaReportSelector(rootState.entities.deltaAuditReport);
diff --git a/src/web/store/entities/reports/reducers.js b/src/web/store/entities/reports/reducers.js
index cd66b54b5f..0ee6e3c88b 100644
--- a/src/web/store/entities/reports/reducers.js
+++ b/src/web/store/entities/reports/reducers.js
@@ -77,7 +77,7 @@ const byId = (state = {}, action) => {
};
export const reportsReducer = (state = {}, action) => {
- if (action.entityType !== 'report') {
+ if (action.entityType !== 'report' && action.entityType !== 'auditreport') {
return state;
}
diff --git a/src/web/utils/theme.jsx b/src/web/utils/theme.jsx
index 3627648ac1..df008c9a99 100644
--- a/src/web/utils/theme.jsx
+++ b/src/web/utils/theme.jsx
@@ -28,6 +28,11 @@ const Theme = {
darkRed: '#c12c30', // used by: dialog errors font
errorRed: '#c83814', // used by: progressbar
+ complianceYes: '#4cb045',
+ complianceNo: '#D80000',
+ complianceIncomplete: 'orange',
+ complianceUndefined: 'silver',
+
lightBlue: '#d6e6fd', // used by InfoPanel and dashboard hovering
mediumBlue: '#77acf7', // used by active/hovered items in Select
blue: '#0a53b8', // used by: links
From 6d19ae0035447e30ff90973f682da9a404a56fcc Mon Sep 17 00:00:00 2001
From: Greenbone Bot
Date: Thu, 29 Aug 2024 12:25:04 +0000
Subject: [PATCH 104/130] Automatic release to 23.3.0
---
package.json | 6 +++---
src/version.js | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/package.json b/package.json
index fc75a4bf4b..6f60e4a8da 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "gsa",
- "version": "23.2.2-dev1",
+ "version": "23.3.0",
"description": "Greenbone Security Assistant",
"keywords": [
"openvas",
@@ -13,7 +13,7 @@
"type": "git",
"url": "https://github.com/greenbone/gsa/"
},
- "author": "Björn Ricks ",
+ "author": "Bj\u00f6rn Ricks ",
"license": "AGPL-3.0+",
"type": "module",
"scripts": {
@@ -118,4 +118,4 @@
"prettier --write"
]
}
-}
+}
\ No newline at end of file
diff --git a/src/version.js b/src/version.js
index 93c0375919..2c6a823fb3 100644
--- a/src/version.js
+++ b/src/version.js
@@ -15,7 +15,7 @@ const getMajorMinorVersion = () => {
return `${major}.${minor}`;
};
-export const VERSION = '23.2.2-dev1';
+export const VERSION = '23.3.0';
export const RELEASE_VERSION = getMajorMinorVersion();
From 02697fb27043e3e7fb42576c07c0de7472c2670a Mon Sep 17 00:00:00 2001
From: Greenbone Bot
Date: Thu, 29 Aug 2024 12:25:06 +0000
Subject: [PATCH 105/130] Automatic adjustments after release [skip ci]
* Update to version 23.3.1-dev1
---
package.json | 2 +-
src/version.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/package.json b/package.json
index 6f60e4a8da..3ace4ae18b 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "gsa",
- "version": "23.3.0",
+ "version": "23.3.1-dev1",
"description": "Greenbone Security Assistant",
"keywords": [
"openvas",
diff --git a/src/version.js b/src/version.js
index 2c6a823fb3..8b7cdc6045 100644
--- a/src/version.js
+++ b/src/version.js
@@ -15,7 +15,7 @@ const getMajorMinorVersion = () => {
return `${major}.${minor}`;
};
-export const VERSION = '23.3.0';
+export const VERSION = '23.3.1-dev1';
export const RELEASE_VERSION = getMajorMinorVersion();
From e810585605b1afbfc558e8fbc2096e2316e3e24d Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 4 Sep 2024 11:14:30 +0200
Subject: [PATCH 106/130] Deps: Bump vite from 5.3.5 to 5.4.2 (#4139)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.3.5 to 5.4.2.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.2/packages/vite)
---
updated-dependencies:
- dependency-name: vite
dependency-type: direct:development
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package-lock.json | 166 +++++++++++++++++++++++++---------------------
package.json | 2 +-
2 files changed, 93 insertions(+), 75 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 890b7fed57..3fe82eddc2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "gsa",
- "version": "23.2.2-dev1",
+ "version": "23.3.1-dev1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "gsa",
- "version": "23.2.2-dev1",
+ "version": "23.3.1-dev1",
"license": "AGPL-3.0+",
"dependencies": {
"@reduxjs/toolkit": "^2.2.7",
@@ -79,7 +79,7 @@
"lint-staged": "^13.1.0",
"prettier": "^3.3.3",
"typescript": "^5.5.4",
- "vite": "^5.3.5",
+ "vite": "^5.4.2",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-eslint2": "^4.4.0",
"vite-plugin-svgr": "^4.2.0",
@@ -2974,9 +2974,9 @@
}
},
"node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.2.tgz",
- "integrity": "sha512-ahxSgCkAEk+P/AVO0vYr7DxOD3CwAQrT0Go9BJyGQ9Ef0QxVOfjDZMiF4Y2s3mLyPrjonchIMH/tbWHucJMykQ==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz",
+ "integrity": "sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==",
"cpu": [
"arm"
],
@@ -2987,9 +2987,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.2.tgz",
- "integrity": "sha512-lAarIdxZWbFSHFSDao9+I/F5jDaKyCqAPMq5HqnfpBw8dKDiCaaqM0lq5h1pQTLeIqueeay4PieGR5jGZMWprw==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz",
+ "integrity": "sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==",
"cpu": [
"arm64"
],
@@ -3000,9 +3000,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.2.tgz",
- "integrity": "sha512-SWsr8zEUk82KSqquIMgZEg2GE5mCSfr9sE/thDROkX6pb3QQWPp8Vw8zOq2GyxZ2t0XoSIUlvHDkrf5Gmf7x3Q==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz",
+ "integrity": "sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==",
"cpu": [
"arm64"
],
@@ -3013,9 +3013,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.2.tgz",
- "integrity": "sha512-o/HAIrQq0jIxJAhgtIvV5FWviYK4WB0WwV91SLUnsliw1lSAoLsmgEEgRWzDguAFeUEUUoIWXiJrPqU7vGiVkA==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz",
+ "integrity": "sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==",
"cpu": [
"x64"
],
@@ -3026,9 +3026,22 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.2.tgz",
- "integrity": "sha512-nwlJ65UY9eGq91cBi6VyDfArUJSKOYt5dJQBq8xyLhvS23qO+4Nr/RreibFHjP6t+5ap2ohZrUJcHv5zk5ju/g==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz",
+ "integrity": "sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz",
+ "integrity": "sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==",
"cpu": [
"arm"
],
@@ -3039,9 +3052,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.2.tgz",
- "integrity": "sha512-Pg5TxxO2IVlMj79+c/9G0LREC9SY3HM+pfAwX7zj5/cAuwrbfj2Wv9JbMHIdPCfQpYsI4g9mE+2Bw/3aeSs2rQ==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz",
+ "integrity": "sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==",
"cpu": [
"arm64"
],
@@ -3052,9 +3065,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.2.tgz",
- "integrity": "sha512-cAOTjGNm84gc6tS02D1EXtG7tDRsVSDTBVXOLbj31DkwfZwgTPYZ6aafSU7rD/4R2a34JOwlF9fQayuTSkoclA==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz",
+ "integrity": "sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==",
"cpu": [
"arm64"
],
@@ -3065,9 +3078,9 @@
]
},
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.2.tgz",
- "integrity": "sha512-4RyT6v1kXb7C0fn6zV33rvaX05P0zHoNzaXI/5oFHklfKm602j+N4mn2YvoezQViRLPnxP8M1NaY4s/5kXO5cw==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz",
+ "integrity": "sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==",
"cpu": [
"ppc64"
],
@@ -3078,9 +3091,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.2.tgz",
- "integrity": "sha512-KNUH6jC/vRGAKSorySTyc/yRYlCwN/5pnMjXylfBniwtJx5O7X17KG/0efj8XM3TZU7raYRXJFFReOzNmL1n1w==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz",
+ "integrity": "sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==",
"cpu": [
"riscv64"
],
@@ -3091,9 +3104,9 @@
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.2.tgz",
- "integrity": "sha512-xPV4y73IBEXToNPa3h5lbgXOi/v0NcvKxU0xejiFw6DtIYQqOTMhZ2DN18/HrrP0PmiL3rGtRG9gz1QE8vFKXQ==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz",
+ "integrity": "sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==",
"cpu": [
"s390x"
],
@@ -3104,9 +3117,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.2.tgz",
- "integrity": "sha512-QBhtr07iFGmF9egrPOWyO5wciwgtzKkYPNLVCFZTmr4TWmY0oY2Dm/bmhHjKRwZoGiaKdNcKhFtUMBKvlchH+Q==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz",
+ "integrity": "sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==",
"cpu": [
"x64"
],
@@ -3117,9 +3130,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.2.tgz",
- "integrity": "sha512-8zfsQRQGH23O6qazZSFY5jP5gt4cFvRuKTpuBsC1ZnSWxV8ZKQpPqOZIUtdfMOugCcBvFGRa1pDC/tkf19EgBw==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz",
+ "integrity": "sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==",
"cpu": [
"x64"
],
@@ -3130,9 +3143,9 @@
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.2.tgz",
- "integrity": "sha512-H4s8UjgkPnlChl6JF5empNvFHp77Jx+Wfy2EtmYPe9G22XV+PMuCinZVHurNe8ggtwoaohxARJZbaH/3xjB/FA==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz",
+ "integrity": "sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==",
"cpu": [
"arm64"
],
@@ -3143,9 +3156,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.2.tgz",
- "integrity": "sha512-djqpAjm/i8erWYF0K6UY4kRO3X5+T4TypIqw60Q8MTqSBaQNpNXDhxdjpZ3ikgb+wn99svA7jxcXpiyg9MUsdw==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz",
+ "integrity": "sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==",
"cpu": [
"ia32"
],
@@ -3156,9 +3169,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.2.tgz",
- "integrity": "sha512-teAqzLT0yTYZa8ZP7zhFKEx4cotS8Tkk5XiqNMJhD4CpaWB1BHARE4Qy+RzwnXvSAYv+Q3jAqCVBS+PS+Yee8Q==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz",
+ "integrity": "sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==",
"cpu": [
"x64"
],
@@ -9880,9 +9893,9 @@
"integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="
},
"node_modules/rollup": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.2.tgz",
- "integrity": "sha512-WkeoTWvuBoFjFAhsEOHKRoZ3r9GfTyhh7Vff1zwebEFLEFjT1lG3784xEgKiTa7E+e70vsC81roVL2MP4tgEEQ==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz",
+ "integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==",
"dev": true,
"dependencies": {
"@types/estree": "1.0.5"
@@ -9895,21 +9908,22 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.14.2",
- "@rollup/rollup-android-arm64": "4.14.2",
- "@rollup/rollup-darwin-arm64": "4.14.2",
- "@rollup/rollup-darwin-x64": "4.14.2",
- "@rollup/rollup-linux-arm-gnueabihf": "4.14.2",
- "@rollup/rollup-linux-arm64-gnu": "4.14.2",
- "@rollup/rollup-linux-arm64-musl": "4.14.2",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.14.2",
- "@rollup/rollup-linux-riscv64-gnu": "4.14.2",
- "@rollup/rollup-linux-s390x-gnu": "4.14.2",
- "@rollup/rollup-linux-x64-gnu": "4.14.2",
- "@rollup/rollup-linux-x64-musl": "4.14.2",
- "@rollup/rollup-win32-arm64-msvc": "4.14.2",
- "@rollup/rollup-win32-ia32-msvc": "4.14.2",
- "@rollup/rollup-win32-x64-msvc": "4.14.2",
+ "@rollup/rollup-android-arm-eabi": "4.21.2",
+ "@rollup/rollup-android-arm64": "4.21.2",
+ "@rollup/rollup-darwin-arm64": "4.21.2",
+ "@rollup/rollup-darwin-x64": "4.21.2",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.21.2",
+ "@rollup/rollup-linux-arm-musleabihf": "4.21.2",
+ "@rollup/rollup-linux-arm64-gnu": "4.21.2",
+ "@rollup/rollup-linux-arm64-musl": "4.21.2",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2",
+ "@rollup/rollup-linux-riscv64-gnu": "4.21.2",
+ "@rollup/rollup-linux-s390x-gnu": "4.21.2",
+ "@rollup/rollup-linux-x64-gnu": "4.21.2",
+ "@rollup/rollup-linux-x64-musl": "4.21.2",
+ "@rollup/rollup-win32-arm64-msvc": "4.21.2",
+ "@rollup/rollup-win32-ia32-msvc": "4.21.2",
+ "@rollup/rollup-win32-x64-msvc": "4.21.2",
"fsevents": "~2.3.2"
}
},
@@ -11052,14 +11066,14 @@
"integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw=="
},
"node_modules/vite": {
- "version": "5.3.5",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz",
- "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==",
+ "version": "5.4.2",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.2.tgz",
+ "integrity": "sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==",
"dev": true,
"dependencies": {
"esbuild": "^0.21.3",
- "postcss": "^8.4.39",
- "rollup": "^4.13.0"
+ "postcss": "^8.4.41",
+ "rollup": "^4.20.0"
},
"bin": {
"vite": "bin/vite.js"
@@ -11078,6 +11092,7 @@
"less": "*",
"lightningcss": "^1.21.0",
"sass": "*",
+ "sass-embedded": "*",
"stylus": "*",
"sugarss": "*",
"terser": "^5.4.0"
@@ -11095,6 +11110,9 @@
"sass": {
"optional": true
},
+ "sass-embedded": {
+ "optional": true
+ },
"stylus": {
"optional": true
},
@@ -11228,9 +11246,9 @@
}
},
"node_modules/vite/node_modules/postcss": {
- "version": "8.4.39",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz",
- "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==",
+ "version": "8.4.42",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.42.tgz",
+ "integrity": "sha512-hywKUQB9Ra4dR1mGhldy5Aj1X3MWDSIA1cEi+Uy0CjheLvP6Ual5RlwMCh8i/X121yEDLDIKBsrCQ8ba3FDMfQ==",
"dev": true,
"funding": [
{
diff --git a/package.json b/package.json
index 3ace4ae18b..6c5954fa37 100644
--- a/package.json
+++ b/package.json
@@ -102,7 +102,7 @@
"lint-staged": "^13.1.0",
"prettier": "^3.3.3",
"typescript": "^5.5.4",
- "vite": "^5.3.5",
+ "vite": "^5.4.2",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-eslint2": "^4.4.0",
"vite-plugin-svgr": "^4.2.0",
From 7171dd8a3e7ea7d4b652b4be824c8791fdb18cbb Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 4 Sep 2024 14:17:23 +0200
Subject: [PATCH 107/130] Deps: Bump qs from 6.12.3 to 6.13.0 (#4140)
Bumps [qs](https://github.com/ljharb/qs) from 6.12.3 to 6.13.0.
- [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/qs/compare/v6.12.3...v6.13.0)
---
updated-dependencies:
- dependency-name: qs
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package-lock.json | 8 ++++----
package.json | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 3fe82eddc2..73f7ca3830 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -37,7 +37,7 @@
"moment-timezone": "^0.5.45",
"prop-types": "^15.8.1",
"qhistory": "^1.1.0",
- "qs": "^6.12.3",
+ "qs": "^6.13.0",
"react": "^18.3.1",
"react-beautiful-dnd": "^13.1.1",
"react-datepicker": "^6.0.0",
@@ -9371,9 +9371,9 @@
}
},
"node_modules/qs": {
- "version": "6.12.3",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.3.tgz",
- "integrity": "sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==",
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
"dependencies": {
"side-channel": "^1.0.6"
},
diff --git a/package.json b/package.json
index 6c5954fa37..5722052d19 100644
--- a/package.json
+++ b/package.json
@@ -60,7 +60,7 @@
"moment-timezone": "^0.5.45",
"prop-types": "^15.8.1",
"qhistory": "^1.1.0",
- "qs": "^6.12.3",
+ "qs": "^6.13.0",
"react": "^18.3.1",
"react-beautiful-dnd": "^13.1.1",
"react-datepicker": "^6.0.0",
From 8abeb1b9e817149d82dc597b88c23b20b31f9a08 Mon Sep 17 00:00:00 2001
From: daniele-mng
Date: Wed, 4 Sep 2024 18:14:28 +0200
Subject: [PATCH 108/130] fix: default filter in details page
---
src/web/entities/filterprovider.jsx | 3 +-
src/web/hooks/__tests__/usePageFilter.jsx | 229 ++++++++--------------
src/web/hooks/usePageFilter.js | 14 +-
src/web/utils/testing.jsx | 31 +--
4 files changed, 107 insertions(+), 170 deletions(-)
diff --git a/src/web/entities/filterprovider.jsx b/src/web/entities/filterprovider.jsx
index 689fdbf4bc..13a80ccacb 100644
--- a/src/web/entities/filterprovider.jsx
+++ b/src/web/entities/filterprovider.jsx
@@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
import Loading from 'web/components/loading/loading';
@@ -18,7 +17,7 @@ const FilterProvider = ({
pageName = gmpname,
locationQuery = {},
}) => {
- const [returnedFilter, isLoadingFilter] = usePageFilter(pageName, {
+ const [returnedFilter, isLoadingFilter] = usePageFilter(pageName, gmpname, {
fallbackFilter,
locationQueryFilterString: locationQuery?.filter,
});
diff --git a/src/web/hooks/__tests__/usePageFilter.jsx b/src/web/hooks/__tests__/usePageFilter.jsx
index 6f12833aa5..7d4d008b57 100644
--- a/src/web/hooks/__tests__/usePageFilter.jsx
+++ b/src/web/hooks/__tests__/usePageFilter.jsx
@@ -9,37 +9,25 @@ import {describe, test, expect, testing} from '@gsa/testing';
import Filter, {DEFAULT_FALLBACK_FILTER} from 'gmp/models/filter';
-import {fireEvent, rendererWith, screen} from 'web/utils/testing';
+import {rendererWith, waitFor} from 'web/utils/testing';
import {loadingActions} from 'web/store/usersettings/defaults/actions';
import {defaultFilterLoadingActions} from 'web/store/usersettings/defaultfilters/actions';
import usePageFilter from '../usePageFilter';
import {pageFilter} from 'web/store/pages/actions';
+import {vi} from 'vitest';
-const TestComponent = ({fallbackFilter}) => {
- const [filter, isLoadingFilter, changeFilter, removeFilter, resetFilter] =
- usePageFilter('somePage', {fallbackFilter});
- return (
- <>
- {isLoadingFilter ? (
- Loading...
- ) : (
- <>
- {filter.toFilterString()}
-
-
- {
- changeFilter(Filter.fromString('changed=1 rows=123'));
- }}
- />
- >
- )}
- >
- );
-};
+const mockUseHistory = testing.fn();
+
+vi.mock('react-router-dom', async () => {
+ const actual = await vi.importActual('react-router-dom');
+ return {
+ ...actual,
+ useLocation: () => ({pathname: '/'}),
+ useHistory: () => mockUseHistory(),
+ };
+});
describe('usePageFilter tests', () => {
test('should prefer locationQuery filter over defaultSettingFilter', async () => {
@@ -54,7 +42,7 @@ describe('usePageFilter tests', () => {
},
};
- const {render, store, history} = rendererWith({
+ const {renderHook, store, history} = rendererWith({
gmp,
store: true,
router: true,
@@ -67,13 +55,16 @@ describe('usePageFilter tests', () => {
defaultFilterLoadingActions.success('somePage', defaultSettingFilter),
);
- render( );
-
- const renderedFilter = await screen.findByTestId('filter');
+ const {result} = renderHook(() =>
+ usePageFilter('somePage', 'gmpName', {
+ locationQueryFilterString: locationQuery.filter,
+ }),
+ );
- expect(renderedFilter).toHaveTextContent('location=query rows=42');
+ expect(result.current[0]).toEqual(
+ Filter.fromString('location=query rows=42'),
+ );
});
-
test('should prefer pageFilter over defaultSettingFilter', async () => {
const pFilter = Filter.fromString('page=filter');
const defaultSettingFilter = Filter.fromString('foo=bar');
@@ -85,23 +76,17 @@ describe('usePageFilter tests', () => {
},
};
- const {render, store} = rendererWith({
- gmp,
- store: true,
- router: true,
- });
+ const {renderHook, store} = rendererWith({store: true, gmp});
store.dispatch(loadingActions.success({rowsperpage: {value: '42'}}));
store.dispatch(
defaultFilterLoadingActions.success('somePage', defaultSettingFilter),
);
- store.dispatch(pageFilter('somePage', pFilter));
+ store.dispatch(pageFilter('somePage2', pFilter));
- render( );
+ const {result} = renderHook(() => usePageFilter('somePage2', 'somePage'));
- const renderedFilter = await screen.findByTestId('filter');
-
- expect(renderedFilter).toHaveTextContent('page=filter rows=42');
+ expect(result.current[0]).toEqual(pFilter);
});
test('should use defaultSettingFilter', async () => {
@@ -114,7 +99,7 @@ describe('usePageFilter tests', () => {
},
};
- const {render, store} = rendererWith({
+ const {store, renderHook} = rendererWith({
gmp,
store: true,
router: true,
@@ -122,14 +107,16 @@ describe('usePageFilter tests', () => {
store.dispatch(loadingActions.success({rowsperpage: {value: '42'}}));
store.dispatch(
- defaultFilterLoadingActions.success('somePage', defaultSettingFilter),
+ defaultFilterLoadingActions.success('somePage2', defaultSettingFilter),
);
- render( );
-
- const renderedFilter = await screen.findByTestId('filter');
+ const {result} = renderHook(() => usePageFilter('somePage2', 'somePage'));
- expect(renderedFilter).toHaveTextContent('foo=bar rows=42');
+ await waitFor(() => {
+ expect(result.current[0].toString()).toEqual(
+ Filter.fromString('foo=bar rows=42').toString(),
+ );
+ });
});
test('should use fallbackFilter if no defaultSettingsFilter is available', async () => {
@@ -143,7 +130,7 @@ describe('usePageFilter tests', () => {
},
};
- const {render, store} = rendererWith({
+ const {store, renderHook} = rendererWith({
gmp,
store: true,
router: true,
@@ -153,11 +140,15 @@ describe('usePageFilter tests', () => {
store.dispatch(loadingActions.success({rowsperpage: {value: '42'}}));
- render( );
+ const {result} = renderHook(() =>
+ usePageFilter('somePage2', 'somePage', {fallbackFilter}),
+ );
- const renderedFilter = await screen.findByTestId('filter');
+ const expectedFilter = Filter.fromString('fall=back rows=42');
- expect(renderedFilter).toHaveTextContent('fall=back rows=42');
+ await waitFor(() => {
+ expect(result.current[0].toString()).toEqual(expectedFilter.toString());
+ });
});
test('should use fallbackFilter if defaultSettingFilter could not be loaded', async () => {
@@ -170,7 +161,7 @@ describe('usePageFilter tests', () => {
},
};
- const {render, store} = rendererWith({
+ const {store, renderHook} = rendererWith({
gmp,
store: true,
router: true,
@@ -181,11 +172,15 @@ describe('usePageFilter tests', () => {
defaultFilterLoadingActions.error('task', new Error('an error')),
);
- render( );
+ const {result} = renderHook(() =>
+ usePageFilter('somePage2', 'somePage', {fallbackFilter}),
+ );
- const renderedFilter = await screen.findByTestId('filter');
+ const expectedFilter = Filter.fromString('fall=back rows=42');
- expect(renderedFilter).toHaveTextContent('fall=back rows=42');
+ await waitFor(() => {
+ expect(result.current[0].toString()).toEqual(expectedFilter.toString());
+ });
});
test('should use default fallback filter as last resort', async () => {
@@ -199,7 +194,7 @@ describe('usePageFilter tests', () => {
},
};
- const {render, store} = rendererWith({
+ const {store, renderHook} = rendererWith({
gmp,
store: true,
router: true,
@@ -209,11 +204,15 @@ describe('usePageFilter tests', () => {
store.dispatch(loadingActions.success({rowsperpage: {value: '42'}}));
- render( );
-
- const renderedFilter = await screen.findByTestId('filter');
+ const {result} = renderHook(() =>
+ usePageFilter('somePage2', 'somePage', {
+ fallbackFilter: DEFAULT_FALLBACK_FILTER,
+ }),
+ );
- expect(renderedFilter).toHaveTextContent(resultingFilter.toFilterString());
+ await waitFor(() => {
+ expect(result.current[0].toString()).toEqual(resultingFilter.toString());
+ });
});
test('should use default rows per page if rows per page setting could not be loaded', async () => {
@@ -226,7 +225,7 @@ describe('usePageFilter tests', () => {
},
};
- const {render, store} = rendererWith({
+ const {store, renderHook} = rendererWith({
gmp,
store: true,
router: true,
@@ -234,11 +233,15 @@ describe('usePageFilter tests', () => {
store.dispatch(loadingActions.error(new Error('an error')));
- render( );
+ const {result} = renderHook(() =>
+ usePageFilter('somePage2', 'somePage', {fallbackFilter}),
+ );
- const renderedFilter = await screen.findByTestId('filter');
+ const expectedFilter = Filter.fromString('fall=back rows=50');
- expect(renderedFilter).toHaveTextContent('fall=back rows=50');
+ await waitFor(() => {
+ expect(result.current[0].toString()).toEqual(expectedFilter.toString());
+ });
});
test('should prefer pageFilter rows over defaultSettingFilter and default rows', async () => {
@@ -252,7 +255,7 @@ describe('usePageFilter tests', () => {
},
};
- const {render, store} = rendererWith({
+ const {store, renderHook} = rendererWith({
gmp,
store: true,
router: true,
@@ -264,51 +267,18 @@ describe('usePageFilter tests', () => {
);
store.dispatch(pageFilter('somePage', pFilter));
- render( );
+ const {result} = renderHook(() => usePageFilter('somePage2', 'somePage'));
- const renderedFilter = await screen.findByTestId('filter');
+ const expectedFilter = Filter.fromString('page=filter rows=42');
- expect(renderedFilter).toHaveTextContent('page=filter rows=42');
- });
-
- test('should allow to reset the filter to the defaultSettingsFilter', async () => {
- const pFilter = Filter.fromString('page=filter rows=42');
- const defaultSettingFilter = Filter.fromString('foo=bar');
-
- const getSetting = testing.fn().mockResolvedValue({});
- const gmp = {
- user: {
- getSetting,
- },
- };
-
- const {render, store} = rendererWith({
- gmp,
- store: true,
- router: true,
+ await waitFor(() => {
+ expect(result.current[0].toString()).toEqual(expectedFilter.toString());
});
-
- store.dispatch(loadingActions.success({rowsperpage: {value: '666'}}));
- store.dispatch(
- defaultFilterLoadingActions.success('somePage', defaultSettingFilter),
- );
- store.dispatch(pageFilter('somePage', pFilter));
-
- render( );
-
- const renderedFilter = await screen.findByTestId('filter');
- const resetButton = screen.getByTestId('reset');
-
- expect(renderedFilter).toHaveTextContent('page=filter rows=42');
-
- fireEvent.click(resetButton);
-
- expect(renderedFilter).toHaveTextContent('foo=bar rows=666');
});
- test('should allow to remove the filter', async () => {
- const pFilter = Filter.fromString('page=filter rows=42');
+ test('should handle missing pageName argument', async () => {
const defaultSettingFilter = Filter.fromString('foo=bar');
+ const fallbackFilter = Filter.fromString('fall=back');
const getSetting = testing.fn().mockResolvedValue({});
const gmp = {
@@ -317,62 +287,25 @@ describe('usePageFilter tests', () => {
},
};
- const {render, store} = rendererWith({
+ const {store, renderHook} = rendererWith({
gmp,
store: true,
router: true,
});
- store.dispatch(loadingActions.success({rowsperpage: {value: '666'}}));
+ store.dispatch(loadingActions.success({rowsperpage: {value: '42'}}));
store.dispatch(
defaultFilterLoadingActions.success('somePage', defaultSettingFilter),
);
- store.dispatch(pageFilter('somePage', pFilter));
-
- render( );
-
- const renderedFilter = await screen.findByTestId('filter');
- const removeButton = screen.getByTestId('remove');
-
- expect(renderedFilter).toHaveTextContent('page=filter rows=42');
-
- fireEvent.click(removeButton);
-
- expect(renderedFilter).toHaveTextContent('first=1');
- });
-
- test('should allow to change the filter', async () => {
- const pFilter = Filter.fromString('page=filter rows=42');
- const defaultSettingFilter = Filter.fromString('foo=bar');
- const getSetting = testing.fn().mockResolvedValue({});
- const gmp = {
- user: {
- getSetting,
- },
- };
-
- const {render, store} = rendererWith({
- gmp,
- store: true,
- router: true,
- });
-
- store.dispatch(loadingActions.success({rowsperpage: {value: '666'}}));
- store.dispatch(
- defaultFilterLoadingActions.success('somePage', defaultSettingFilter),
+ const {result} = renderHook(() =>
+ usePageFilter(undefined, 'somePage', {fallbackFilter}),
);
- store.dispatch(pageFilter('somePage', pFilter));
-
- render( );
-
- const renderedFilter = await screen.findByTestId('filter');
- const changeButton = screen.getByTestId('change');
- expect(renderedFilter).toHaveTextContent('page=filter rows=42');
+ const expectedFilter = Filter.fromString('fall=back rows=42');
- fireEvent.click(changeButton);
-
- expect(renderedFilter).toHaveTextContent('changed=1 rows=123');
+ await waitFor(() => {
+ expect(result.current[0].toString()).toEqual(expectedFilter.toString());
+ });
});
});
diff --git a/src/web/hooks/usePageFilter.js b/src/web/hooks/usePageFilter.js
index 1588264732..ce5730ab91 100644
--- a/src/web/hooks/usePageFilter.js
+++ b/src/web/hooks/usePageFilter.js
@@ -47,12 +47,14 @@ const useDefaultFilter = pageName =>
*
* @param {String} pageName Name of the page
* @param {Object} options Options object
+ * @param {String} gmpName Name of the GMP for filtering
* @returns Array of the applied filter, boolean indicating if the filter is
* still loading, function to change the filter, function to remove the
* filter and function to reset the filter
*/
const usePageFilter = (
pageName,
+ gmpName,
{
fallbackFilter,
locationQueryFilterString: initialLocationQueryFilterString,
@@ -63,7 +65,8 @@ const usePageFilter = (
const location = useLocation();
const history = useHistory();
const [defaultSettingFilter, defaultSettingsFilterError] =
- useDefaultFilter(pageName);
+ useDefaultFilter(gmpName);
+
let [rowsPerPage, rowsPerPageError] = useShallowEqualSelector(state => {
const userSettingDefaultSel = getUserSettingsDefaults(state);
return [
@@ -78,9 +81,8 @@ const usePageFilter = (
// use null as value for not set at all
let returnedFilter;
// only use location directly if locationQueryFilterString is undefined
- const locationQueryFilterString = initialLocationQueryFilterString
- ? initialLocationQueryFilterString
- : location?.query?.filter;
+ const locationQueryFilterString =
+ initialLocationQueryFilterString || location?.query?.filter;
const [locationQueryFilter, setLocationQueryFilter] = useState(
hasValue(locationQueryFilterString)
@@ -93,14 +95,14 @@ const usePageFilter = (
!isDefined(defaultSettingFilter) &&
!isDefined(defaultSettingsFilterError)
) {
- dispatch(loadUserSettingsDefaultFilter(gmp)(pageName));
+ dispatch(loadUserSettingsDefaultFilter(gmp)(gmpName));
}
}, [
defaultSettingFilter,
defaultSettingsFilterError,
dispatch,
gmp,
- pageName,
+ gmpName,
]);
useEffect(() => {
diff --git a/src/web/utils/testing.jsx b/src/web/utils/testing.jsx
index 2492e9ed7f..626b33b3dc 100644
--- a/src/web/utils/testing.jsx
+++ b/src/web/utils/testing.jsx
@@ -20,7 +20,7 @@ import {
queryAllByAttribute,
getElementError,
within,
- renderHook,
+ renderHook as rtlRenderHook,
} from '@testing-library/react/pure';
import userEvent from '@testing-library/user-event';
@@ -96,7 +96,6 @@ export const render = ui => {
queryByName: name => queryByName(baseElement, name),
queryAllByName: name => queryAllByName(baseElement, name),
within: () => within(baseElement),
- renderHook: hook => renderHook(hook, {wrapper: ui}),
rerender: component =>
rerender(
{component} ,
@@ -146,22 +145,26 @@ export const rendererWith = (
capabilities = new EverythingCapabilities();
}
+ const Providers = ({children}) => (
+
+
+
+
+ {children}
+
+
+
+
+ );
+
+ const wrapper = ({children}) => {children} ;
+
return {
- render: ui =>
- render(
-
-
-
-
- {ui}
-
-
-
- ,
- ),
+ render: ui => render({ui} ),
gmp,
store,
history,
+ renderHook: hook => rtlRenderHook(hook, {wrapper}),
};
};
From 76013fcbc82c88e0ee72023ab48704f1e66b7059 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 5 Sep 2024 08:20:23 +0200
Subject: [PATCH 109/130] Deps: Bump @babel/cli from 7.24.8 to 7.25.6 (#4138)
Bumps [@babel/cli](https://github.com/babel/babel/tree/HEAD/packages/babel-cli) from 7.24.8 to 7.25.6.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.25.6/packages/babel-cli)
---
updated-dependencies:
- dependency-name: "@babel/cli"
dependency-type: direct:development
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package-lock.json | 10 +++++-----
package.json | 2 +-
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 73f7ca3830..1a1290f2d3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -51,7 +51,7 @@
"whatwg-fetch": "^3.6.20"
},
"devDependencies": {
- "@babel/cli": "^7.24.8",
+ "@babel/cli": "^7.25.6",
"@pandatix/js-cvss": "^0.4.4",
"@testing-library/jest-dom": "^6.4.8",
"@testing-library/react": "^16.0.0",
@@ -117,9 +117,9 @@
}
},
"node_modules/@babel/cli": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.24.8.tgz",
- "integrity": "sha512-isdp+G6DpRyKc+3Gqxy2rjzgF7Zj9K0mzLNnxz+E/fgeag8qT3vVulX4gY9dGO1q0y+0lUv6V3a+uhUzMzrwXg==",
+ "version": "7.25.6",
+ "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.25.6.tgz",
+ "integrity": "sha512-Z+Doemr4VtvSD2SNHTrkiFZ1LX+JI6tyRXAAOb4N9khIuPyoEPmTPJarPm8ljJV1D6bnMQjyHMWTT9NeKbQuXA==",
"dev": true,
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.25",
@@ -139,7 +139,7 @@
},
"optionalDependencies": {
"@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3",
- "chokidar": "^3.4.0"
+ "chokidar": "^3.6.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
diff --git a/package.json b/package.json
index 5722052d19..369d880651 100644
--- a/package.json
+++ b/package.json
@@ -74,7 +74,7 @@
"whatwg-fetch": "^3.6.20"
},
"devDependencies": {
- "@babel/cli": "^7.24.8",
+ "@babel/cli": "^7.25.6",
"@pandatix/js-cvss": "^0.4.4",
"@testing-library/jest-dom": "^6.4.8",
"@testing-library/react": "^16.0.0",
From a36274c8dc7acde76006de2b17f60af1734bd29c Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 5 Sep 2024 12:03:07 +0200
Subject: [PATCH 110/130] Deps: Bump jsdom from 24.1.1 to 25.0.0 (#4143)
Bumps [jsdom](https://github.com/jsdom/jsdom) from 24.1.1 to 25.0.0.
- [Release notes](https://github.com/jsdom/jsdom/releases)
- [Changelog](https://github.com/jsdom/jsdom/blob/main/Changelog.md)
- [Commits](https://github.com/jsdom/jsdom/compare/24.1.1...25.0.0)
---
updated-dependencies:
- dependency-name: jsdom
dependency-type: direct:development
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package-lock.json | 8 ++++----
package.json | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 1a1290f2d3..31844eba4b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -75,7 +75,7 @@
"eslint-plugin-vitest-globals": "^1.5.0",
"husky": "^2.7.0",
"jest-styled-components": "^7.2.0",
- "jsdom": "^24.1.1",
+ "jsdom": "^25.0.0",
"lint-staged": "^13.1.0",
"prettier": "^3.3.3",
"typescript": "^5.5.4",
@@ -7997,9 +7997,9 @@
}
},
"node_modules/jsdom": {
- "version": "24.1.1",
- "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.1.tgz",
- "integrity": "sha512-5O1wWV99Jhq4DV7rCLIoZ/UIhyQeDR7wHVyZAHAshbrvZsLs+Xzz7gtwnlJTJDjleiTKh54F4dXrX70vJQTyJQ==",
+ "version": "25.0.0",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.0.tgz",
+ "integrity": "sha512-OhoFVT59T7aEq75TVw9xxEfkXgacpqAhQaYgP9y/fDqWQCMB/b1H66RfmPm/MaeaAIU9nDwMOVTlPN51+ao6CQ==",
"dev": true,
"dependencies": {
"cssstyle": "^4.0.1",
diff --git a/package.json b/package.json
index 369d880651..4833f9536b 100644
--- a/package.json
+++ b/package.json
@@ -98,7 +98,7 @@
"eslint-plugin-vitest-globals": "^1.5.0",
"husky": "^2.7.0",
"jest-styled-components": "^7.2.0",
- "jsdom": "^24.1.1",
+ "jsdom": "^25.0.0",
"lint-staged": "^13.1.0",
"prettier": "^3.3.3",
"typescript": "^5.5.4",
From 03cbde7c6fc09f4033664ba201ba16cd98aec04a Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 5 Sep 2024 12:51:41 +0200
Subject: [PATCH 111/130] Deps: Bump @testing-library/jest-dom from 6.4.8 to
6.5.0 (#4137)
Bumps [@testing-library/jest-dom](https://github.com/testing-library/jest-dom) from 6.4.8 to 6.5.0.
- [Release notes](https://github.com/testing-library/jest-dom/releases)
- [Changelog](https://github.com/testing-library/jest-dom/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/jest-dom/compare/v6.4.8...v6.5.0)
---
updated-dependencies:
- dependency-name: "@testing-library/jest-dom"
dependency-type: direct:development
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package-lock.json | 9 ++++-----
package.json | 2 +-
2 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 31844eba4b..9fd47cd756 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -53,7 +53,7 @@
"devDependencies": {
"@babel/cli": "^7.25.6",
"@pandatix/js-cvss": "^0.4.4",
- "@testing-library/jest-dom": "^6.4.8",
+ "@testing-library/jest-dom": "^6.5.0",
"@testing-library/react": "^16.0.0",
"@testing-library/user-event": "^13.5.0",
"@types/react": "^18.3.3",
@@ -3535,13 +3535,12 @@
}
},
"node_modules/@testing-library/jest-dom": {
- "version": "6.4.8",
- "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.8.tgz",
- "integrity": "sha512-JD0G+Zc38f5MBHA4NgxQMR5XtO5Jx9g86jqturNTt2WUfRmLDIY7iKkWHDCCTiDuFMre6nxAD5wHw9W5kI4rGw==",
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz",
+ "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==",
"dev": true,
"dependencies": {
"@adobe/css-tools": "^4.4.0",
- "@babel/runtime": "^7.9.2",
"aria-query": "^5.0.0",
"chalk": "^3.0.0",
"css.escape": "^1.5.1",
diff --git a/package.json b/package.json
index 4833f9536b..b18bc9d05a 100644
--- a/package.json
+++ b/package.json
@@ -76,7 +76,7 @@
"devDependencies": {
"@babel/cli": "^7.25.6",
"@pandatix/js-cvss": "^0.4.4",
- "@testing-library/jest-dom": "^6.4.8",
+ "@testing-library/jest-dom": "^6.5.0",
"@testing-library/react": "^16.0.0",
"@testing-library/user-event": "^13.5.0",
"@types/react": "^18.3.3",
From b1db5c91f678296f532489e11c8b265082ce0902 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 5 Sep 2024 13:33:56 +0200
Subject: [PATCH 112/130] Deps: Bump @typescript-eslint/eslint-plugin from
8.0.0 to 8.4.0 (#4146)
Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 8.0.0 to 8.4.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.4.0/packages/eslint-plugin)
---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
dependency-type: direct:development
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package-lock.json | 218 ++++++++++++++++++++++++++++++++++++++++++----
package.json | 2 +-
2 files changed, 200 insertions(+), 20 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 9fd47cd756..6de0e05356 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -58,7 +58,7 @@
"@testing-library/user-event": "^13.5.0",
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
- "@typescript-eslint/eslint-plugin": "^8.0.0",
+ "@typescript-eslint/eslint-plugin": "^8.4.0",
"@typescript-eslint/parser": "^8.0.0",
"@vitejs/plugin-legacy": "^5.4.1",
"@vitejs/plugin-react": "^4.3.1",
@@ -3847,16 +3847,16 @@
"integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA=="
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.0.0.tgz",
- "integrity": "sha512-STIZdwEQRXAHvNUS6ILDf5z3u95Gc8jzywunxSNqX00OooIemaaNIA0vEgynJlycL5AjabYLLrIyHd4iazyvtg==",
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.4.0.tgz",
+ "integrity": "sha512-rg8LGdv7ri3oAlenMACk9e+AR4wUV0yrrG+XKsGKOK0EVgeEDqurkXMPILG2836fW4ibokTB5v4b6Z9+GYQDEw==",
"dev": true,
"dependencies": {
"@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.0.0",
- "@typescript-eslint/type-utils": "8.0.0",
- "@typescript-eslint/utils": "8.0.0",
- "@typescript-eslint/visitor-keys": "8.0.0",
+ "@typescript-eslint/scope-manager": "8.4.0",
+ "@typescript-eslint/type-utils": "8.4.0",
+ "@typescript-eslint/utils": "8.4.0",
+ "@typescript-eslint/visitor-keys": "8.4.0",
"graphemer": "^1.4.0",
"ignore": "^5.3.1",
"natural-compare": "^1.4.0",
@@ -3879,6 +3879,53 @@
}
}
},
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.4.0.tgz",
+ "integrity": "sha512-n2jFxLeY0JmKfUqy3P70rs6vdoPjHK8P/w+zJcV3fk0b0BwRXC/zxRTEnAsgYT7MwdQDt/ZEbtdzdVC+hcpF0A==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "8.4.0",
+ "@typescript-eslint/visitor-keys": "8.4.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.4.0.tgz",
+ "integrity": "sha512-T1RB3KQdskh9t3v/qv7niK6P8yvn7ja1mS7QK7XfRVL6wtZ8/mFs/FHf4fKvTA0rKnqnYxl/uHFNbnEt0phgbw==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.4.0.tgz",
+ "integrity": "sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "8.4.0",
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
"node_modules/@typescript-eslint/parser": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.0.0.tgz",
@@ -3925,14 +3972,55 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.0.0.tgz",
- "integrity": "sha512-mJAFP2mZLTBwAn5WI4PMakpywfWFH5nQZezUQdSKV23Pqo6o9iShQg1hP2+0hJJXP2LnZkWPphdIq4juYYwCeg==",
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.4.0.tgz",
+ "integrity": "sha512-pu2PAmNrl9KX6TtirVOrbLPLwDmASpZhK/XU7WvoKoCUkdtq9zF7qQ7gna0GBZFN0hci0vHaSusiL2WpsQk37A==",
"dev": true,
"dependencies": {
- "@typescript-eslint/typescript-estree": "8.0.0",
- "@typescript-eslint/utils": "8.0.0",
+ "@typescript-eslint/typescript-estree": "8.4.0",
+ "@typescript-eslint/utils": "8.4.0",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.4.0.tgz",
+ "integrity": "sha512-T1RB3KQdskh9t3v/qv7niK6P8yvn7ja1mS7QK7XfRVL6wtZ8/mFs/FHf4fKvTA0rKnqnYxl/uHFNbnEt0phgbw==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.4.0.tgz",
+ "integrity": "sha512-kJ2OIP4dQw5gdI4uXsaxUZHRwWAGpREJ9Zq6D5L0BweyOrWsL6Sz0YcAZGWhvKnH7fm1J5YFE1JrQL0c9dd53A==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "8.4.0",
+ "@typescript-eslint/visitor-keys": "8.4.0",
"debug": "^4.3.4",
+ "fast-glob": "^3.3.2",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
"ts-api-utils": "^1.3.0"
},
"engines": {
@@ -3948,6 +4036,23 @@
}
}
},
+ "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.4.0.tgz",
+ "integrity": "sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "8.4.0",
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
"node_modules/@typescript-eslint/types": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.0.tgz",
@@ -3990,15 +4095,15 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.0.0.tgz",
- "integrity": "sha512-k/oS/A/3QeGLRvOWCg6/9rATJL5rec7/5s1YmdS0ZU6LHveJyGFwBvLhSRBv6i9xaj7etmosp+l+ViN1I9Aj/Q==",
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.4.0.tgz",
+ "integrity": "sha512-swULW8n1IKLjRAgciCkTCafyTHHfwVQFt8DovmaF69sKbOxTSFMmIZaSHjqO9i/RV0wIblaawhzvtva8Nmm7lQ==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "8.0.0",
- "@typescript-eslint/types": "8.0.0",
- "@typescript-eslint/typescript-estree": "8.0.0"
+ "@typescript-eslint/scope-manager": "8.4.0",
+ "@typescript-eslint/types": "8.4.0",
+ "@typescript-eslint/typescript-estree": "8.4.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -4011,6 +4116,81 @@
"eslint": "^8.57.0 || ^9.0.0"
}
},
+ "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.4.0.tgz",
+ "integrity": "sha512-n2jFxLeY0JmKfUqy3P70rs6vdoPjHK8P/w+zJcV3fk0b0BwRXC/zxRTEnAsgYT7MwdQDt/ZEbtdzdVC+hcpF0A==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "8.4.0",
+ "@typescript-eslint/visitor-keys": "8.4.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.4.0.tgz",
+ "integrity": "sha512-T1RB3KQdskh9t3v/qv7niK6P8yvn7ja1mS7QK7XfRVL6wtZ8/mFs/FHf4fKvTA0rKnqnYxl/uHFNbnEt0phgbw==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.4.0.tgz",
+ "integrity": "sha512-kJ2OIP4dQw5gdI4uXsaxUZHRwWAGpREJ9Zq6D5L0BweyOrWsL6Sz0YcAZGWhvKnH7fm1J5YFE1JrQL0c9dd53A==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "8.4.0",
+ "@typescript-eslint/visitor-keys": "8.4.0",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.3.2",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.4.0.tgz",
+ "integrity": "sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "8.4.0",
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
"node_modules/@typescript-eslint/visitor-keys": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.0.tgz",
diff --git a/package.json b/package.json
index b18bc9d05a..90dcff7f5f 100644
--- a/package.json
+++ b/package.json
@@ -81,7 +81,7 @@
"@testing-library/user-event": "^13.5.0",
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
- "@typescript-eslint/eslint-plugin": "^8.0.0",
+ "@typescript-eslint/eslint-plugin": "^8.4.0",
"@typescript-eslint/parser": "^8.0.0",
"@vitejs/plugin-legacy": "^5.4.1",
"@vitejs/plugin-react": "^4.3.1",
From 77b7a7a364cd290ea8ef93c8ccf43014057f5375 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 5 Sep 2024 17:43:22 +0200
Subject: [PATCH 113/130] Deps: Bump @sentry/react from 8.22.0 to 8.28.0
(#4145)
Bumps [@sentry/react](https://github.com/getsentry/sentry-javascript) from 8.22.0 to 8.28.0.
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.22.0...8.28.0)
---
updated-dependencies:
- dependency-name: "@sentry/react"
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package-lock.json | 114 +++++++++++++++++++++++-----------------------
package.json | 2 +-
2 files changed, 58 insertions(+), 58 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 6de0e05356..c000cc3d9e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,7 +10,7 @@
"license": "AGPL-3.0+",
"dependencies": {
"@reduxjs/toolkit": "^2.2.7",
- "@sentry/react": "^8.22.0",
+ "@sentry/react": "^8.28.0",
"@visx/axis": "^3.10.1",
"@visx/gradient": "^3.3.0",
"@visx/shape": "^3.5.0",
@@ -3182,97 +3182,97 @@
]
},
"node_modules/@sentry-internal/browser-utils": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.22.0.tgz",
- "integrity": "sha512-R0u8KPaSivueIwUOhmYxcisKaJq3gx+I0xOcWoluDB3OI1Ds/QOSP/vmTsMg/mjwG/nUJ8RRM8pj0s8vlqCrjg==",
+ "version": "8.28.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.28.0.tgz",
+ "integrity": "sha512-tE9++KEy8SlqibTmYymuxFVAnutsXBqrwQ936WJbjaMfkqXiro7C1El0ybkprskd0rKS7kln20Q6nQlNlMEoTA==",
"dependencies": {
- "@sentry/core": "8.22.0",
- "@sentry/types": "8.22.0",
- "@sentry/utils": "8.22.0"
+ "@sentry/core": "8.28.0",
+ "@sentry/types": "8.28.0",
+ "@sentry/utils": "8.28.0"
},
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry-internal/feedback": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.22.0.tgz",
- "integrity": "sha512-Sy2+v0xBmVnZ5LQ48603CvLy5vVQvAZ+hc9xQSAHexts07NkvApMU1qv26YNwxlAWfDha1wXiW6ryd4YDzaoVA==",
+ "version": "8.28.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.28.0.tgz",
+ "integrity": "sha512-5vYunPCDBLCJ8QNnhepacdYheiN+UtYxpGAIaC/zjBC1nDuBgWs+TfKPo1UlO/1sesfgs9ibpxtShOweucL61g==",
"dependencies": {
- "@sentry/core": "8.22.0",
- "@sentry/types": "8.22.0",
- "@sentry/utils": "8.22.0"
+ "@sentry/core": "8.28.0",
+ "@sentry/types": "8.28.0",
+ "@sentry/utils": "8.28.0"
},
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry-internal/replay": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.22.0.tgz",
- "integrity": "sha512-sF8RyMPJP1fSIyyBDAbtybvKCu0dy8ZAfMwLP7ZqEnWrhZqktVuqM7/++EAFMlD5YaWJXm1IDuOXjgSQjUtSIQ==",
+ "version": "8.28.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.28.0.tgz",
+ "integrity": "sha512-70jvzzOL5O74gahgXKyRkZgiYN93yly5gq+bbj4/6NRQ+EtPd285+ccy0laExdfyK0ugvvwD4v+1MQit52OAsg==",
"dependencies": {
- "@sentry-internal/browser-utils": "8.22.0",
- "@sentry/core": "8.22.0",
- "@sentry/types": "8.22.0",
- "@sentry/utils": "8.22.0"
+ "@sentry-internal/browser-utils": "8.28.0",
+ "@sentry/core": "8.28.0",
+ "@sentry/types": "8.28.0",
+ "@sentry/utils": "8.28.0"
},
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry-internal/replay-canvas": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.22.0.tgz",
- "integrity": "sha512-/gV8qN3JqWw0LXTMuCGB8RDI8Bx1VESNRBdh/7Cmc5+hxYBfcketuix3S8mHWcE/JO+Ed9g1Abzys6GphTB9LA==",
+ "version": "8.28.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.28.0.tgz",
+ "integrity": "sha512-RfpYHDHMUKGeEdx41QtHITjEn6P3tGaDPHvatqdrD3yv4j+wbJ6laX1PrIxCpGFUtjdzkqi/KUcvUd2kzbH/FA==",
"dependencies": {
- "@sentry-internal/replay": "8.22.0",
- "@sentry/core": "8.22.0",
- "@sentry/types": "8.22.0",
- "@sentry/utils": "8.22.0"
+ "@sentry-internal/replay": "8.28.0",
+ "@sentry/core": "8.28.0",
+ "@sentry/types": "8.28.0",
+ "@sentry/utils": "8.28.0"
},
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry/browser": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.22.0.tgz",
- "integrity": "sha512-t3b+/9WWcP9SQTWwrHrB57B33ENgmUjyFlW2+JSlCXkSJBSmAoquPZ/GPjOuPaSr3HIA0mu9uEr4A41d5diASQ==",
+ "version": "8.28.0",
+ "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.28.0.tgz",
+ "integrity": "sha512-i/gjMYzIGQiPFH1pCbdnTwH9xs9mTAqzN+goP3GWX5a58frc7h8vxyA/5z0yMd0aCW6U8mVxnoAT72vGbKbx0g==",
"dependencies": {
- "@sentry-internal/browser-utils": "8.22.0",
- "@sentry-internal/feedback": "8.22.0",
- "@sentry-internal/replay": "8.22.0",
- "@sentry-internal/replay-canvas": "8.22.0",
- "@sentry/core": "8.22.0",
- "@sentry/types": "8.22.0",
- "@sentry/utils": "8.22.0"
+ "@sentry-internal/browser-utils": "8.28.0",
+ "@sentry-internal/feedback": "8.28.0",
+ "@sentry-internal/replay": "8.28.0",
+ "@sentry-internal/replay-canvas": "8.28.0",
+ "@sentry/core": "8.28.0",
+ "@sentry/types": "8.28.0",
+ "@sentry/utils": "8.28.0"
},
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry/core": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.22.0.tgz",
- "integrity": "sha512-fYPnxp7UkY2tckaOtivIySxnJvlbekuxs+Qi6rkUv9JpF+TYKpt7OPNUAbgVIhS0xazAEN6iKTfmnmpUbFRLmQ==",
+ "version": "8.28.0",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.28.0.tgz",
+ "integrity": "sha512-+If9uubvpZpvaQQw4HLiKPhrSS9/KcoA/AcdQkNm+5CVwAoOmDPtyYfkPBgfo2hLZnZQqR1bwkz/PrNoOm+gqA==",
"dependencies": {
- "@sentry/types": "8.22.0",
- "@sentry/utils": "8.22.0"
+ "@sentry/types": "8.28.0",
+ "@sentry/utils": "8.28.0"
},
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry/react": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry/react/-/react-8.22.0.tgz",
- "integrity": "sha512-LcO8SPfjYsx3Zvg1mQwjreVvtriVxde+6njIJyXU9TArB0e8bFexvd4MGXdBExgW9aY449hNaStgKRWMNHeVHQ==",
- "dependencies": {
- "@sentry/browser": "8.22.0",
- "@sentry/core": "8.22.0",
- "@sentry/types": "8.22.0",
- "@sentry/utils": "8.22.0",
+ "version": "8.28.0",
+ "resolved": "https://registry.npmjs.org/@sentry/react/-/react-8.28.0.tgz",
+ "integrity": "sha512-rpeO8ikpAK7/9kVHc1IMtJc7A7IyPzswcFJ0uL1faCt8oZEzlotrQnEe6hgFnv4xvMledTrohnKj/fWVd55Aig==",
+ "dependencies": {
+ "@sentry/browser": "8.28.0",
+ "@sentry/core": "8.28.0",
+ "@sentry/types": "8.28.0",
+ "@sentry/utils": "8.28.0",
"hoist-non-react-statics": "^3.3.2"
},
"engines": {
@@ -3283,19 +3283,19 @@
}
},
"node_modules/@sentry/types": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.22.0.tgz",
- "integrity": "sha512-1MLK3xO+uF2oJaa+M98aLIrQsEHzV7xnVWPfE3MhejYLNQebj4rQnQKTut/xZNIF9W0Q+bRcakLarC3ce2a74g==",
+ "version": "8.28.0",
+ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.28.0.tgz",
+ "integrity": "sha512-hOfqfd92/AzBrEdMgmmV1VfOXJbIfleFTnerRl0mg/+CcNgP/6+Fdonp354TD56ouWNF2WkOM6sEKSXMWp6SEQ==",
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry/utils": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.22.0.tgz",
- "integrity": "sha512-0ITG2+3EtyMtyc/nQG8aB9z9eIQ4L43nM/KuNgYSnM1vPl/zegbaLT0Ek/xkQB1OLIOLkEPQ6x9GWe+248/n3g==",
+ "version": "8.28.0",
+ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.28.0.tgz",
+ "integrity": "sha512-smhk7PJpvDMQ2DB5p2qn9UeoUHdU41IgjMmS2xklZpa8tjzBTxDeWpGvrX2fuH67D9bAJuLC/XyZjJCHLoEW5g==",
"dependencies": {
- "@sentry/types": "8.22.0"
+ "@sentry/types": "8.28.0"
},
"engines": {
"node": ">=14.18"
diff --git a/package.json b/package.json
index 90dcff7f5f..c46a02a83e 100644
--- a/package.json
+++ b/package.json
@@ -33,7 +33,7 @@
},
"dependencies": {
"@reduxjs/toolkit": "^2.2.7",
- "@sentry/react": "^8.22.0",
+ "@sentry/react": "^8.28.0",
"@visx/axis": "^3.10.1",
"@visx/gradient": "^3.3.0",
"@visx/shape": "^3.5.0",
From c5e9ad2c45a908359745a0e5b9f1945b9fe19c0f Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 6 Sep 2024 08:40:41 +0200
Subject: [PATCH 114/130] Deps: Bump i18next from 23.12.2 to 23.14.0 (#4135)
Bumps [i18next](https://github.com/i18next/i18next) from 23.12.2 to 23.14.0.
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v23.12.2...v23.14.0)
---
updated-dependencies:
- dependency-name: i18next
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package-lock.json | 8 ++++----
package.json | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index c000cc3d9e..71091df0e1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -29,7 +29,7 @@
"fast-xml-parser": "^4.4.1",
"history": "^4.10.1",
"hoist-non-react-statics": "^3.3.2",
- "i18next": "^23.12.2",
+ "i18next": "^23.14.0",
"i18next-http-backend": "^2.5.2",
"ical.js": "^2.0.0",
"memoize-one": "^6.0.0",
@@ -7486,9 +7486,9 @@
}
},
"node_modules/i18next": {
- "version": "23.12.2",
- "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.12.2.tgz",
- "integrity": "sha512-XIeh5V+bi8SJSWGL3jqbTEBW5oD6rbP5L+E7dVQh1MNTxxYef0x15rhJVcRb7oiuq4jLtgy2SD8eFlf6P2cmqg==",
+ "version": "23.14.0",
+ "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.14.0.tgz",
+ "integrity": "sha512-Y5GL4OdA8IU2geRrt2+Uc1iIhsjICdHZzT9tNwQ3TVqdNzgxHToGCKf/TPRP80vTCAP6svg2WbbJL+Gx5MFQVA==",
"funding": [
{
"type": "individual",
diff --git a/package.json b/package.json
index c46a02a83e..72742497aa 100644
--- a/package.json
+++ b/package.json
@@ -52,7 +52,7 @@
"fast-xml-parser": "^4.4.1",
"history": "^4.10.1",
"hoist-non-react-statics": "^3.3.2",
- "i18next": "^23.12.2",
+ "i18next": "^23.14.0",
"i18next-http-backend": "^2.5.2",
"ical.js": "^2.0.0",
"memoize-one": "^6.0.0",
From 7cfb524d1c6ee890a657f526c453e789f4f1b703 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 6 Sep 2024 10:25:17 +0200
Subject: [PATCH 115/130] Deps: Bump i18next-http-backend from 2.5.2 to 2.6.1
(#4136)
Bumps [i18next-http-backend](https://github.com/i18next/i18next-http-backend) from 2.5.2 to 2.6.1.
- [Changelog](https://github.com/i18next/i18next-http-backend/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next-http-backend/compare/v2.5.2...v2.6.1)
---
updated-dependencies:
- dependency-name: i18next-http-backend
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package-lock.json | 8 ++++----
package.json | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 71091df0e1..0f0d172bb0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -30,7 +30,7 @@
"history": "^4.10.1",
"hoist-non-react-statics": "^3.3.2",
"i18next": "^23.14.0",
- "i18next-http-backend": "^2.5.2",
+ "i18next-http-backend": "^2.6.1",
"ical.js": "^2.0.0",
"memoize-one": "^6.0.0",
"moment": "^2.30.1",
@@ -7508,9 +7508,9 @@
}
},
"node_modules/i18next-http-backend": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.2.tgz",
- "integrity": "sha512-+K8HbDfrvc1/2X8jpb7RLhI9ZxBDpx3xogYkQwGKlWAUXLSEGXzgdt3EcUjLlBCdMwdQY+K+EUF6oh8oB6rwHw==",
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.6.1.tgz",
+ "integrity": "sha512-rCilMAnlEQNeKOZY1+x8wLM5IpYOj10guGvEpeC59tNjj6MMreLIjIW8D1RclhD3ifLwn6d/Y9HEM1RUE6DSog==",
"dependencies": {
"cross-fetch": "4.0.0"
}
diff --git a/package.json b/package.json
index 72742497aa..f63a55fa9b 100644
--- a/package.json
+++ b/package.json
@@ -53,7 +53,7 @@
"history": "^4.10.1",
"hoist-non-react-statics": "^3.3.2",
"i18next": "^23.14.0",
- "i18next-http-backend": "^2.5.2",
+ "i18next-http-backend": "^2.6.1",
"ical.js": "^2.0.0",
"memoize-one": "^6.0.0",
"moment": "^2.30.1",
From e12c5c742ca54e59a23662012e7e25bf5ebac02d Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 6 Sep 2024 11:05:40 +0200
Subject: [PATCH 116/130] Deps: Bump the patch-updates group across 1 directory
with 8 updates (#4147)
Bumps the patch-updates group with 8 updates in the / directory:
| Package | From | To |
| --- | --- | --- |
| [downshift](https://github.com/downshift-js/downshift) | `9.0.7` | `9.0.8` |
| [styled-components](https://github.com/styled-components/styled-components) | `6.1.12` | `6.1.13` |
| [@testing-library/react](https://github.com/testing-library/react-testing-library) | `16.0.0` | `16.0.1` |
| [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) | `18.3.3` | `18.3.5` |
| [@vitejs/plugin-legacy](https://github.com/vitejs/vite/tree/HEAD/packages/plugin-legacy) | `5.4.1` | `5.4.2` |
| [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) | `7.35.0` | `7.35.2` |
| [eslint-plugin-react-refresh](https://github.com/ArnaudBarre/eslint-plugin-react-refresh) | `0.4.9` | `0.4.11` |
| [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `5.4.2` | `5.4.3` |
Updates `downshift` from 9.0.7 to 9.0.8
- [Release notes](https://github.com/downshift-js/downshift/releases)
- [Changelog](https://github.com/downshift-js/downshift/blob/master/CHANGELOG.md)
- [Commits](https://github.com/downshift-js/downshift/compare/v9.0.7...v9.0.8)
Updates `styled-components` from 6.1.12 to 6.1.13
- [Release notes](https://github.com/styled-components/styled-components/releases)
- [Commits](https://github.com/styled-components/styled-components/compare/v6.1.12...v6.1.13)
Updates `@testing-library/react` from 16.0.0 to 16.0.1
- [Release notes](https://github.com/testing-library/react-testing-library/releases)
- [Changelog](https://github.com/testing-library/react-testing-library/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/react-testing-library/compare/v16.0.0...v16.0.1)
Updates `@types/react` from 18.3.3 to 18.3.5
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)
Updates `@vitejs/plugin-legacy` from 5.4.1 to 5.4.2
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/plugin-legacy/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.2/packages/plugin-legacy)
Updates `eslint-plugin-react` from 7.35.0 to 7.35.2
- [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases)
- [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.35.0...v7.35.2)
Updates `eslint-plugin-react-refresh` from 0.4.9 to 0.4.11
- [Release notes](https://github.com/ArnaudBarre/eslint-plugin-react-refresh/releases)
- [Changelog](https://github.com/ArnaudBarre/eslint-plugin-react-refresh/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ArnaudBarre/eslint-plugin-react-refresh/compare/v0.4.9...v0.4.11)
Updates `vite` from 5.4.2 to 5.4.3
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.3/packages/vite)
---
updated-dependencies:
- dependency-name: downshift
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: patch-updates
- dependency-name: styled-components
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: patch-updates
- dependency-name: "@testing-library/react"
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: patch-updates
- dependency-name: "@types/react"
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: patch-updates
- dependency-name: "@vitejs/plugin-legacy"
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: patch-updates
- dependency-name: eslint-plugin-react
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: patch-updates
- dependency-name: eslint-plugin-react-refresh
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: patch-updates
- dependency-name: vite
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: patch-updates
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package-lock.json | 1185 ++++++++++++++++++++++-----------------------
package.json | 16 +-
2 files changed, 595 insertions(+), 606 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 0f0d172bb0..ac87a1f829 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -24,7 +24,7 @@
"d3-interpolate": "^3.0.1",
"d3-scale": "^4.0.2",
"d3-shape": "^3.2.0",
- "downshift": "^9.0.7",
+ "downshift": "^9.0.8",
"fast-deep-equal": "^3.1.3",
"fast-xml-parser": "^4.4.1",
"history": "^4.10.1",
@@ -46,7 +46,7 @@
"react-router-dom": "^5.2.0",
"redux": "^5.0.1",
"redux-logger": "^3.0.6",
- "styled-components": "^6.1.12",
+ "styled-components": "^6.1.13",
"uuid": "^10.0.0",
"whatwg-fetch": "^3.6.20"
},
@@ -54,13 +54,13 @@
"@babel/cli": "^7.25.6",
"@pandatix/js-cvss": "^0.4.4",
"@testing-library/jest-dom": "^6.5.0",
- "@testing-library/react": "^16.0.0",
+ "@testing-library/react": "^16.0.1",
"@testing-library/user-event": "^13.5.0",
- "@types/react": "^18.3.3",
+ "@types/react": "^18.3.5",
"@types/react-dom": "^18.3.0",
"@typescript-eslint/eslint-plugin": "^8.4.0",
"@typescript-eslint/parser": "^8.0.0",
- "@vitejs/plugin-legacy": "^5.4.1",
+ "@vitejs/plugin-legacy": "^5.4.2",
"@vitejs/plugin-react": "^4.3.1",
"@vitest/coverage-v8": "^2.0.5",
"@vitest/ui": "^2.0.5",
@@ -68,9 +68,9 @@
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-header": "^3.1.1",
- "eslint-plugin-react": "^7.35.0",
+ "eslint-plugin-react": "^7.35.2",
"eslint-plugin-react-hooks": "^4.6.2",
- "eslint-plugin-react-refresh": "^0.4.9",
+ "eslint-plugin-react-refresh": "^0.4.11",
"eslint-plugin-vitest": "^0.5.4",
"eslint-plugin-vitest-globals": "^1.5.0",
"husky": "^2.7.0",
@@ -79,7 +79,7 @@
"lint-staged": "^13.1.0",
"prettier": "^3.3.3",
"typescript": "^5.5.4",
- "vite": "^5.4.2",
+ "vite": "^5.4.3",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-eslint2": "^4.4.0",
"vite-plugin-svgr": "^4.2.0",
@@ -164,11 +164,11 @@
}
},
"node_modules/@babel/code-frame": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.6.tgz",
- "integrity": "sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
+ "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
"dependencies": {
- "@babel/highlight": "^7.24.6",
+ "@babel/highlight": "^7.24.7",
"picocolors": "^1.0.0"
},
"engines": {
@@ -176,28 +176,28 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.6.tgz",
- "integrity": "sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==",
+ "version": "7.25.4",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz",
+ "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.6.tgz",
- "integrity": "sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==",
+ "version": "7.25.2",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz",
+ "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==",
"dependencies": {
"@ampproject/remapping": "^2.2.0",
- "@babel/code-frame": "^7.24.6",
- "@babel/generator": "^7.24.6",
- "@babel/helper-compilation-targets": "^7.24.6",
- "@babel/helper-module-transforms": "^7.24.6",
- "@babel/helpers": "^7.24.6",
- "@babel/parser": "^7.24.6",
- "@babel/template": "^7.24.6",
- "@babel/traverse": "^7.24.6",
- "@babel/types": "^7.24.6",
+ "@babel/code-frame": "^7.24.7",
+ "@babel/generator": "^7.25.0",
+ "@babel/helper-compilation-targets": "^7.25.2",
+ "@babel/helper-module-transforms": "^7.25.2",
+ "@babel/helpers": "^7.25.0",
+ "@babel/parser": "^7.25.0",
+ "@babel/template": "^7.25.0",
+ "@babel/traverse": "^7.25.2",
+ "@babel/types": "^7.25.2",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -221,11 +221,11 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.6.tgz",
- "integrity": "sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==",
+ "version": "7.25.6",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz",
+ "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==",
"dependencies": {
- "@babel/types": "^7.24.6",
+ "@babel/types": "^7.25.6",
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25",
"jsesc": "^2.5.1"
@@ -235,35 +235,36 @@
}
},
"node_modules/@babel/helper-annotate-as-pure": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.6.tgz",
- "integrity": "sha512-DitEzDfOMnd13kZnDqns1ccmftwJTS9DMkyn9pYTxulS7bZxUxpMly3Nf23QQ6NwA4UB8lAqjbqWtyvElEMAkg==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz",
+ "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==",
"dependencies": {
- "@babel/types": "^7.24.6"
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.6.tgz",
- "integrity": "sha512-+wnfqc5uHiMYtvRX7qu80Toef8BXeh4HHR1SPeonGb1SKPniNEd4a/nlaJJMv/OIEYvIVavvo0yR7u10Gqz0Iw==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz",
+ "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==",
"dependencies": {
- "@babel/types": "^7.24.6"
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-compilation-targets": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz",
- "integrity": "sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==",
+ "version": "7.25.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz",
+ "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==",
"dependencies": {
- "@babel/compat-data": "^7.24.6",
- "@babel/helper-validator-option": "^7.24.6",
- "browserslist": "^4.22.2",
+ "@babel/compat-data": "^7.25.2",
+ "@babel/helper-validator-option": "^7.24.8",
+ "browserslist": "^4.23.1",
"lru-cache": "^5.1.1",
"semver": "^6.3.1"
},
@@ -280,18 +281,16 @@
}
},
"node_modules/@babel/helper-create-class-features-plugin": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.6.tgz",
- "integrity": "sha512-djsosdPJVZE6Vsw3kk7IPRWethP94WHGOhQTc67SNXE0ZzMhHgALw8iGmYS0TD1bbMM0VDROy43od7/hN6WYcA==",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.24.6",
- "@babel/helper-environment-visitor": "^7.24.6",
- "@babel/helper-function-name": "^7.24.6",
- "@babel/helper-member-expression-to-functions": "^7.24.6",
- "@babel/helper-optimise-call-expression": "^7.24.6",
- "@babel/helper-replace-supers": "^7.24.6",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6",
- "@babel/helper-split-export-declaration": "^7.24.6",
+ "version": "7.25.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz",
+ "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.24.7",
+ "@babel/helper-member-expression-to-functions": "^7.24.8",
+ "@babel/helper-optimise-call-expression": "^7.24.7",
+ "@babel/helper-replace-supers": "^7.25.0",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+ "@babel/traverse": "^7.25.4",
"semver": "^6.3.1"
},
"engines": {
@@ -310,11 +309,11 @@
}
},
"node_modules/@babel/helper-create-regexp-features-plugin": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.6.tgz",
- "integrity": "sha512-C875lFBIWWwyv6MHZUG9HmRrlTDgOsLWZfYR0nW69gaKJNe0/Mpxx5r0EID2ZdHQkdUmQo2t0uNckTL08/1BgA==",
+ "version": "7.25.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz",
+ "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.24.6",
+ "@babel/helper-annotate-as-pure": "^7.24.7",
"regexpu-core": "^5.3.1",
"semver": "^6.3.1"
},
@@ -334,9 +333,9 @@
}
},
"node_modules/@babel/helper-define-polyfill-provider": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz",
- "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==",
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz",
+ "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==",
"dependencies": {
"@babel/helper-compilation-targets": "^7.22.6",
"@babel/helper-plugin-utils": "^7.22.5",
@@ -348,69 +347,39 @@
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
}
},
- "node_modules/@babel/helper-environment-visitor": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz",
- "integrity": "sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-function-name": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz",
- "integrity": "sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==",
- "dependencies": {
- "@babel/template": "^7.24.6",
- "@babel/types": "^7.24.6"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-hoist-variables": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz",
- "integrity": "sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==",
- "dependencies": {
- "@babel/types": "^7.24.6"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
"node_modules/@babel/helper-member-expression-to-functions": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.6.tgz",
- "integrity": "sha512-OTsCufZTxDUsv2/eDXanw/mUZHWOxSbEmC3pP8cgjcy5rgeVPWWMStnv274DV60JtHxTk0adT0QrCzC4M9NWGg==",
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz",
+ "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==",
"dependencies": {
- "@babel/types": "^7.24.6"
+ "@babel/traverse": "^7.24.8",
+ "@babel/types": "^7.24.8"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-imports": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz",
- "integrity": "sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz",
+ "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==",
"dependencies": {
- "@babel/types": "^7.24.6"
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-transforms": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz",
- "integrity": "sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==",
+ "version": "7.25.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz",
+ "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==",
"dependencies": {
- "@babel/helper-environment-visitor": "^7.24.6",
- "@babel/helper-module-imports": "^7.24.6",
- "@babel/helper-simple-access": "^7.24.6",
- "@babel/helper-split-export-declaration": "^7.24.6",
- "@babel/helper-validator-identifier": "^7.24.6"
+ "@babel/helper-module-imports": "^7.24.7",
+ "@babel/helper-simple-access": "^7.24.7",
+ "@babel/helper-validator-identifier": "^7.24.7",
+ "@babel/traverse": "^7.25.2"
},
"engines": {
"node": ">=6.9.0"
@@ -420,32 +389,32 @@
}
},
"node_modules/@babel/helper-optimise-call-expression": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.6.tgz",
- "integrity": "sha512-3SFDJRbx7KuPRl8XDUr8O7GAEB8iGyWPjLKJh/ywP/Iy9WOmEfMrsWbaZpvBu2HSYn4KQygIsz0O7m8y10ncMA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz",
+ "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==",
"dependencies": {
- "@babel/types": "^7.24.6"
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-plugin-utils": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz",
- "integrity": "sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==",
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz",
+ "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-remap-async-to-generator": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.6.tgz",
- "integrity": "sha512-1Qursq9ArRZPAMOZf/nuzVW8HgJLkTB9y9LfP4lW2MVp4e9WkLJDovfKBxoDcCk6VuzIxyqWHyBoaCtSRP10yg==",
+ "version": "7.25.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz",
+ "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.24.6",
- "@babel/helper-environment-visitor": "^7.24.6",
- "@babel/helper-wrap-function": "^7.24.6"
+ "@babel/helper-annotate-as-pure": "^7.24.7",
+ "@babel/helper-wrap-function": "^7.25.0",
+ "@babel/traverse": "^7.25.0"
},
"engines": {
"node": ">=6.9.0"
@@ -455,13 +424,13 @@
}
},
"node_modules/@babel/helper-replace-supers": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.6.tgz",
- "integrity": "sha512-mRhfPwDqDpba8o1F8ESxsEkJMQkUF8ZIWrAc0FtWhxnjfextxMWxr22RtFizxxSYLjVHDeMgVsRq8BBZR2ikJQ==",
+ "version": "7.25.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz",
+ "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==",
"dependencies": {
- "@babel/helper-environment-visitor": "^7.24.6",
- "@babel/helper-member-expression-to-functions": "^7.24.6",
- "@babel/helper-optimise-call-expression": "^7.24.6"
+ "@babel/helper-member-expression-to-functions": "^7.24.8",
+ "@babel/helper-optimise-call-expression": "^7.24.7",
+ "@babel/traverse": "^7.25.0"
},
"engines": {
"node": ">=6.9.0"
@@ -471,93 +440,84 @@
}
},
"node_modules/@babel/helper-simple-access": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz",
- "integrity": "sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz",
+ "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==",
"dependencies": {
- "@babel/types": "^7.24.6"
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-skip-transparent-expression-wrappers": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.6.tgz",
- "integrity": "sha512-jhbbkK3IUKc4T43WadP96a27oYti9gEf1LdyGSP2rHGH77kwLwfhO7TgwnWvxxQVmke0ImmCSS47vcuxEMGD3Q==",
- "dependencies": {
- "@babel/types": "^7.24.6"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-split-export-declaration": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz",
- "integrity": "sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz",
+ "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==",
"dependencies": {
- "@babel/types": "^7.24.6"
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-string-parser": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz",
- "integrity": "sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==",
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz",
+ "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz",
- "integrity": "sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
+ "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-option": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz",
- "integrity": "sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==",
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz",
+ "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-wrap-function": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.6.tgz",
- "integrity": "sha512-f1JLrlw/jbiNfxvdrfBgio/gRBk3yTAEJWirpAkiJG2Hb22E7cEYKHWo0dFPTv/niPovzIdPdEDetrv6tC6gPQ==",
+ "version": "7.25.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz",
+ "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==",
"dependencies": {
- "@babel/helper-function-name": "^7.24.6",
- "@babel/template": "^7.24.6",
- "@babel/types": "^7.24.6"
+ "@babel/template": "^7.25.0",
+ "@babel/traverse": "^7.25.0",
+ "@babel/types": "^7.25.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helpers": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.6.tgz",
- "integrity": "sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==",
+ "version": "7.25.6",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz",
+ "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==",
"dependencies": {
- "@babel/template": "^7.24.6",
- "@babel/types": "^7.24.6"
+ "@babel/template": "^7.25.0",
+ "@babel/types": "^7.25.6"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/highlight": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.6.tgz",
- "integrity": "sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
+ "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
"dependencies": {
- "@babel/helper-validator-identifier": "^7.24.6",
+ "@babel/helper-validator-identifier": "^7.24.7",
"chalk": "^2.4.2",
"js-tokens": "^4.0.0",
"picocolors": "^1.0.0"
@@ -631,9 +591,12 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.6.tgz",
- "integrity": "sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==",
+ "version": "7.25.6",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz",
+ "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==",
+ "dependencies": {
+ "@babel/types": "^7.25.6"
+ },
"bin": {
"parser": "bin/babel-parser.js"
},
@@ -642,12 +605,26 @@
}
},
"node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.6.tgz",
- "integrity": "sha512-bYndrJ6Ph6Ar+GaB5VAc0JPoP80bQCm4qon6JEzXfRl5QZyQ8Ur1K6k7htxWmPA5z+k7JQvaMUrtXlqclWYzKw==",
+ "version": "7.25.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz",
+ "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==",
"dependencies": {
- "@babel/helper-environment-visitor": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.8",
+ "@babel/traverse": "^7.25.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
+ "version": "7.25.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz",
+ "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.8"
},
"engines": {
"node": ">=6.9.0"
@@ -657,11 +634,11 @@
}
},
"node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.6.tgz",
- "integrity": "sha512-iVuhb6poq5ikqRq2XWU6OQ+R5o9wF+r/or9CeUyovgptz0UlnK4/seOQ1Istu/XybYjAhQv1FRSSfHHufIku5Q==",
+ "version": "7.25.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz",
+ "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.8"
},
"engines": {
"node": ">=6.9.0"
@@ -671,13 +648,13 @@
}
},
"node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.6.tgz",
- "integrity": "sha512-c8TER5xMDYzzFcGqOEp9l4hvB7dcbhcGjcLVwxWfe4P5DOafdwjsBJZKsmv+o3aXh7NhopvayQIovHrh2zSRUQ==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz",
+ "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6",
- "@babel/plugin-transform-optional-chaining": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+ "@babel/plugin-transform-optional-chaining": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -687,12 +664,12 @@
}
},
"node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.6.tgz",
- "integrity": "sha512-z8zEjYmwBUHN/pCF3NuWBhHQjJCrd33qAi8MgANfMrAvn72k2cImT8VjK9LJFu4ysOLJqhfkYYb3MvwANRUNZQ==",
+ "version": "7.25.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz",
+ "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==",
"dependencies": {
- "@babel/helper-environment-visitor": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.8",
+ "@babel/traverse": "^7.25.0"
},
"engines": {
"node": ">=6.9.0"
@@ -896,11 +873,11 @@
}
},
"node_modules/@babel/plugin-syntax-import-assertions": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.6.tgz",
- "integrity": "sha512-BE6o2BogJKJImTmGpkmOic4V0hlRRxVtzqxiSPa8TIFxyhi4EFjHm08nq1M4STK4RytuLMgnSz0/wfflvGFNOg==",
+ "version": "7.25.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz",
+ "integrity": "sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.8"
},
"engines": {
"node": ">=6.9.0"
@@ -910,11 +887,11 @@
}
},
"node_modules/@babel/plugin-syntax-import-attributes": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.6.tgz",
- "integrity": "sha512-D+CfsVZousPXIdudSII7RGy52+dYRtbyKAZcvtQKq/NpsivyMVduepzcLqG5pMBugtMdedxdC8Ramdpcne9ZWQ==",
+ "version": "7.25.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz",
+ "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.8"
},
"engines": {
"node": ">=6.9.0"
@@ -1083,11 +1060,11 @@
}
},
"node_modules/@babel/plugin-transform-arrow-functions": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.6.tgz",
- "integrity": "sha512-jSSSDt4ZidNMggcLx8SaKsbGNEfIl0PHx/4mFEulorE7bpYLbN0d3pDW3eJ7Y5Z3yPhy3L3NaPCYyTUY7TuugQ==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz",
+ "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1097,14 +1074,14 @@
}
},
"node_modules/@babel/plugin-transform-async-generator-functions": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.6.tgz",
- "integrity": "sha512-VEP2o4iR2DqQU6KPgizTW2mnMx6BG5b5O9iQdrW9HesLkv8GIA8x2daXBQxw1MrsIkFQGA/iJ204CKoQ8UcnAA==",
+ "version": "7.25.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz",
+ "integrity": "sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==",
"dependencies": {
- "@babel/helper-environment-visitor": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6",
- "@babel/helper-remap-async-to-generator": "^7.24.6",
- "@babel/plugin-syntax-async-generators": "^7.8.4"
+ "@babel/helper-plugin-utils": "^7.24.8",
+ "@babel/helper-remap-async-to-generator": "^7.25.0",
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/traverse": "^7.25.4"
},
"engines": {
"node": ">=6.9.0"
@@ -1114,13 +1091,13 @@
}
},
"node_modules/@babel/plugin-transform-async-to-generator": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.6.tgz",
- "integrity": "sha512-NTBA2SioI3OsHeIn6sQmhvXleSl9T70YY/hostQLveWs0ic+qvbA3fa0kwAwQ0OA/XGaAerNZRQGJyRfhbJK4g==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz",
+ "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==",
"dependencies": {
- "@babel/helper-module-imports": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6",
- "@babel/helper-remap-async-to-generator": "^7.24.6"
+ "@babel/helper-module-imports": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-remap-async-to-generator": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1130,11 +1107,11 @@
}
},
"node_modules/@babel/plugin-transform-block-scoped-functions": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.6.tgz",
- "integrity": "sha512-XNW7jolYHW9CwORrZgA/97tL/k05qe/HL0z/qqJq1mdWhwwCM6D4BJBV7wAz9HgFziN5dTOG31znkVIzwxv+vw==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz",
+ "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1144,11 +1121,11 @@
}
},
"node_modules/@babel/plugin-transform-block-scoping": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.6.tgz",
- "integrity": "sha512-S/t1Xh4ehW7sGA7c1j/hiOBLnEYCp/c2sEG4ZkL8kI1xX9tW2pqJTCHKtdhe/jHKt8nG0pFCrDHUXd4DvjHS9w==",
+ "version": "7.25.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz",
+ "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.8"
},
"engines": {
"node": ">=6.9.0"
@@ -1158,12 +1135,12 @@
}
},
"node_modules/@babel/plugin-transform-class-properties": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.6.tgz",
- "integrity": "sha512-j6dZ0Z2Z2slWLR3kt9aOmSIrBvnntWjMDN/TVcMPxhXMLmJVqX605CBRlcGI4b32GMbfifTEsdEjGjiE+j/c3A==",
+ "version": "7.25.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz",
+ "integrity": "sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==",
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-create-class-features-plugin": "^7.25.4",
+ "@babel/helper-plugin-utils": "^7.24.8"
},
"engines": {
"node": ">=6.9.0"
@@ -1173,12 +1150,12 @@
}
},
"node_modules/@babel/plugin-transform-class-static-block": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.6.tgz",
- "integrity": "sha512-1QSRfoPI9RoLRa8Mnakc6v3e0gJxiZQTYrMfLn+mD0sz5+ndSzwymp2hDcYJTyT0MOn0yuWzj8phlIvO72gTHA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz",
+ "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==",
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6",
+ "@babel/helper-create-class-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-class-static-block": "^7.14.5"
},
"engines": {
@@ -1189,17 +1166,15 @@
}
},
"node_modules/@babel/plugin-transform-classes": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.6.tgz",
- "integrity": "sha512-+fN+NO2gh8JtRmDSOB6gaCVo36ha8kfCW1nMq2Gc0DABln0VcHN4PrALDvF5/diLzIRKptC7z/d7Lp64zk92Fg==",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.24.6",
- "@babel/helper-compilation-targets": "^7.24.6",
- "@babel/helper-environment-visitor": "^7.24.6",
- "@babel/helper-function-name": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6",
- "@babel/helper-replace-supers": "^7.24.6",
- "@babel/helper-split-export-declaration": "^7.24.6",
+ "version": "7.25.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz",
+ "integrity": "sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.24.7",
+ "@babel/helper-compilation-targets": "^7.25.2",
+ "@babel/helper-plugin-utils": "^7.24.8",
+ "@babel/helper-replace-supers": "^7.25.0",
+ "@babel/traverse": "^7.25.4",
"globals": "^11.1.0"
},
"engines": {
@@ -1210,12 +1185,12 @@
}
},
"node_modules/@babel/plugin-transform-computed-properties": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.6.tgz",
- "integrity": "sha512-cRzPobcfRP0ZtuIEkA8QzghoUpSB3X3qSH5W2+FzG+VjWbJXExtx0nbRqwumdBN1x/ot2SlTNQLfBCnPdzp6kg==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz",
+ "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
- "@babel/template": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/template": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1225,11 +1200,11 @@
}
},
"node_modules/@babel/plugin-transform-destructuring": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.6.tgz",
- "integrity": "sha512-YLW6AE5LQpk5npNXL7i/O+U9CE4XsBCuRPgyjl1EICZYKmcitV+ayuuUGMJm2lC1WWjXYszeTnIxF/dq/GhIZQ==",
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz",
+ "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.8"
},
"engines": {
"node": ">=6.9.0"
@@ -1239,12 +1214,12 @@
}
},
"node_modules/@babel/plugin-transform-dotall-regex": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.6.tgz",
- "integrity": "sha512-rCXPnSEKvkm/EjzOtLoGvKseK+dS4kZwx1HexO3BtRtgL0fQ34awHn34aeSHuXtZY2F8a1X8xqBBPRtOxDVmcA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz",
+ "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1254,11 +1229,11 @@
}
},
"node_modules/@babel/plugin-transform-duplicate-keys": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.6.tgz",
- "integrity": "sha512-/8Odwp/aVkZwPFJMllSbawhDAO3UJi65foB00HYnK/uXvvCPm0TAXSByjz1mpRmp0q6oX2SIxpkUOpPFHk7FLA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz",
+ "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1267,12 +1242,27 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
+ "version": "7.25.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz",
+ "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.0",
+ "@babel/helper-plugin-utils": "^7.24.8"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
"node_modules/@babel/plugin-transform-dynamic-import": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.6.tgz",
- "integrity": "sha512-vpq8SSLRTBLOHUZHSnBqVo0AKX3PBaoPs2vVzYVWslXDTDIpwAcCDtfhUcHSQQoYoUvcFPTdC8TZYXu9ZnLT/w==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz",
+ "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-dynamic-import": "^7.8.3"
},
"engines": {
@@ -1283,12 +1273,12 @@
}
},
"node_modules/@babel/plugin-transform-exponentiation-operator": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.6.tgz",
- "integrity": "sha512-EemYpHtmz0lHE7hxxxYEuTYOOBZ43WkDgZ4arQ4r+VX9QHuNZC+WH3wUWmRNvR8ECpTRne29aZV6XO22qpOtdA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz",
+ "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==",
"dependencies": {
- "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1298,11 +1288,11 @@
}
},
"node_modules/@babel/plugin-transform-export-namespace-from": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.6.tgz",
- "integrity": "sha512-inXaTM1SVrIxCkIJ5gqWiozHfFMStuGbGJAxZFBoHcRRdDP0ySLb3jH6JOwmfiinPwyMZqMBX+7NBDCO4z0NSA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz",
+ "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-export-namespace-from": "^7.8.3"
},
"engines": {
@@ -1328,12 +1318,12 @@
}
},
"node_modules/@babel/plugin-transform-for-of": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.6.tgz",
- "integrity": "sha512-n3Sf72TnqK4nw/jziSqEl1qaWPbCRw2CziHH+jdRYvw4J6yeCzsj4jdw8hIntOEeDGTmHVe2w4MVL44PN0GMzg==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz",
+ "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1343,13 +1333,13 @@
}
},
"node_modules/@babel/plugin-transform-function-name": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.6.tgz",
- "integrity": "sha512-sOajCu6V0P1KPljWHKiDq6ymgqB+vfo3isUS4McqW1DZtvSVU2v/wuMhmRmkg3sFoq6GMaUUf8W4WtoSLkOV/Q==",
+ "version": "7.25.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz",
+ "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==",
"dependencies": {
- "@babel/helper-compilation-targets": "^7.24.6",
- "@babel/helper-function-name": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-compilation-targets": "^7.24.8",
+ "@babel/helper-plugin-utils": "^7.24.8",
+ "@babel/traverse": "^7.25.1"
},
"engines": {
"node": ">=6.9.0"
@@ -1359,11 +1349,11 @@
}
},
"node_modules/@babel/plugin-transform-json-strings": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.6.tgz",
- "integrity": "sha512-Uvgd9p2gUnzYJxVdBLcU0KurF8aVhkmVyMKW4MIY1/BByvs3EBpv45q01o7pRTVmTvtQq5zDlytP3dcUgm7v9w==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz",
+ "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-json-strings": "^7.8.3"
},
"engines": {
@@ -1374,11 +1364,11 @@
}
},
"node_modules/@babel/plugin-transform-literals": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.6.tgz",
- "integrity": "sha512-f2wHfR2HF6yMj+y+/y07+SLqnOSwRp8KYLpQKOzS58XLVlULhXbiYcygfXQxJlMbhII9+yXDwOUFLf60/TL5tw==",
+ "version": "7.25.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz",
+ "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.8"
},
"engines": {
"node": ">=6.9.0"
@@ -1388,11 +1378,11 @@
}
},
"node_modules/@babel/plugin-transform-logical-assignment-operators": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.6.tgz",
- "integrity": "sha512-EKaWvnezBCMkRIHxMJSIIylzhqK09YpiJtDbr2wsXTwnO0TxyjMUkaw4RlFIZMIS0iDj0KyIg7H7XCguHu/YDA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz",
+ "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
},
"engines": {
@@ -1403,11 +1393,11 @@
}
},
"node_modules/@babel/plugin-transform-member-expression-literals": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.6.tgz",
- "integrity": "sha512-9g8iV146szUo5GWgXpRbq/GALTnY+WnNuRTuRHWWFfWGbP9ukRL0aO/jpu9dmOPikclkxnNsjY8/gsWl6bmZJQ==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz",
+ "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1417,12 +1407,12 @@
}
},
"node_modules/@babel/plugin-transform-modules-amd": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.6.tgz",
- "integrity": "sha512-eAGogjZgcwqAxhyFgqghvoHRr+EYRQPFjUXrTYKBRb5qPnAVxOOglaxc4/byHqjvq/bqO2F3/CGwTHsgKJYHhQ==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz",
+ "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==",
"dependencies": {
- "@babel/helper-module-transforms": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-module-transforms": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1432,13 +1422,13 @@
}
},
"node_modules/@babel/plugin-transform-modules-commonjs": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.6.tgz",
- "integrity": "sha512-JEV8l3MHdmmdb7S7Cmx6rbNEjRCgTQMZxllveHO0mx6uiclB0NflCawlQQ6+o5ZrwjUBYPzHm2XoK4wqGVUFuw==",
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz",
+ "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==",
"dependencies": {
- "@babel/helper-module-transforms": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6",
- "@babel/helper-simple-access": "^7.24.6"
+ "@babel/helper-module-transforms": "^7.24.8",
+ "@babel/helper-plugin-utils": "^7.24.8",
+ "@babel/helper-simple-access": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1448,14 +1438,14 @@
}
},
"node_modules/@babel/plugin-transform-modules-systemjs": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.6.tgz",
- "integrity": "sha512-xg1Z0J5JVYxtpX954XqaaAT6NpAY6LtZXvYFCJmGFJWwtlz2EmJoR8LycFRGNE8dBKizGWkGQZGegtkV8y8s+w==",
+ "version": "7.25.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz",
+ "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==",
"dependencies": {
- "@babel/helper-hoist-variables": "^7.24.6",
- "@babel/helper-module-transforms": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6",
- "@babel/helper-validator-identifier": "^7.24.6"
+ "@babel/helper-module-transforms": "^7.25.0",
+ "@babel/helper-plugin-utils": "^7.24.8",
+ "@babel/helper-validator-identifier": "^7.24.7",
+ "@babel/traverse": "^7.25.0"
},
"engines": {
"node": ">=6.9.0"
@@ -1465,12 +1455,12 @@
}
},
"node_modules/@babel/plugin-transform-modules-umd": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.6.tgz",
- "integrity": "sha512-esRCC/KsSEUvrSjv5rFYnjZI6qv4R1e/iHQrqwbZIoRJqk7xCvEUiN7L1XrmW5QSmQe3n1XD88wbgDTWLbVSyg==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz",
+ "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==",
"dependencies": {
- "@babel/helper-module-transforms": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-module-transforms": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1480,12 +1470,12 @@
}
},
"node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.6.tgz",
- "integrity": "sha512-6DneiCiu91wm3YiNIGDWZsl6GfTTbspuj/toTEqLh9d4cx50UIzSdg+T96p8DuT7aJOBRhFyaE9ZvTHkXrXr6Q==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz",
+ "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1495,11 +1485,11 @@
}
},
"node_modules/@babel/plugin-transform-new-target": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.6.tgz",
- "integrity": "sha512-f8liz9JG2Va8A4J5ZBuaSdwfPqN6axfWRK+y66fjKYbwf9VBLuq4WxtinhJhvp1w6lamKUwLG0slK2RxqFgvHA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz",
+ "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1509,11 +1499,11 @@
}
},
"node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.6.tgz",
- "integrity": "sha512-+QlAiZBMsBK5NqrBWFXCYeXyiU1y7BQ/OYaiPAcQJMomn5Tyg+r5WuVtyEuvTbpV7L25ZSLfE+2E9ywj4FD48A==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz",
+ "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
},
"engines": {
@@ -1524,11 +1514,11 @@
}
},
"node_modules/@babel/plugin-transform-numeric-separator": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.6.tgz",
- "integrity": "sha512-6voawq8T25Jvvnc4/rXcWZQKKxUNZcKMS8ZNrjxQqoRFernJJKjE3s18Qo6VFaatG5aiX5JV1oPD7DbJhn0a4Q==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz",
+ "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-numeric-separator": "^7.10.4"
},
"engines": {
@@ -1539,14 +1529,14 @@
}
},
"node_modules/@babel/plugin-transform-object-rest-spread": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.6.tgz",
- "integrity": "sha512-OKmi5wiMoRW5Smttne7BwHM8s/fb5JFs+bVGNSeHWzwZkWXWValR1M30jyXo1s/RaqgwwhEC62u4rFH/FBcBPg==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz",
+ "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==",
"dependencies": {
- "@babel/helper-compilation-targets": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6",
+ "@babel/helper-compilation-targets": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-transform-parameters": "^7.24.6"
+ "@babel/plugin-transform-parameters": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1556,12 +1546,12 @@
}
},
"node_modules/@babel/plugin-transform-object-super": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.6.tgz",
- "integrity": "sha512-N/C76ihFKlZgKfdkEYKtaRUtXZAgK7sOY4h2qrbVbVTXPrKGIi8aww5WGe/+Wmg8onn8sr2ut6FXlsbu/j6JHg==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz",
+ "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
- "@babel/helper-replace-supers": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-replace-supers": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1571,11 +1561,11 @@
}
},
"node_modules/@babel/plugin-transform-optional-catch-binding": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.6.tgz",
- "integrity": "sha512-L5pZ+b3O1mSzJ71HmxSCmTVd03VOT2GXOigug6vDYJzE5awLI7P1g0wFcdmGuwSDSrQ0L2rDOe/hHws8J1rv3w==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz",
+ "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
},
"engines": {
@@ -1586,12 +1576,12 @@
}
},
"node_modules/@babel/plugin-transform-optional-chaining": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.6.tgz",
- "integrity": "sha512-cHbqF6l1QP11OkYTYQ+hhVx1E017O5ZcSPXk9oODpqhcAD1htsWG2NpHrrhthEO2qZomLK0FXS+u7NfrkF5aOQ==",
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz",
+ "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6",
+ "@babel/helper-plugin-utils": "^7.24.8",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
"@babel/plugin-syntax-optional-chaining": "^7.8.3"
},
"engines": {
@@ -1602,11 +1592,11 @@
}
},
"node_modules/@babel/plugin-transform-parameters": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.6.tgz",
- "integrity": "sha512-ST7guE8vLV+vI70wmAxuZpIKzVjvFX9Qs8bl5w6tN/6gOypPWUmMQL2p7LJz5E63vEGrDhAiYetniJFyBH1RkA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz",
+ "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1616,12 +1606,12 @@
}
},
"node_modules/@babel/plugin-transform-private-methods": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.6.tgz",
- "integrity": "sha512-T9LtDI0BgwXOzyXrvgLTT8DFjCC/XgWLjflczTLXyvxbnSR/gpv0hbmzlHE/kmh9nOvlygbamLKRo6Op4yB6aw==",
+ "version": "7.25.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz",
+ "integrity": "sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==",
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-create-class-features-plugin": "^7.25.4",
+ "@babel/helper-plugin-utils": "^7.24.8"
},
"engines": {
"node": ">=6.9.0"
@@ -1631,13 +1621,13 @@
}
},
"node_modules/@babel/plugin-transform-private-property-in-object": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.6.tgz",
- "integrity": "sha512-Qu/ypFxCY5NkAnEhCF86Mvg3NSabKsh/TPpBVswEdkGl7+FbsYHy1ziRqJpwGH4thBdQHh8zx+z7vMYmcJ7iaQ==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz",
+ "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.24.6",
- "@babel/helper-create-class-features-plugin": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6",
+ "@babel/helper-annotate-as-pure": "^7.24.7",
+ "@babel/helper-create-class-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-private-property-in-object": "^7.14.5"
},
"engines": {
@@ -1648,11 +1638,11 @@
}
},
"node_modules/@babel/plugin-transform-property-literals": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.6.tgz",
- "integrity": "sha512-oARaglxhRsN18OYsnPTpb8TcKQWDYNsPNmTnx5++WOAsUJ0cSC/FZVlIJCKvPbU4yn/UXsS0551CFKJhN0CaMw==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz",
+ "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1753,11 +1743,11 @@
}
},
"node_modules/@babel/plugin-transform-regenerator": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.6.tgz",
- "integrity": "sha512-SMDxO95I8WXRtXhTAc8t/NFQUT7VYbIWwJCJgEli9ml4MhqUMh4S6hxgH6SmAC3eAQNWCDJFxcFeEt9w2sDdXg==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz",
+ "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
+ "@babel/helper-plugin-utils": "^7.24.7",
"regenerator-transform": "^0.15.2"
},
"engines": {
@@ -1768,11 +1758,11 @@
}
},
"node_modules/@babel/plugin-transform-reserved-words": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.6.tgz",
- "integrity": "sha512-DcrgFXRRlK64dGE0ZFBPD5egM2uM8mgfrvTMOSB2yKzOtjpGegVYkzh3s1zZg1bBck3nkXiaOamJUqK3Syk+4A==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz",
+ "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1809,11 +1799,11 @@
}
},
"node_modules/@babel/plugin-transform-shorthand-properties": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.6.tgz",
- "integrity": "sha512-xnEUvHSMr9eOWS5Al2YPfc32ten7CXdH7Zwyyk7IqITg4nX61oHj+GxpNvl+y5JHjfN3KXE2IV55wAWowBYMVw==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz",
+ "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1823,12 +1813,12 @@
}
},
"node_modules/@babel/plugin-transform-spread": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.6.tgz",
- "integrity": "sha512-h/2j7oIUDjS+ULsIrNZ6/TKG97FgmEk1PXryk/HQq6op4XUUUwif2f69fJrzK0wza2zjCS1xhXmouACaWV5uPA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz",
+ "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1838,11 +1828,11 @@
}
},
"node_modules/@babel/plugin-transform-sticky-regex": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.6.tgz",
- "integrity": "sha512-fN8OcTLfGmYv7FnDrsjodYBo1DhPL3Pze/9mIIE2MGCT1KgADYIOD7rEglpLHZj8PZlC/JFX5WcD+85FLAQusw==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz",
+ "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1852,11 +1842,11 @@
}
},
"node_modules/@babel/plugin-transform-template-literals": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.6.tgz",
- "integrity": "sha512-BJbEqJIcKwrqUP+KfUIkxz3q8VzXe2R8Wv8TaNgO1cx+nNavxn/2+H8kp9tgFSOL6wYPPEgFvU6IKS4qoGqhmg==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz",
+ "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1866,11 +1856,11 @@
}
},
"node_modules/@babel/plugin-transform-typeof-symbol": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.6.tgz",
- "integrity": "sha512-IshCXQ+G9JIFJI7bUpxTE/oA2lgVLAIK8q1KdJNoPXOpvRaNjMySGuvLfBw/Xi2/1lLo953uE8hyYSDW3TSYig==",
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz",
+ "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.8"
},
"engines": {
"node": ">=6.9.0"
@@ -1897,11 +1887,11 @@
}
},
"node_modules/@babel/plugin-transform-unicode-escapes": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.6.tgz",
- "integrity": "sha512-bKl3xxcPbkQQo5eX9LjjDpU2xYHeEeNQbOhj0iPvetSzA+Tu9q/o5lujF4Sek60CM6MgYvOS/DJuwGbiEYAnLw==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz",
+ "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1911,12 +1901,12 @@
}
},
"node_modules/@babel/plugin-transform-unicode-property-regex": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.6.tgz",
- "integrity": "sha512-8EIgImzVUxy15cZiPii9GvLZwsy7Vxc+8meSlR3cXFmBIl5W5Tn9LGBf7CDKkHj4uVfNXCJB8RsVfnmY61iedA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz",
+ "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1926,12 +1916,12 @@
}
},
"node_modules/@babel/plugin-transform-unicode-regex": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.6.tgz",
- "integrity": "sha512-pssN6ExsvxaKU638qcWb81RrvvgZom3jDgU/r5xFZ7TONkZGFf4MhI2ltMb8OcQWhHyxgIavEU+hgqtbKOmsPA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz",
+ "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1941,12 +1931,12 @@
}
},
"node_modules/@babel/plugin-transform-unicode-sets-regex": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.6.tgz",
- "integrity": "sha512-quiMsb28oXWIDK0gXLALOJRXLgICLiulqdZGOaPPd0vRT7fQp74NtdADAVu+D8s00C+0Xs0MxVP0VKF/sZEUgw==",
+ "version": "7.25.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz",
+ "integrity": "sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-create-regexp-features-plugin": "^7.25.2",
+ "@babel/helper-plugin-utils": "^7.24.8"
},
"engines": {
"node": ">=6.9.0"
@@ -1956,26 +1946,27 @@
}
},
"node_modules/@babel/preset-env": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.6.tgz",
- "integrity": "sha512-CrxEAvN7VxfjOG8JNF2Y/eMqMJbZPZ185amwGUBp8D9USK90xQmv7dLdFSa+VbD7fdIqcy/Mfv7WtzG8+/qxKg==",
- "dependencies": {
- "@babel/compat-data": "^7.24.6",
- "@babel/helper-compilation-targets": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6",
- "@babel/helper-validator-option": "^7.24.6",
- "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.6",
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.6",
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.6",
- "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.6",
+ "version": "7.25.4",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.4.tgz",
+ "integrity": "sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw==",
+ "dependencies": {
+ "@babel/compat-data": "^7.25.4",
+ "@babel/helper-compilation-targets": "^7.25.2",
+ "@babel/helper-plugin-utils": "^7.24.8",
+ "@babel/helper-validator-option": "^7.24.8",
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3",
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7",
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0",
"@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
"@babel/plugin-syntax-async-generators": "^7.8.4",
"@babel/plugin-syntax-class-properties": "^7.12.13",
"@babel/plugin-syntax-class-static-block": "^7.14.5",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-syntax-export-namespace-from": "^7.8.3",
- "@babel/plugin-syntax-import-assertions": "^7.24.6",
- "@babel/plugin-syntax-import-attributes": "^7.24.6",
+ "@babel/plugin-syntax-import-assertions": "^7.24.7",
+ "@babel/plugin-syntax-import-attributes": "^7.24.7",
"@babel/plugin-syntax-import-meta": "^7.10.4",
"@babel/plugin-syntax-json-strings": "^7.8.3",
"@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
@@ -1987,59 +1978,60 @@
"@babel/plugin-syntax-private-property-in-object": "^7.14.5",
"@babel/plugin-syntax-top-level-await": "^7.14.5",
"@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
- "@babel/plugin-transform-arrow-functions": "^7.24.6",
- "@babel/plugin-transform-async-generator-functions": "^7.24.6",
- "@babel/plugin-transform-async-to-generator": "^7.24.6",
- "@babel/plugin-transform-block-scoped-functions": "^7.24.6",
- "@babel/plugin-transform-block-scoping": "^7.24.6",
- "@babel/plugin-transform-class-properties": "^7.24.6",
- "@babel/plugin-transform-class-static-block": "^7.24.6",
- "@babel/plugin-transform-classes": "^7.24.6",
- "@babel/plugin-transform-computed-properties": "^7.24.6",
- "@babel/plugin-transform-destructuring": "^7.24.6",
- "@babel/plugin-transform-dotall-regex": "^7.24.6",
- "@babel/plugin-transform-duplicate-keys": "^7.24.6",
- "@babel/plugin-transform-dynamic-import": "^7.24.6",
- "@babel/plugin-transform-exponentiation-operator": "^7.24.6",
- "@babel/plugin-transform-export-namespace-from": "^7.24.6",
- "@babel/plugin-transform-for-of": "^7.24.6",
- "@babel/plugin-transform-function-name": "^7.24.6",
- "@babel/plugin-transform-json-strings": "^7.24.6",
- "@babel/plugin-transform-literals": "^7.24.6",
- "@babel/plugin-transform-logical-assignment-operators": "^7.24.6",
- "@babel/plugin-transform-member-expression-literals": "^7.24.6",
- "@babel/plugin-transform-modules-amd": "^7.24.6",
- "@babel/plugin-transform-modules-commonjs": "^7.24.6",
- "@babel/plugin-transform-modules-systemjs": "^7.24.6",
- "@babel/plugin-transform-modules-umd": "^7.24.6",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.6",
- "@babel/plugin-transform-new-target": "^7.24.6",
- "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.6",
- "@babel/plugin-transform-numeric-separator": "^7.24.6",
- "@babel/plugin-transform-object-rest-spread": "^7.24.6",
- "@babel/plugin-transform-object-super": "^7.24.6",
- "@babel/plugin-transform-optional-catch-binding": "^7.24.6",
- "@babel/plugin-transform-optional-chaining": "^7.24.6",
- "@babel/plugin-transform-parameters": "^7.24.6",
- "@babel/plugin-transform-private-methods": "^7.24.6",
- "@babel/plugin-transform-private-property-in-object": "^7.24.6",
- "@babel/plugin-transform-property-literals": "^7.24.6",
- "@babel/plugin-transform-regenerator": "^7.24.6",
- "@babel/plugin-transform-reserved-words": "^7.24.6",
- "@babel/plugin-transform-shorthand-properties": "^7.24.6",
- "@babel/plugin-transform-spread": "^7.24.6",
- "@babel/plugin-transform-sticky-regex": "^7.24.6",
- "@babel/plugin-transform-template-literals": "^7.24.6",
- "@babel/plugin-transform-typeof-symbol": "^7.24.6",
- "@babel/plugin-transform-unicode-escapes": "^7.24.6",
- "@babel/plugin-transform-unicode-property-regex": "^7.24.6",
- "@babel/plugin-transform-unicode-regex": "^7.24.6",
- "@babel/plugin-transform-unicode-sets-regex": "^7.24.6",
+ "@babel/plugin-transform-arrow-functions": "^7.24.7",
+ "@babel/plugin-transform-async-generator-functions": "^7.25.4",
+ "@babel/plugin-transform-async-to-generator": "^7.24.7",
+ "@babel/plugin-transform-block-scoped-functions": "^7.24.7",
+ "@babel/plugin-transform-block-scoping": "^7.25.0",
+ "@babel/plugin-transform-class-properties": "^7.25.4",
+ "@babel/plugin-transform-class-static-block": "^7.24.7",
+ "@babel/plugin-transform-classes": "^7.25.4",
+ "@babel/plugin-transform-computed-properties": "^7.24.7",
+ "@babel/plugin-transform-destructuring": "^7.24.8",
+ "@babel/plugin-transform-dotall-regex": "^7.24.7",
+ "@babel/plugin-transform-duplicate-keys": "^7.24.7",
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0",
+ "@babel/plugin-transform-dynamic-import": "^7.24.7",
+ "@babel/plugin-transform-exponentiation-operator": "^7.24.7",
+ "@babel/plugin-transform-export-namespace-from": "^7.24.7",
+ "@babel/plugin-transform-for-of": "^7.24.7",
+ "@babel/plugin-transform-function-name": "^7.25.1",
+ "@babel/plugin-transform-json-strings": "^7.24.7",
+ "@babel/plugin-transform-literals": "^7.25.2",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.24.7",
+ "@babel/plugin-transform-member-expression-literals": "^7.24.7",
+ "@babel/plugin-transform-modules-amd": "^7.24.7",
+ "@babel/plugin-transform-modules-commonjs": "^7.24.8",
+ "@babel/plugin-transform-modules-systemjs": "^7.25.0",
+ "@babel/plugin-transform-modules-umd": "^7.24.7",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7",
+ "@babel/plugin-transform-new-target": "^7.24.7",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7",
+ "@babel/plugin-transform-numeric-separator": "^7.24.7",
+ "@babel/plugin-transform-object-rest-spread": "^7.24.7",
+ "@babel/plugin-transform-object-super": "^7.24.7",
+ "@babel/plugin-transform-optional-catch-binding": "^7.24.7",
+ "@babel/plugin-transform-optional-chaining": "^7.24.8",
+ "@babel/plugin-transform-parameters": "^7.24.7",
+ "@babel/plugin-transform-private-methods": "^7.25.4",
+ "@babel/plugin-transform-private-property-in-object": "^7.24.7",
+ "@babel/plugin-transform-property-literals": "^7.24.7",
+ "@babel/plugin-transform-regenerator": "^7.24.7",
+ "@babel/plugin-transform-reserved-words": "^7.24.7",
+ "@babel/plugin-transform-shorthand-properties": "^7.24.7",
+ "@babel/plugin-transform-spread": "^7.24.7",
+ "@babel/plugin-transform-sticky-regex": "^7.24.7",
+ "@babel/plugin-transform-template-literals": "^7.24.7",
+ "@babel/plugin-transform-typeof-symbol": "^7.24.8",
+ "@babel/plugin-transform-unicode-escapes": "^7.24.7",
+ "@babel/plugin-transform-unicode-property-regex": "^7.24.7",
+ "@babel/plugin-transform-unicode-regex": "^7.24.7",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.25.4",
"@babel/preset-modules": "0.1.6-no-external-plugins",
"babel-plugin-polyfill-corejs2": "^0.4.10",
- "babel-plugin-polyfill-corejs3": "^0.10.4",
+ "babel-plugin-polyfill-corejs3": "^0.10.6",
"babel-plugin-polyfill-regenerator": "^0.6.1",
- "core-js-compat": "^3.31.0",
+ "core-js-compat": "^3.37.1",
"semver": "^6.3.1"
},
"engines": {
@@ -2124,31 +2116,28 @@
}
},
"node_modules/@babel/template": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.6.tgz",
- "integrity": "sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==",
+ "version": "7.25.0",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz",
+ "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==",
"dependencies": {
- "@babel/code-frame": "^7.24.6",
- "@babel/parser": "^7.24.6",
- "@babel/types": "^7.24.6"
+ "@babel/code-frame": "^7.24.7",
+ "@babel/parser": "^7.25.0",
+ "@babel/types": "^7.25.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.6.tgz",
- "integrity": "sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==",
- "dependencies": {
- "@babel/code-frame": "^7.24.6",
- "@babel/generator": "^7.24.6",
- "@babel/helper-environment-visitor": "^7.24.6",
- "@babel/helper-function-name": "^7.24.6",
- "@babel/helper-hoist-variables": "^7.24.6",
- "@babel/helper-split-export-declaration": "^7.24.6",
- "@babel/parser": "^7.24.6",
- "@babel/types": "^7.24.6",
+ "version": "7.25.6",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz",
+ "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==",
+ "dependencies": {
+ "@babel/code-frame": "^7.24.7",
+ "@babel/generator": "^7.25.6",
+ "@babel/parser": "^7.25.6",
+ "@babel/template": "^7.25.0",
+ "@babel/types": "^7.25.6",
"debug": "^4.3.1",
"globals": "^11.1.0"
},
@@ -2157,12 +2146,12 @@
}
},
"node_modules/@babel/types": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.6.tgz",
- "integrity": "sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==",
+ "version": "7.25.6",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz",
+ "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==",
"dependencies": {
- "@babel/helper-string-parser": "^7.24.6",
- "@babel/helper-validator-identifier": "^7.24.6",
+ "@babel/helper-string-parser": "^7.24.8",
+ "@babel/helper-validator-identifier": "^7.24.7",
"to-fast-properties": "^2.0.0"
},
"engines": {
@@ -2851,9 +2840,9 @@
}
},
"node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.25",
@@ -3574,9 +3563,9 @@
"dev": true
},
"node_modules/@testing-library/react": {
- "version": "16.0.0",
- "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.0.tgz",
- "integrity": "sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==",
+ "version": "16.0.1",
+ "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.1.tgz",
+ "integrity": "sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==",
"dev": true,
"dependencies": {
"@babel/runtime": "^7.12.5"
@@ -3800,9 +3789,9 @@
"integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q=="
},
"node_modules/@types/react": {
- "version": "18.3.3",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz",
- "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==",
+ "version": "18.3.5",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.5.tgz",
+ "integrity": "sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==",
"dependencies": {
"@types/prop-types": "*",
"csstype": "^3.0.2"
@@ -4360,17 +4349,17 @@
}
},
"node_modules/@vitejs/plugin-legacy": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-5.4.1.tgz",
- "integrity": "sha512-kee0l7dVevCNs1l3u2PnihVunvQ0WTJL2UJ/siQGD3Iht546mR9NO16tCv32uCP6lcGO1QDLqlPqInJtV1FE7A==",
+ "version": "5.4.2",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-5.4.2.tgz",
+ "integrity": "sha512-hlyyQL+wEIyOWdwsUKX+0g3kBU4AbHmVzHarLvVKiGGGqLIYjttMvvjk6zGY8RD9dab6QuFNhDoxg0YFhQ26xA==",
"dev": true,
"dependencies": {
- "@babel/core": "^7.24.6",
- "@babel/preset-env": "^7.24.6",
- "browserslist": "^4.23.0",
+ "@babel/core": "^7.25.2",
+ "@babel/preset-env": "^7.25.3",
+ "browserslist": "^4.23.3",
"browserslist-to-esbuild": "^2.1.1",
- "core-js": "^3.37.1",
- "magic-string": "^0.30.10",
+ "core-js": "^3.38.0",
+ "magic-string": "^0.30.11",
"regenerator-runtime": "^0.14.1",
"systemjs": "^6.15.1"
},
@@ -4944,12 +4933,12 @@
}
},
"node_modules/babel-plugin-polyfill-corejs3": {
- "version": "0.10.4",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz",
- "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==",
+ "version": "0.10.6",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz",
+ "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==",
"dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.6.1",
- "core-js-compat": "^3.36.1"
+ "@babel/helper-define-polyfill-provider": "^0.6.2",
+ "core-js-compat": "^3.38.0"
},
"peerDependencies": {
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
@@ -5033,9 +5022,9 @@
}
},
"node_modules/browserslist": {
- "version": "4.23.0",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
- "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
+ "version": "4.23.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz",
+ "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==",
"funding": [
{
"type": "opencollective",
@@ -5051,10 +5040,10 @@
}
],
"dependencies": {
- "caniuse-lite": "^1.0.30001587",
- "electron-to-chromium": "^1.4.668",
- "node-releases": "^2.0.14",
- "update-browserslist-db": "^1.0.13"
+ "caniuse-lite": "^1.0.30001646",
+ "electron-to-chromium": "^1.5.4",
+ "node-releases": "^2.0.18",
+ "update-browserslist-db": "^1.1.0"
},
"bin": {
"browserslist": "cli.js"
@@ -5177,9 +5166,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001609",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001609.tgz",
- "integrity": "sha512-JFPQs34lHKx1B5t1EpQpWH4c+29zIyn/haGsbpfq3suuV9v56enjFt23zqijxGTMwy1p/4H2tjnQMY+p1WoAyA==",
+ "version": "1.0.30001658",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001658.tgz",
+ "integrity": "sha512-N2YVqWbJELVdrnsW5p+apoQyYt51aBMSsBZki1XZEfeBCexcM/sf4xiAHcXQBkuOwJBXtWF7aW1sYX6tKebPHw==",
"funding": [
{
"type": "opencollective",
@@ -5382,9 +5371,9 @@
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="
},
"node_modules/core-js": {
- "version": "3.37.1",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz",
- "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==",
+ "version": "3.38.1",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz",
+ "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==",
"hasInstallScript": true,
"funding": {
"type": "opencollective",
@@ -5392,11 +5381,11 @@
}
},
"node_modules/core-js-compat": {
- "version": "3.36.1",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz",
- "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==",
+ "version": "3.38.1",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz",
+ "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==",
"dependencies": {
- "browserslist": "^4.23.0"
+ "browserslist": "^4.23.3"
},
"funding": {
"type": "opencollective",
@@ -5902,9 +5891,9 @@
}
},
"node_modules/downshift": {
- "version": "9.0.7",
- "resolved": "https://registry.npmjs.org/downshift/-/downshift-9.0.7.tgz",
- "integrity": "sha512-B6JY4sJGEl9xBEJEvC/C+QYYYtPWN5RL+TlROJQfue9+ZFgrD/p1ZgGw73I0WSTNH9/h5q3LIKQA4FLd/N10vg==",
+ "version": "9.0.8",
+ "resolved": "https://registry.npmjs.org/downshift/-/downshift-9.0.8.tgz",
+ "integrity": "sha512-59BWD7+hSUQIM1DeNPLirNNnZIO9qMdIK5GQ/Uo8q34gT4B78RBlb9dhzgnh0HfQTJj4T/JKYD8KoLAlMWnTsA==",
"dependencies": {
"@babel/runtime": "^7.24.5",
"compute-scroll-into-view": "^3.1.0",
@@ -5923,9 +5912,9 @@
"dev": true
},
"node_modules/electron-to-chromium": {
- "version": "1.4.736",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz",
- "integrity": "sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q=="
+ "version": "1.5.16",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.16.tgz",
+ "integrity": "sha512-2gQpi2WYobXmz2q23FrOBYTLcI1O/P4heW3eqX+ldmPVDQELRqhiebV380EhlGG12NtnX1qbK/FHpN0ba+7bLA=="
},
"node_modules/emoji-regex": {
"version": "9.2.2",
@@ -6157,9 +6146,9 @@
}
},
"node_modules/escalade": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
- "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"engines": {
"node": ">=6"
}
@@ -6253,9 +6242,9 @@
}
},
"node_modules/eslint-plugin-react": {
- "version": "7.35.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz",
- "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==",
+ "version": "7.35.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.2.tgz",
+ "integrity": "sha512-Rbj2R9zwP2GYNcIak4xoAMV57hrBh3hTaR0k7hVjwCQgryE/pw5px4b13EYjduOI0hfXyZhwBxaGpOTbWSGzKQ==",
"dev": true,
"dependencies": {
"array-includes": "^3.1.8",
@@ -6297,9 +6286,9 @@
}
},
"node_modules/eslint-plugin-react-refresh": {
- "version": "0.4.9",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.9.tgz",
- "integrity": "sha512-QK49YrBAo5CLNLseZ7sZgvgTy21E6NEw22eZqc4teZfH8pxV3yXc9XXOYfUI6JNpw7mfHNkAeWtBxrTyykB6HA==",
+ "version": "0.4.11",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.11.tgz",
+ "integrity": "sha512-wrAKxMbVr8qhXTtIKfXqAn5SAtRZt0aXxe5P23Fh4pUAdC6XEsybGLB8P0PI4j1yYqOgUEUlzKAGDfo7rJOjcw==",
"dev": true,
"peerDependencies": {
"eslint": ">=7"
@@ -8649,12 +8638,12 @@
}
},
"node_modules/magic-string": {
- "version": "0.30.10",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz",
- "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==",
+ "version": "0.30.11",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz",
+ "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==",
"dev": true,
"dependencies": {
- "@jridgewell/sourcemap-codec": "^1.4.15"
+ "@jridgewell/sourcemap-codec": "^1.5.0"
}
},
"node_modules/magicast": {
@@ -8914,9 +8903,9 @@
}
},
"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=="
},
"node_modules/normalize-package-data": {
"version": "2.5.0",
@@ -10723,9 +10712,9 @@
"integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA=="
},
"node_modules/styled-components": {
- "version": "6.1.12",
- "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.12.tgz",
- "integrity": "sha512-n/O4PzRPhbYI0k1vKKayfti3C/IGcPf+DqcrOB7O/ab9x4u/zjqraneT5N45+sIe87cxrCApXM8Bna7NYxwoTA==",
+ "version": "6.1.13",
+ "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.13.tgz",
+ "integrity": "sha512-M0+N2xSnAtwcVAQeFEsGWFFxXDftHUD7XrKla06QbpUMmbmtFBMMTcKWvFXtWxuD5qQkB8iU5gk6QASlx2ZRMw==",
"dependencies": {
"@emotion/is-prop-valid": "1.2.2",
"@emotion/unitless": "0.8.1",
@@ -11154,9 +11143,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.0",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz",
+ "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==",
"funding": [
{
"type": "opencollective",
@@ -11172,8 +11161,8 @@
}
],
"dependencies": {
- "escalade": "^3.1.1",
- "picocolors": "^1.0.0"
+ "escalade": "^3.1.2",
+ "picocolors": "^1.0.1"
},
"bin": {
"update-browserslist-db": "cli.js"
@@ -11245,13 +11234,13 @@
"integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw=="
},
"node_modules/vite": {
- "version": "5.4.2",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.2.tgz",
- "integrity": "sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==",
+ "version": "5.4.3",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.3.tgz",
+ "integrity": "sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==",
"dev": true,
"dependencies": {
"esbuild": "^0.21.3",
- "postcss": "^8.4.41",
+ "postcss": "^8.4.43",
"rollup": "^4.20.0"
},
"bin": {
@@ -11425,9 +11414,9 @@
}
},
"node_modules/vite/node_modules/postcss": {
- "version": "8.4.42",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.42.tgz",
- "integrity": "sha512-hywKUQB9Ra4dR1mGhldy5Aj1X3MWDSIA1cEi+Uy0CjheLvP6Ual5RlwMCh8i/X121yEDLDIKBsrCQ8ba3FDMfQ==",
+ "version": "8.4.45",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz",
+ "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==",
"dev": true,
"funding": [
{
diff --git a/package.json b/package.json
index f63a55fa9b..ea8f342aaf 100644
--- a/package.json
+++ b/package.json
@@ -47,7 +47,7 @@
"d3-interpolate": "^3.0.1",
"d3-scale": "^4.0.2",
"d3-shape": "^3.2.0",
- "downshift": "^9.0.7",
+ "downshift": "^9.0.8",
"fast-deep-equal": "^3.1.3",
"fast-xml-parser": "^4.4.1",
"history": "^4.10.1",
@@ -69,7 +69,7 @@
"react-router-dom": "^5.2.0",
"redux": "^5.0.1",
"redux-logger": "^3.0.6",
- "styled-components": "^6.1.12",
+ "styled-components": "^6.1.13",
"uuid": "^10.0.0",
"whatwg-fetch": "^3.6.20"
},
@@ -77,13 +77,13 @@
"@babel/cli": "^7.25.6",
"@pandatix/js-cvss": "^0.4.4",
"@testing-library/jest-dom": "^6.5.0",
- "@testing-library/react": "^16.0.0",
+ "@testing-library/react": "^16.0.1",
"@testing-library/user-event": "^13.5.0",
- "@types/react": "^18.3.3",
+ "@types/react": "^18.3.5",
"@types/react-dom": "^18.3.0",
"@typescript-eslint/eslint-plugin": "^8.4.0",
"@typescript-eslint/parser": "^8.0.0",
- "@vitejs/plugin-legacy": "^5.4.1",
+ "@vitejs/plugin-legacy": "^5.4.2",
"@vitejs/plugin-react": "^4.3.1",
"@vitest/coverage-v8": "^2.0.5",
"@vitest/ui": "^2.0.5",
@@ -91,9 +91,9 @@
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-header": "^3.1.1",
- "eslint-plugin-react": "^7.35.0",
+ "eslint-plugin-react": "^7.35.2",
"eslint-plugin-react-hooks": "^4.6.2",
- "eslint-plugin-react-refresh": "^0.4.9",
+ "eslint-plugin-react-refresh": "^0.4.11",
"eslint-plugin-vitest": "^0.5.4",
"eslint-plugin-vitest-globals": "^1.5.0",
"husky": "^2.7.0",
@@ -102,7 +102,7 @@
"lint-staged": "^13.1.0",
"prettier": "^3.3.3",
"typescript": "^5.5.4",
- "vite": "^5.4.2",
+ "vite": "^5.4.3",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-eslint2": "^4.4.0",
"vite-plugin-svgr": "^4.2.0",
From 01d912d153c347c3b676dafa17d415665f6d0d32 Mon Sep 17 00:00:00 2001
From: daniele-mng
Date: Fri, 6 Sep 2024 14:42:03 +0200
Subject: [PATCH 117/130] fix-CI-step--upload-coverage
---
src/web/store/usersettings/actions.js | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/src/web/store/usersettings/actions.js b/src/web/store/usersettings/actions.js
index c046627fd6..9325b77f0e 100644
--- a/src/web/store/usersettings/actions.js
+++ b/src/web/store/usersettings/actions.js
@@ -52,11 +52,14 @@ export const setIsLoggedIn = isLoggedIn => ({
isLoggedIn: isLoggedIn === true,
});
-export const renewSessionTimeout = gmp => () => dispatch =>
- gmp.user
- .renewSession()
- .then(response => dispatch(setSessionTimeout(response.data)));
-
+export const renewSessionTimeout = gmp => () => async dispatch => {
+ try {
+ const response = await gmp.user.renewSession();
+ dispatch(setSessionTimeout(response.data));
+ } catch (error) {
+ console.error('Error renewing session:', error);
+ }
+};
export const updateTimezone = gmp => timezone => dispatch => {
gmp.setTimezone(timezone);
return Promise.resolve(dispatch(setTimezone(timezone)));
From 1bec2509359494e3125e9ecbc936ed5658ca8379 Mon Sep 17 00:00:00 2001
From: daniele-mng
Date: Tue, 10 Sep 2024 15:49:21 +0200
Subject: [PATCH 118/130] Update src/web/hooks/usePageFilter.js
Co-authored-by: Ahmed <144101267+a-h-abdelsalam@users.noreply.github.com>
---
src/web/hooks/usePageFilter.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/web/hooks/usePageFilter.js b/src/web/hooks/usePageFilter.js
index ce5730ab91..e7b9f472b1 100644
--- a/src/web/hooks/usePageFilter.js
+++ b/src/web/hooks/usePageFilter.js
@@ -47,7 +47,7 @@ const useDefaultFilter = pageName =>
*
* @param {String} pageName Name of the page
* @param {Object} options Options object
- * @param {String} gmpName Name of the GMP for filtering
+ * @param {String} gmpName GMP name for filtering
* @returns Array of the applied filter, boolean indicating if the filter is
* still loading, function to change the filter, function to remove the
* filter and function to reset the filter
From a9835908e11235572e8bddfc70237f64b8371305 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 10 Sep 2024 04:20:43 +0000
Subject: [PATCH 119/130] Bump path-to-regexp and react-router-dom
Removes [path-to-regexp](https://github.com/pillarjs/path-to-regexp). It's no longer used after updating ancestor dependency [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom). These dependencies need to be updated together.
Removes `path-to-regexp`
Updates `react-router-dom` from 5.3.4 to 6.26.2
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.26.2/packages/react-router-dom)
---
updated-dependencies:
- dependency-name: path-to-regexp
dependency-type: indirect
- dependency-name: react-router-dom
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
---
package-lock.json | 74 +++++++++++++++++++----------------------------
package.json | 2 +-
2 files changed, 30 insertions(+), 46 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index ac87a1f829..7063ee43f9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -43,7 +43,7 @@
"react-datepicker": "^6.0.0",
"react-dom": "^18.3.1",
"react-redux": "^9.1.2",
- "react-router-dom": "^5.2.0",
+ "react-router-dom": "^6.26.2",
"redux": "^5.0.1",
"redux-logger": "^3.0.6",
"styled-components": "^6.1.13",
@@ -2940,6 +2940,14 @@
}
}
},
+ "node_modules/@remix-run/router": {
+ "version": "1.19.2",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.2.tgz",
+ "integrity": "sha512-baiMx18+IMuD1yyvOGaHM9QrVUPGGG0jC+z+IPHnRJWUAUvaKuWKyE8gjDj2rzv3sz9zOGoRSPgeBVHRhZnBlA==",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/@rollup/pluginutils": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz",
@@ -8028,11 +8036,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
- },
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -9245,14 +9248,6 @@
"integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
"dev": true
},
- "node_modules/path-to-regexp": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
- "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
- "dependencies": {
- "isarray": "0.0.1"
- }
- },
"node_modules/path-type": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
@@ -9732,46 +9727,35 @@
}
},
"node_modules/react-router": {
- "version": "5.3.4",
- "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz",
- "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==",
- "dependencies": {
- "@babel/runtime": "^7.12.13",
- "history": "^4.9.0",
- "hoist-non-react-statics": "^3.1.0",
- "loose-envify": "^1.3.1",
- "path-to-regexp": "^1.7.0",
- "prop-types": "^15.6.2",
- "react-is": "^16.6.0",
- "tiny-invariant": "^1.0.2",
- "tiny-warning": "^1.0.0"
+ "version": "6.26.2",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.2.tgz",
+ "integrity": "sha512-tvN1iuT03kHgOFnLPfLJ8V95eijteveqdOSk+srqfePtQvqCExB8eHOYnlilbOcyJyKnYkr1vJvf7YqotAJu1A==",
+ "dependencies": {
+ "@remix-run/router": "1.19.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
},
"peerDependencies": {
- "react": ">=15"
+ "react": ">=16.8"
}
},
"node_modules/react-router-dom": {
- "version": "5.3.4",
- "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz",
- "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==",
- "dependencies": {
- "@babel/runtime": "^7.12.13",
- "history": "^4.9.0",
- "loose-envify": "^1.3.1",
- "prop-types": "^15.6.2",
- "react-router": "5.3.4",
- "tiny-invariant": "^1.0.2",
- "tiny-warning": "^1.0.0"
+ "version": "6.26.2",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.2.tgz",
+ "integrity": "sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==",
+ "dependencies": {
+ "@remix-run/router": "1.19.2",
+ "react-router": "6.26.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
},
"peerDependencies": {
- "react": ">=15"
+ "react": ">=16.8",
+ "react-dom": ">=16.8"
}
},
- "node_modules/react-router/node_modules/react-is": {
- "version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
- },
"node_modules/read-pkg": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
diff --git a/package.json b/package.json
index ea8f342aaf..54e870d2ed 100644
--- a/package.json
+++ b/package.json
@@ -66,7 +66,7 @@
"react-datepicker": "^6.0.0",
"react-dom": "^18.3.1",
"react-redux": "^9.1.2",
- "react-router-dom": "^5.2.0",
+ "react-router-dom": "^6.26.2",
"redux": "^5.0.1",
"redux-logger": "^3.0.6",
"styled-components": "^6.1.13",
From ec0f668112501e93e2a042d84618962237191f0c Mon Sep 17 00:00:00 2001
From: daniele-mng
Date: Wed, 11 Sep 2024 09:50:08 +0200
Subject: [PATCH 120/130] change: update files for react-router v6
---
package-lock.json | 76 +---
package.json | 7 +-
src/web/authorized.jsx | 145 +++----
src/web/components/bar/menubar.jsx | 23 +-
.../conditionalRoute/ConditionalRoute.jsx | 9 +-
.../__tests__/ConditionalRoute.jsx | 15 +-
.../__snapshots__/multistepfooter.jsx.snap | 88 ++---
.../components/link/__tests__/certlink.jsx | 29 +-
src/web/components/link/__tests__/cvelink.jsx | 15 +-
.../components/link/__tests__/detailslink.jsx | 27 +-
src/web/components/link/__tests__/link.jsx | 47 ++-
src/web/components/link/link.jsx | 32 +-
.../__tests__/__snapshots__/usermenu.jsx.snap | 78 ++--
.../components/menu/__tests__/usermenu.jsx | 4 +-
src/web/components/menu/usermenu.jsx | 6 +-
.../components/observer/locationobserver.jsx | 11 +-
.../__snapshots__/booleanfiltergroup.jsx.snap | 44 +--
.../createnamedfiltergroup.jsx.snap | 96 ++---
.../__snapshots__/filtersearchgroup.jsx.snap | 18 +-
.../__snapshots__/filterstringgroup.jsx.snap | 18 +-
.../__snapshots__/minqodgroup.jsx.snap | 44 +--
.../__snapshots__/detailstable.jsx.snap | 16 +-
src/web/entities/container.jsx | 14 +-
src/web/entity/component.jsx | 19 +-
src/web/entity/withEntityContainer.jsx | 125 +++----
src/web/hooks/__tests__/usePageFilter.jsx | 8 +-
src/web/hooks/usePageFilter.js | 8 +-
.../__tests__/__snapshots__/details.jsx.snap | 38 +-
src/web/pages/audits/component.jsx | 4 +-
.../pages/hosts/dashboard/topologydisplay.jsx | 9 +-
.../hosts/dashboard/vulnscoredisplay.jsx | 8 +-
src/web/pages/login/__tests__/loginpage.jsx | 4 +-
src/web/pages/login/loginpage.jsx | 15 +-
src/web/pages/omp.jsx | 21 +-
.../dashboard/vulnscoredisplay.jsx | 8 +-
src/web/pages/page.jsx | 3 +-
.../__tests__/__snapshots__/details.jsx.snap | 14 +-
.../__snapshots__/component.jsx.snap | 98 ++---
.../__tests__/__snapshots__/details.jsx.snap | 16 +-
.../pages/reports/auditdeltadetailspage.jsx | 17 +-
src/web/pages/reports/auditdetailspage.jsx | 23 +-
.../pages/reports/auditreportslistpage.jsx | 35 +-
src/web/pages/reports/deltadetailspage.jsx | 15 +-
.../pages/reports/details/toolbaricons.jsx | 3 +-
src/web/pages/reports/detailspage.jsx | 13 +-
src/web/pages/reports/listpage.jsx | 21 +-
.../__tests__/__snapshots__/details.jsx.snap | 14 +-
.../__snapshots__/editdialog.jsx.snap | 354 +++++++++---------
.../autodeletereportsgroup.jsx.snap | 44 +--
.../__tests__/__snapshots__/details.jsx.snap | 38 +-
src/web/pages/tasks/dashboard/highresults.jsx | 8 +-
.../pages/tasks/dashboard/mosthighresults.jsx | 8 +-
src/web/pages/tasks/detailspage.jsx | 32 +-
src/web/routes.jsx | 316 ++++++++--------
src/web/utils/testing.jsx | 19 +-
src/web/utils/withRouter.jsx | 25 ++
56 files changed, 1085 insertions(+), 1160 deletions(-)
create mode 100644 src/web/utils/withRouter.jsx
diff --git a/package-lock.json b/package-lock.json
index 7063ee43f9..b1c40d5907 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -27,7 +27,6 @@
"downshift": "^9.0.8",
"fast-deep-equal": "^3.1.3",
"fast-xml-parser": "^4.4.1",
- "history": "^4.10.1",
"hoist-non-react-statics": "^3.3.2",
"i18next": "^23.14.0",
"i18next-http-backend": "^2.6.1",
@@ -36,8 +35,6 @@
"moment": "^2.30.1",
"moment-timezone": "^0.5.45",
"prop-types": "^15.8.1",
- "qhistory": "^1.1.0",
- "qs": "^6.13.0",
"react": "^18.3.1",
"react-beautiful-dnd": "^13.1.1",
"react-datepicker": "^6.0.0",
@@ -5098,6 +5095,7 @@
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+ "dev": true,
"dependencies": {
"es-define-property": "^1.0.0",
"es-errors": "^1.3.0",
@@ -5802,6 +5800,7 @@
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
"integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
"dependencies": {
"es-define-property": "^1.0.0",
"es-errors": "^1.3.0",
@@ -6023,6 +6022,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+ "dev": true,
"dependencies": {
"get-intrinsic": "^1.2.4"
},
@@ -6034,6 +6034,7 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
"engines": {
"node": ">= 0.4"
}
@@ -6996,6 +6997,7 @@
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+ "dev": true,
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2",
@@ -7149,6 +7151,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "dev": true,
"dependencies": {
"get-intrinsic": "^1.1.3"
},
@@ -7184,6 +7187,7 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
"integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dev": true,
"dependencies": {
"es-define-property": "^1.0.0"
},
@@ -7195,6 +7199,7 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
"integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+ "dev": true,
"engines": {
"node": ">= 0.4"
},
@@ -7206,6 +7211,7 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "dev": true,
"engines": {
"node": ">= 0.4"
},
@@ -7239,19 +7245,6 @@
"node": ">= 0.4"
}
},
- "node_modules/history": {
- "version": "4.10.1",
- "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz",
- "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==",
- "dependencies": {
- "@babel/runtime": "^7.1.2",
- "loose-envify": "^1.2.0",
- "resolve-pathname": "^3.0.0",
- "tiny-invariant": "^1.0.2",
- "tiny-warning": "^1.0.0",
- "value-equal": "^1.0.1"
- }
- },
"node_modules/hoist-non-react-statics": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
@@ -7618,14 +7611,6 @@
"node": ">=12"
}
},
- "node_modules/invariant": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
- "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
- "dependencies": {
- "loose-envify": "^1.0.0"
- }
- },
"node_modules/is-array-buffer": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
@@ -8979,6 +8964,7 @@
"version": "1.13.1",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
"integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
+ "dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -9522,31 +9508,6 @@
"node": ">=6"
}
},
- "node_modules/qhistory": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/qhistory/-/qhistory-1.1.0.tgz",
- "integrity": "sha512-mb5x+kKmEVSnUAX/loL20Y0kr1l4RZf7Al0Z1aNlwRL7nZo/QE46lRzLDro6CTNKcSUjiTOSQuFGRk4sU+FRUQ==",
- "dependencies": {
- "invariant": "^2.2.2"
- },
- "peerDependencies": {
- "history": ">=4.0.0"
- }
- },
- "node_modules/qs": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
- "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
- "dependencies": {
- "side-channel": "^1.0.6"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/querystringify": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
@@ -9987,11 +9948,6 @@
"node": ">=4"
}
},
- "node_modules/resolve-pathname": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz",
- "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng=="
- },
"node_modules/restore-cursor": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz",
@@ -10230,6 +10186,7 @@
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
"integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dev": true,
"dependencies": {
"define-data-property": "^1.1.4",
"es-errors": "^1.3.0",
@@ -10287,6 +10244,7 @@
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
"integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+ "dev": true,
"dependencies": {
"call-bind": "^1.0.7",
"es-errors": "^1.3.0",
@@ -10837,11 +10795,6 @@
"resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
"integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="
},
- "node_modules/tiny-warning": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
- "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
- },
"node_modules/tinybench": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
@@ -11212,11 +11165,6 @@
"spdx-expression-parse": "^3.0.0"
}
},
- "node_modules/value-equal": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz",
- "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw=="
- },
"node_modules/vite": {
"version": "5.4.3",
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.3.tgz",
diff --git a/package.json b/package.json
index 54e870d2ed..d2ab577c31 100644
--- a/package.json
+++ b/package.json
@@ -13,7 +13,7 @@
"type": "git",
"url": "https://github.com/greenbone/gsa/"
},
- "author": "Bj\u00f6rn Ricks ",
+ "author": "Björn Ricks ",
"license": "AGPL-3.0+",
"type": "module",
"scripts": {
@@ -50,7 +50,6 @@
"downshift": "^9.0.8",
"fast-deep-equal": "^3.1.3",
"fast-xml-parser": "^4.4.1",
- "history": "^4.10.1",
"hoist-non-react-statics": "^3.3.2",
"i18next": "^23.14.0",
"i18next-http-backend": "^2.6.1",
@@ -59,8 +58,6 @@
"moment": "^2.30.1",
"moment-timezone": "^0.5.45",
"prop-types": "^15.8.1",
- "qhistory": "^1.1.0",
- "qs": "^6.13.0",
"react": "^18.3.1",
"react-beautiful-dnd": "^13.1.1",
"react-datepicker": "^6.0.0",
@@ -118,4 +115,4 @@
"prettier --write"
]
}
-}
\ No newline at end of file
+}
diff --git a/src/web/authorized.jsx b/src/web/authorized.jsx
index 687ac32046..adacf84657 100644
--- a/src/web/authorized.jsx
+++ b/src/web/authorized.jsx
@@ -3,108 +3,65 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-import React from 'react';
-
-import {connect} from 'react-redux';
-
-import {withRouter} from 'react-router-dom';
-
-import {isDefined} from 'gmp/utils/identity';
-
+import {useEffect, useCallback} from 'react';
import {setIsLoggedIn} from './store/usersettings/actions';
-import {isLoggedIn} from 'web/store/usersettings/selectors';
-
-import compose from 'web/utils/compose';
+import {isLoggedIn as selectIsLoggedIn} from 'web/store/usersettings/selectors';
import PropTypes from 'web/utils/proptypes';
-import withGmp from 'web/utils/withGmp';
-
-class Authorized extends React.Component {
- constructor(...args) {
- super(...args);
-
- this.responseError = this.responseError.bind(this);
- }
-
- componentDidMount() {
- const {gmp} = this.props;
-
- this.responseError = this.responseError.bind(this);
-
- this.unsubscribe = gmp.addHttpErrorHandler(this.responseError);
-
- this.checkIsLoggedIn();
- }
-
- componentWillUnmount() {
- if (isDefined(this.unsubscribe)) {
- this.unsubscribe();
- }
- }
-
- componentDidUpdate() {
- this.checkIsLoggedIn();
- }
-
- responseError(xhr) {
- const {logout} = this.props;
-
- if (xhr.status === 401) {
- logout();
- return Promise.resolve(xhr);
- }
- return Promise.reject(xhr);
- }
-
- checkIsLoggedIn() {
- if (!this.props.isLoggedIn) {
- this.toLoginPage();
+import useGmp from 'web/hooks/useGmp';
+import {useDispatch, useSelector} from 'react-redux';
+import {useNavigate, useLocation} from 'react-router-dom';
+
+const Authorized = ({children}) => {
+ const gmp = useGmp();
+ const dispatch = useDispatch();
+ const navigate = useNavigate();
+ const location = useLocation();
+ const isLoggedIn = useSelector(selectIsLoggedIn);
+
+ const logout = useCallback(() => {
+ gmp.logout();
+ dispatch(setIsLoggedIn(false));
+ }, [dispatch, gmp]);
+
+ const responseError = useCallback(
+ xhr => {
+ if (xhr.status === 401) {
+ logout();
+ return Promise.resolve(xhr);
+ }
+ return Promise.reject(new Error(xhr));
+ },
+ [logout],
+ );
+
+ const checkIsLoggedIn = useCallback(() => {
+ if (!isLoggedIn) {
+ navigate('/login', {
+ state: {next: location.pathname},
+ });
}
- }
+ }, [isLoggedIn, location.pathname, navigate]);
- toLoginPage() {
- const {history, location} = this.props;
+ useEffect(() => {
+ const unsubscribe = gmp.addHttpErrorHandler(responseError);
+ checkIsLoggedIn();
- if (location.pathname === '/login') {
- // already at login page
- return;
- }
+ return () => {
+ if (unsubscribe) {
+ unsubscribe();
+ }
+ };
+ }, [gmp, responseError, checkIsLoggedIn]);
- history.replace('/login', {
- next: this.props.location.pathname,
- });
- }
+ useEffect(() => {
+ checkIsLoggedIn();
+ }, [isLoggedIn, checkIsLoggedIn]);
- render() {
- return this.props.isLoggedIn ? this.props.children : null;
- }
-}
+ return isLoggedIn ? children : null;
+};
Authorized.propTypes = {
- gmp: PropTypes.gmp.isRequired,
- history: PropTypes.object.isRequired,
- isLoggedIn: PropTypes.bool.isRequired,
- location: PropTypes.object.isRequired,
- logout: PropTypes.func.isRequired,
+ children: PropTypes.node.isRequired,
};
-const mapStateToProps = rootState => ({
- isLoggedIn: isLoggedIn(rootState),
-});
-
-const mapDispatchToProps = (dispatch, {gmp}) => ({
- logout: () => {
- gmp.logout();
- dispatch(setIsLoggedIn(false));
- },
-});
-
-export default compose(
- withGmp,
- withRouter,
- connect(
- mapStateToProps,
- mapDispatchToProps,
- ),
-)(Authorized);
-
-// vim: set ts=2 sw=2 tw=80:
+export default Authorized;
diff --git a/src/web/components/bar/menubar.jsx b/src/web/components/bar/menubar.jsx
index 9d1315365b..388586c6b0 100644
--- a/src/web/components/bar/menubar.jsx
+++ b/src/web/components/bar/menubar.jsx
@@ -54,9 +54,8 @@ const MenuBarPlaceholder = styled.div`
// eslint-disable-next-line no-shadow
const MenuBar = ({isLoggedIn}) => {
-
const caps = useCapabilities();
-
+
if (!isLoggedIn || !isDefined(caps)) {
return null;
}
@@ -115,7 +114,7 @@ const MenuBar = ({isLoggedIn}) => {
+
{may_op_scans && (
{caps.mayAccess('tasks') && (
@@ -170,13 +169,13 @@ const MenuBar = ({isLoggedIn}) => {
{caps.mayAccess('audits') && (
)}
- {caps.featureEnabled('COMPLIANCE_REPORTS') &&
- caps.mayAccess('audits') && (
-
- )}
+ {caps.featureEnabled('COMPLIANCE_REPORTS') &&
+ caps.mayAccess('audits') && (
+
+ )}
)}
@@ -294,8 +293,6 @@ const mapStateToProps = rootState => ({
isLoggedIn: isLoggedIn(rootState),
});
-export default compose(
- connect(mapStateToProps),
-)(MenuBar);
+export default compose(connect(mapStateToProps))(MenuBar);
// vim: set ts=2 sw=2 tw=80:
diff --git a/src/web/components/conditionalRoute/ConditionalRoute.jsx b/src/web/components/conditionalRoute/ConditionalRoute.jsx
index 97323b30fc..6e9cecb75b 100644
--- a/src/web/components/conditionalRoute/ConditionalRoute.jsx
+++ b/src/web/components/conditionalRoute/ConditionalRoute.jsx
@@ -5,7 +5,7 @@
import PropTypes from 'prop-types';
-import {Route, Redirect} from 'react-router-dom';
+import {Navigate} from 'react-router-dom';
import useCapabilities from 'web/hooks/useCapabilities';
const ConditionalRoute = ({component: Component, feature, ...rest}) => {
@@ -13,12 +13,7 @@ const ConditionalRoute = ({component: Component, feature, ...rest}) => {
const isEnabled = capabilities.featureEnabled(feature);
return (
-
- isEnabled ? :
- }
- {...rest}
- />
+ <>{isEnabled ? : }>
);
};
diff --git a/src/web/components/conditionalRoute/__tests__/ConditionalRoute.jsx b/src/web/components/conditionalRoute/__tests__/ConditionalRoute.jsx
index a88608e852..f2ae3ba811 100644
--- a/src/web/components/conditionalRoute/__tests__/ConditionalRoute.jsx
+++ b/src/web/components/conditionalRoute/__tests__/ConditionalRoute.jsx
@@ -5,7 +5,7 @@
import {describe, test, expect} from '@gsa/testing';
import {screen, rendererWith} from 'web/utils/testing';
-import {Route, MemoryRouter} from 'react-router-dom';
+import {Route, Routes} from 'react-router-dom';
import ConditionalRoute from 'web/components/conditionalRoute/ConditionalRoute';
import Capabilities from 'gmp/capabilities/capabilities';
@@ -36,10 +36,15 @@ describe('ConditionalRoute', () => {
},
])('$description', ({feature, expectedText}) => {
render(
-
-
- Not Found
} />
- ,
+
+
+ }
+ />
+ Not Found} />
+ ,
);
expect(screen.getByText(expectedText)).toBeVisible();
diff --git a/src/web/components/dialog/__tests__/__snapshots__/multistepfooter.jsx.snap b/src/web/components/dialog/__tests__/__snapshots__/multistepfooter.jsx.snap
index 5bd2debaff..430912e5f7 100644
--- a/src/web/components/dialog/__tests__/__snapshots__/multistepfooter.jsx.snap
+++ b/src/web/components/dialog/__tests__/__snapshots__/multistepfooter.jsx.snap
@@ -40,28 +40,6 @@ exports[`MultiStepFooter tests > should render 1`] = `
align-items: center;
}
-.c8 {
- margin-left: -5px;
-}
-
-.c8>* {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c8>* {
- margin-left: 5px;
-}
-
-.c7 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
.c3 {
display: inline-block;
padding: 0 15px;
@@ -161,6 +139,28 @@ exports[`MultiStepFooter tests > should render 1`] = `
background: #11ab51;
}
+.c8 {
+ margin-left: -5px;
+}
+
+.c8>* {
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+}
+
+.c8>* {
+ margin-left: 5px;
+}
+
+.c7 {
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+}
+
.c2 {
-webkit-box-pack: justify;
-webkit-justify-content: space-between;
@@ -249,28 +249,6 @@ exports[`MultiStepFooter tests > should render loading and disable cancel button
align-items: center;
}
-.c8 {
- margin-left: -5px;
-}
-
-.c8>* {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c8>* {
- margin-left: 5px;
-}
-
-.c7 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
.c3 {
display: inline-block;
padding: 0 15px;
@@ -381,6 +359,28 @@ exports[`MultiStepFooter tests > should render loading and disable cancel button
background: #11ab51;
}
+.c8 {
+ margin-left: -5px;
+}
+
+.c8>* {
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+}
+
+.c8>* {
+ margin-left: 5px;
+}
+
+.c7 {
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+}
+
.c2 {
-webkit-box-pack: justify;
-webkit-justify-content: space-between;
diff --git a/src/web/components/link/__tests__/certlink.jsx b/src/web/components/link/__tests__/certlink.jsx
index 65dc8d5ff2..61b5fd5c13 100644
--- a/src/web/components/link/__tests__/certlink.jsx
+++ b/src/web/components/link/__tests__/certlink.jsx
@@ -8,8 +8,12 @@ import {describe, test, expect} from '@gsa/testing';
import {fireEvent, rendererWith} from 'web/utils/testing';
import CertLink from '../certlink';
+import {beforeEach} from 'vitest';
describe('CertLink tests', () => {
+ beforeEach(() => {
+ window.history.pushState({}, 'Test page', '/');
+ });
test('should render CertLink', () => {
const {render} = rendererWith({capabilities: true, router: true});
const {element} = render( );
@@ -30,48 +34,47 @@ describe('CertLink tests', () => {
});
test('should route to certbund details', () => {
- const {render, history} = rendererWith({capabilities: true, router: true});
+ const {render} = rendererWith({capabilities: true, router: true});
const {element} = render( );
- expect(history.location.pathname).toEqual('/');
+ expect(window.location.pathname).toEqual('/');
fireEvent.click(element);
- expect(history.location.pathname).toEqual('/certbund/foo');
+ expect(window.location.pathname).toEqual('/certbund/foo');
});
test('should route to dfncert details', () => {
- const {render, history} = rendererWith({capabilities: true, router: true});
+ const {render} = rendererWith({capabilities: true, router: true});
const {element} = render( );
- expect(history.location.pathname).toEqual('/');
+ expect(window.location.pathname).toEqual('/');
fireEvent.click(element);
-
- expect(history.location.pathname).toEqual('/dfncert/foo');
+ expect(window.location.pathname).toEqual('/dfncert/foo');
});
test('should not route to unknown type', () => {
- const {render, history} = rendererWith({capabilities: true, router: true});
+ const {render} = rendererWith({capabilities: true, router: true});
const {element} = render( );
- expect(history.location.pathname).toEqual('/');
+ expect(window.location.pathname).toEqual('/');
fireEvent.click(element);
- expect(history.location.pathname).toEqual('/');
+ expect(window.location.pathname).toEqual('/');
});
test('should not route in text mode', () => {
- const {render, history} = rendererWith({capabilities: true, router: true});
+ const {render} = rendererWith({capabilities: true, router: true});
const {element} = render(
,
);
- expect(history.location.pathname).toEqual('/');
+ expect(window.location.pathname).toEqual('/');
fireEvent.click(element);
- expect(history.location.pathname).toEqual('/');
+ expect(window.location.pathname).toEqual('/');
});
});
diff --git a/src/web/components/link/__tests__/cvelink.jsx b/src/web/components/link/__tests__/cvelink.jsx
index 6b74d62342..90323079a9 100644
--- a/src/web/components/link/__tests__/cvelink.jsx
+++ b/src/web/components/link/__tests__/cvelink.jsx
@@ -10,6 +10,9 @@ import {fireEvent, rendererWith} from 'web/utils/testing';
import CveLink from '../cvelink';
describe('CveLink tests', () => {
+ beforeEach(() => {
+ window.history.pushState({}, 'Test page', '/');
+ });
test('should render CveLink', () => {
const {render} = rendererWith({capabilities: true, router: true});
const {element} = render( );
@@ -29,25 +32,25 @@ describe('CveLink tests', () => {
});
test('should route to details', () => {
- const {render, history} = rendererWith({capabilities: true, router: true});
+ const {render} = rendererWith({capabilities: true, router: true});
const {element} = render( );
- expect(history.location.pathname).toEqual('/');
+ expect(window.location.pathname).toEqual('/');
fireEvent.click(element);
- expect(history.location.pathname).toEqual('/cve/foo');
+ expect(window.location.pathname).toEqual('/cve/foo');
});
test('should not route to details in text mode', () => {
- const {render, history} = rendererWith({capabilities: true, router: true});
+ const {render} = rendererWith({capabilities: true, router: true});
const {element} = render( );
- expect(history.location.pathname).toEqual('/');
+ expect(window.location.pathname).toEqual('/');
fireEvent.click(element);
- expect(history.location.pathname).toEqual('/');
+ expect(window.location.pathname).toEqual('/');
});
});
diff --git a/src/web/components/link/__tests__/detailslink.jsx b/src/web/components/link/__tests__/detailslink.jsx
index fd78aced37..2d211019d7 100644
--- a/src/web/components/link/__tests__/detailslink.jsx
+++ b/src/web/components/link/__tests__/detailslink.jsx
@@ -12,6 +12,9 @@ import {fireEvent, rendererWith} from 'web/utils/testing';
import DetailsLink from '../detailslink';
describe('DetailsLink tests', () => {
+ beforeEach(() => {
+ window.history.pushState({}, 'Test page', '/');
+ });
test('should render DetailsLink', () => {
const {render} = rendererWith({capabilities: true, router: true});
const {element} = render(
@@ -25,7 +28,7 @@ describe('DetailsLink tests', () => {
});
test('should route to url', () => {
- const {render, history} = rendererWith({capabilities: true, router: true});
+ const {render} = rendererWith({capabilities: true, router: true});
const {element} = render(
@@ -33,15 +36,15 @@ describe('DetailsLink tests', () => {
,
);
- expect(history.location.pathname).toEqual('/');
+ expect(window.location.pathname).toEqual('/');
fireEvent.click(element);
- expect(history.location.pathname).toEqual('/foo/1');
+ expect(window.location.pathname).toEqual('/foo/1');
});
test('should url encode id', () => {
- const {render, history} = rendererWith({capabilities: true, router: true});
+ const {render} = rendererWith({capabilities: true, router: true});
const {element} = render(
@@ -49,17 +52,17 @@ describe('DetailsLink tests', () => {
,
);
- expect(history.location.pathname).toEqual('/');
+ expect(window.location.pathname).toEqual('/');
fireEvent.click(element);
- expect(history.location.pathname).toEqual(
+ expect(window.location.pathname).toEqual(
'/foo/cpe%3A%2Fa%3Ajenkins%3Ajenkins%3A2.141',
);
});
test('should not route to url in text mode', () => {
- const {render, history} = rendererWith({capabilities: true, router: true});
+ const {render} = rendererWith({capabilities: true, router: true});
const {element} = render(
@@ -67,16 +70,16 @@ describe('DetailsLink tests', () => {
,
);
- expect(history.location.pathname).toEqual('/');
+ expect(window.location.pathname).toEqual('/');
fireEvent.click(element);
- expect(history.location.pathname).toEqual('/');
+ expect(window.location.pathname).toEqual('/');
});
test('should not route to url without capabilities', () => {
const capabilities = new Capabilities();
- const {render, history} = rendererWith({capabilities, router: true});
+ const {render} = rendererWith({capabilities, router: true});
const {element} = render(
@@ -84,11 +87,11 @@ describe('DetailsLink tests', () => {
,
);
- expect(history.location.pathname).toEqual('/');
+ expect(window.location.pathname).toEqual('/');
fireEvent.click(element);
- expect(history.location.pathname).toEqual('/');
+ expect(window.location.pathname).toEqual('/');
});
});
diff --git a/src/web/components/link/__tests__/link.jsx b/src/web/components/link/__tests__/link.jsx
index 2282d3b976..437d8face0 100644
--- a/src/web/components/link/__tests__/link.jsx
+++ b/src/web/components/link/__tests__/link.jsx
@@ -11,6 +11,9 @@ import Link from '../link';
import Filter from 'gmp/models/filter';
describe('Link tests', () => {
+ beforeEach(() => {
+ window.history.pushState({}, 'Test page', '/');
+ });
test('render Link', () => {
const {render} = rendererWith({router: true});
@@ -20,32 +23,32 @@ describe('Link tests', () => {
});
test('should route to url on click', () => {
- const {render, history} = rendererWith({router: true});
+ const {render} = rendererWith({router: true});
const {element} = render( Foo);
- expect(history.location.pathname).toEqual('/');
+ expect(window.location.pathname).toEqual('/');
fireEvent.click(element);
- expect(history.location.pathname).toEqual('/foo');
+ expect(window.location.pathname).toEqual('/foo');
});
test('should route to absolute url on click', () => {
- const {render, history} = rendererWith({router: true});
+ const {render} = rendererWith({router: true});
const {element} = render( Foo);
- expect(history.location.pathname).toEqual('/');
+ expect(window.location.pathname).toEqual('/');
fireEvent.click(element);
- expect(history.location.pathname).toEqual('/foo');
+ expect(window.location.pathname).toEqual('/foo');
});
test('should route to url with filter on click', () => {
const filter = Filter.fromString('foo=bar');
- const {render, history} = rendererWith({router: true});
+ const {render} = rendererWith({router: true});
const {element} = render(
@@ -53,16 +56,18 @@ describe('Link tests', () => {
,
);
- expect(history.location.pathname).toEqual('/');
+ expect(window.location.pathname).toEqual('/');
fireEvent.click(element);
- expect(history.location.pathname).toEqual('/foo');
- expect(history.location.query).toEqual({filter: 'foo=bar'});
+ expect(window.location.pathname).toEqual('/foo');
+
+ const searchParams = new URLSearchParams(window.location.search);
+ expect(searchParams.get('filter')).toEqual('foo=bar');
});
test('should route to url with query on click', () => {
- const {render, history} = rendererWith({router: true});
+ const {render} = rendererWith({router: true});
const query = {foo: 'bar'};
const {element} = render(
@@ -71,16 +76,18 @@ describe('Link tests', () => {
,
);
- expect(history.location.pathname).toEqual('/');
+ expect(window.location.pathname).toEqual('/');
fireEvent.click(element);
- expect(history.location.pathname).toEqual('/foo');
- expect(history.location.query).toEqual(query);
+ expect(window.location.pathname).toEqual('/foo');
+
+ const searchParams = new URLSearchParams(window.location.search);
+ expect(searchParams.get('foo')).toEqual('bar');
});
test('should route to url with anchor on click', () => {
- const {render, history} = rendererWith({router: true});
+ const {render} = rendererWith({router: true});
const {element} = render(
@@ -88,16 +95,16 @@ describe('Link tests', () => {
,
);
- expect(history.location.pathname).toEqual('/');
+ expect(window.location.pathname).toEqual('/');
fireEvent.click(element);
- expect(history.location.pathname).toEqual('/foo');
- expect(history.location.hash).toEqual('#bar');
+ expect(window.location.pathname).toEqual('/foo');
+ expect(window.location.hash).toEqual('#bar');
});
test('should not route to url in text mode', () => {
- const {render, history} = rendererWith({router: true});
+ const {render} = rendererWith({router: true});
const {element} = render(
@@ -107,7 +114,7 @@ describe('Link tests', () => {
fireEvent.click(element);
- expect(history.location.pathname).toEqual('/');
+ expect(window.location.pathname).toEqual('/');
});
test('should render styles', () => {
diff --git a/src/web/components/link/link.jsx b/src/web/components/link/link.jsx
index 9c8c7964fd..c628d96bf8 100644
--- a/src/web/components/link/link.jsx
+++ b/src/web/components/link/link.jsx
@@ -3,15 +3,10 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
-
import styled from 'styled-components';
-
import {Link as RLink} from 'react-router-dom';
-
import {isDefined, isString} from 'gmp/utils/identity';
-
import PropTypes from 'web/utils/proptypes';
RLink.displayName = 'RouterLink';
@@ -45,7 +40,7 @@ export const withTextOnly = Component => {
return TextOnly;
};
-let Link = ({anchor, to = '', filter, query, ...other}) => {
+const LinkComponent = ({anchor, to = '', filter, query, ...other}) => {
let pathname = '';
if (to.startsWith('/')) {
@@ -54,29 +49,32 @@ let Link = ({anchor, to = '', filter, query, ...other}) => {
pathname += '/' + to;
}
- const location = {
+ const searchParams = new URLSearchParams(isDefined(query) ? query : {});
+ if (isDefined(filter)) {
+ searchParams.set(
+ 'filter',
+ isString(filter) ? filter : filter.toFilterString(),
+ );
+ }
+
+ const fullPath = {
pathname,
- query: isDefined(query) ? {...query} : {},
- hash: isDefined(anchor) ? '#' + anchor : undefined,
+ search: searchParams.toString().replace(/\+/g, '%20'),
+ hash: isDefined(anchor) ? '#' + anchor : '',
};
- if (isDefined(filter)) {
- location.query.filter = isString(filter) ? filter : filter.toFilterString();
- }
- return ;
+ return ;
};
-Link.propTypes = {
+LinkComponent.propTypes = {
anchor: PropTypes.string,
filter: PropTypes.oneOfType([PropTypes.filter, PropTypes.string]),
query: PropTypes.object,
to: PropTypes.string.isRequired,
};
-Link = styled(withTextOnly(Link))`
+const Link = styled(withTextOnly(LinkComponent))`
display: inline-flex;
`;
export default Link;
-
-// vim: set ts=2 sw=2 tw=80:
diff --git a/src/web/components/menu/__tests__/__snapshots__/usermenu.jsx.snap b/src/web/components/menu/__tests__/__snapshots__/usermenu.jsx.snap
index ff58c4ba57..75be74124b 100644
--- a/src/web/components/menu/__tests__/__snapshots__/usermenu.jsx.snap
+++ b/src/web/components/menu/__tests__/__snapshots__/usermenu.jsx.snap
@@ -1,6 +1,40 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
exports[`UserMenu component tests > should render UserMenu 1`] = `
+.c2 {
+ width: 24px;
+ height: 24px;
+ line-height: 24px;
+}
+
+.c2 * {
+ height: inherit;
+ width: inherit;
+}
+
+.c10 {
+ width: 16px;
+ height: 16px;
+ line-height: 16px;
+}
+
+.c10 * {
+ height: inherit;
+ width: inherit;
+}
+
+.c11 {
+ cursor: pointer;
+ width: 16px;
+ height: 16px;
+ line-height: 16px;
+}
+
+.c11 * {
+ height: inherit;
+ width: inherit;
+}
+
.c7 {
display: -webkit-box;
display: -webkit-flex;
@@ -19,13 +53,6 @@ exports[`UserMenu component tests > should render UserMenu 1`] = `
align-items: center;
}
-.c12 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
.c9 {
margin-left: -5px;
}
@@ -48,38 +75,11 @@ exports[`UserMenu component tests > should render UserMenu 1`] = `
display: inline-flex;
}
-.c2 {
- width: 24px;
- height: 24px;
- line-height: 24px;
-}
-
-.c2 * {
- height: inherit;
- width: inherit;
-}
-
-.c10 {
- width: 16px;
- height: 16px;
- line-height: 16px;
-}
-
-.c10 * {
- height: inherit;
- width: inherit;
-}
-
-.c11 {
- cursor: pointer;
- width: 16px;
- height: 16px;
- line-height: 16px;
-}
-
-.c11 * {
- height: inherit;
- width: inherit;
+.c12 {
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
}
.c1 {
diff --git a/src/web/components/menu/__tests__/usermenu.jsx b/src/web/components/menu/__tests__/usermenu.jsx
index bf444b67c2..9f4dfa0497 100644
--- a/src/web/components/menu/__tests__/usermenu.jsx
+++ b/src/web/components/menu/__tests__/usermenu.jsx
@@ -37,7 +37,7 @@ describe('UserMenu component tests', () => {
});
test('should route to usersettings on click', () => {
- const {render, history} = rendererWith({
+ const {render} = rendererWith({
gmp: {},
store: true,
router: true,
@@ -48,7 +48,7 @@ describe('UserMenu component tests', () => {
fireEvent.click(userSettingsElement);
- expect(history.location.pathname).toMatch('usersettings');
+ expect(window.location.pathname).toMatch('usersettings');
});
test('should logout user on click', async () => {
diff --git a/src/web/components/menu/usermenu.jsx b/src/web/components/menu/usermenu.jsx
index 9aef15e649..d4b6623c52 100644
--- a/src/web/components/menu/usermenu.jsx
+++ b/src/web/components/menu/usermenu.jsx
@@ -5,7 +5,7 @@
import React from 'react';
-import {useHistory} from 'react-router-dom';
+import {useNavigate} from 'react-router-dom';
import styled, {keyframes} from 'styled-components';
@@ -121,13 +121,13 @@ const UserMenuContainer = () => {
const [userTimezone] = useUserTimezone();
const [userName] = useUserName();
const gmp = useGmp();
- const history = useHistory();
+ const navigate = useNavigate();
const handleLogout = event => {
event.preventDefault();
gmp.doLogout().then(() => {
- history.push('/login?type=logout');
+ navigate('/login?type=logout');
});
};
diff --git a/src/web/components/observer/locationobserver.jsx b/src/web/components/observer/locationobserver.jsx
index c43c990d96..53d5baa4c9 100644
--- a/src/web/components/observer/locationobserver.jsx
+++ b/src/web/components/observer/locationobserver.jsx
@@ -7,7 +7,7 @@ import React from 'react';
import {connect} from 'react-redux';
-import {withRouter} from 'react-router-dom';
+import {withRouter} from 'web/utils/withRouter';
import Logger from 'gmp/log';
@@ -71,12 +71,9 @@ LocationObserver.propTypes = {
export default compose(
withGmp,
withRouter,
- connect(
- undefined,
- (dispatch, {gmp}) => ({
- renewSessionTimeout: () => dispatch(renewSessionTimeout(gmp)()),
- }),
- ),
+ connect(undefined, (dispatch, {gmp}) => ({
+ renewSessionTimeout: () => dispatch(renewSessionTimeout(gmp)()),
+ })),
)(LocationObserver);
// vim: set ts=2 sw=2 tw=80:
diff --git a/src/web/components/powerfilter/__tests__/__snapshots__/booleanfiltergroup.jsx.snap b/src/web/components/powerfilter/__tests__/__snapshots__/booleanfiltergroup.jsx.snap
index 7bc3e91f64..d0443b1317 100644
--- a/src/web/components/powerfilter/__tests__/__snapshots__/booleanfiltergroup.jsx.snap
+++ b/src/web/components/powerfilter/__tests__/__snapshots__/booleanfiltergroup.jsx.snap
@@ -19,28 +19,6 @@ exports[`BooleanFilterGroup tests > should render 1`] = `
align-items: center;
}
-.c5 {
- margin-left: -5px;
-}
-
-.c5>* {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c5>* {
- margin-left: 5px;
-}
-
-.c4 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
.c0 {
display: -webkit-box;
display: -webkit-flex;
@@ -74,6 +52,28 @@ exports[`BooleanFilterGroup tests > should render 1`] = `
padding-right: 10px;
}
+.c5 {
+ margin-left: -5px;
+}
+
+.c5>* {
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+}
+
+.c5>* {
+ margin-left: 5px;
+}
+
+.c4 {
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+}
+
.c6 {
display: -webkit-inline-box;
display: -webkit-inline-flex;
diff --git a/src/web/components/powerfilter/__tests__/__snapshots__/createnamedfiltergroup.jsx.snap b/src/web/components/powerfilter/__tests__/__snapshots__/createnamedfiltergroup.jsx.snap
index 05cde3acdd..d2579e75cd 100644
--- a/src/web/components/powerfilter/__tests__/__snapshots__/createnamedfiltergroup.jsx.snap
+++ b/src/web/components/powerfilter/__tests__/__snapshots__/createnamedfiltergroup.jsx.snap
@@ -41,54 +41,6 @@ exports[`CreateNamedFilterGroup tests > should render 1`] = `
display: inline-flex;
}
-.c10 {
- color: #c12c30;
- font-weight: bold;
- font-size: 19px;
- padding-bottom: 1px;
- padding-left: 4px;
- display: none;
-}
-
-.c8 {
- font-family: inherit;
- font-size: inherit;
- line-height: inherit;
- display: block;
- height: 22px;
- color: #4C4C4C;
- background-color: #fff;
- background-image: none;
- border: 1px solid #bfbfbf;
- border-radius: 2px;
- padding: 1px 8px;
- cursor: not-allowed;
- background-color: #f3f3f3;
- opacity: 0.65;
-}
-
-.c8:-webkit-autofill {
- box-shadow: 0 0 0 1000px white inset;
-}
-
-.c9 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
.c4 {
display: -webkit-inline-box;
display: -webkit-inline-flex;
@@ -138,6 +90,54 @@ exports[`CreateNamedFilterGroup tests > should render 1`] = `
align-items: center;
}
+.c8 {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ display: block;
+ height: 22px;
+ color: #4C4C4C;
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #bfbfbf;
+ border-radius: 2px;
+ padding: 1px 8px;
+ cursor: not-allowed;
+ background-color: #f3f3f3;
+ opacity: 0.65;
+}
+
+.c8:-webkit-autofill {
+ box-shadow: 0 0 0 1000px white inset;
+}
+
+.c9 {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-box-pack: start;
+ -ms-flex-pack: start;
+ -webkit-justify-content: start;
+ justify-content: start;
+ -webkit-align-items: center;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+}
+
+.c10 {
+ color: #c12c30;
+ font-weight: bold;
+ font-size: 19px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ display: none;
+}
+
.c1 {
margin-top: 15px;
}
diff --git a/src/web/components/powerfilter/__tests__/__snapshots__/filtersearchgroup.jsx.snap b/src/web/components/powerfilter/__tests__/__snapshots__/filtersearchgroup.jsx.snap
index 2432bfab64..03e1f8f9a6 100644
--- a/src/web/components/powerfilter/__tests__/__snapshots__/filtersearchgroup.jsx.snap
+++ b/src/web/components/powerfilter/__tests__/__snapshots__/filtersearchgroup.jsx.snap
@@ -35,15 +35,6 @@ exports[`FilterSearchGroup tests > should render 1`] = `
padding-bottom: 10px;
}
-.c4 {
- color: #c12c30;
- font-weight: bold;
- font-size: 19px;
- padding-bottom: 1px;
- padding-left: 4px;
- display: none;
-}
-
.c2 {
font-family: inherit;
font-size: inherit;
@@ -80,6 +71,15 @@ exports[`FilterSearchGroup tests > should render 1`] = `
align-items: center;
}
+.c4 {
+ color: #c12c30;
+ font-weight: bold;
+ font-size: 19px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ display: none;
+}
+
diff --git a/src/web/components/powerfilter/__tests__/__snapshots__/filterstringgroup.jsx.snap b/src/web/components/powerfilter/__tests__/__snapshots__/filterstringgroup.jsx.snap
index d0fec2f880..f762240cdd 100644
--- a/src/web/components/powerfilter/__tests__/__snapshots__/filterstringgroup.jsx.snap
+++ b/src/web/components/powerfilter/__tests__/__snapshots__/filterstringgroup.jsx.snap
@@ -52,15 +52,6 @@ exports[`FilterStringGroup tests > should render 1`] = `
padding-right: 10px;
}
-.c6 {
- color: #c12c30;
- font-weight: bold;
- font-size: 19px;
- padding-bottom: 1px;
- padding-left: 4px;
- display: none;
-}
-
.c4 {
font-family: inherit;
font-size: inherit;
@@ -101,6 +92,15 @@ exports[`FilterStringGroup tests > should render 1`] = `
align-items: center;
}
+.c6 {
+ color: #c12c30;
+ font-weight: bold;
+ font-size: 19px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ display: none;
+}
+
diff --git a/src/web/components/powerfilter/__tests__/__snapshots__/minqodgroup.jsx.snap b/src/web/components/powerfilter/__tests__/__snapshots__/minqodgroup.jsx.snap
index 4639acb333..f76e5c38f7 100644
--- a/src/web/components/powerfilter/__tests__/__snapshots__/minqodgroup.jsx.snap
+++ b/src/web/components/powerfilter/__tests__/__snapshots__/minqodgroup.jsx.snap
@@ -19,28 +19,6 @@ exports[`MinQodGroup tests > should render 1`] = `
align-items: center;
}
-.c5 {
- margin-left: -5px;
-}
-
-.c5>* {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c5>* {
- margin-left: 5px;
-}
-
-.c4 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
.c0 {
display: -webkit-box;
display: -webkit-flex;
@@ -148,6 +126,28 @@ exports[`MinQodGroup tests > should render 1`] = `
bottom: 0;
}
+.c5 {
+ margin-left: -5px;
+}
+
+.c5>* {
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+}
+
+.c5>* {
+ margin-left: 5px;
+}
+
+.c4 {
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+}
+
diff --git a/src/web/components/table/__tests__/__snapshots__/detailstable.jsx.snap b/src/web/components/table/__tests__/__snapshots__/detailstable.jsx.snap
index 47a12aef28..ee9f45906c 100644
--- a/src/web/components/table/__tests__/__snapshots__/detailstable.jsx.snap
+++ b/src/web/components/table/__tests__/__snapshots__/detailstable.jsx.snap
@@ -19,6 +19,14 @@ exports[`DetailsTable tests > should render 1`] = `
align-items: stretch;
}
+.c2 {
+ width: 10%;
+}
+
+.c3 {
+ width: 90%;
+}
+
.c0 {
border: 0;
border-spacing: 0px;
@@ -36,14 +44,6 @@ exports[`DetailsTable tests > should render 1`] = `
padding-right: 5px;
}
-.c2 {
- width: 10%;
-}
-
-.c3 {
- width: 90%;
-}
-
@media print {
.c0 {
border-collapse: collapse;
diff --git a/src/web/entities/container.jsx b/src/web/entities/container.jsx
index a29c90f3a2..b05c809a84 100644
--- a/src/web/entities/container.jsx
+++ b/src/web/entities/container.jsx
@@ -3,10 +3,9 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
-import {withRouter} from 'react-router-dom';
+import {withRouter} from 'web/utils/withRouter';
import {connect} from 'react-redux';
@@ -322,13 +321,13 @@ class EntitiesContainer extends React.Component {
}
handleFilterReset() {
- const {history, location} = this.props;
+ const {navigate, location} = this.props;
const query = {...location.query};
// remove filter param from url
delete query.filter;
- history.push({pathname: location.pathname, query});
+ navigate({pathname: location.pathname, query});
this.changeFilter();
}
@@ -585,7 +584,7 @@ EntitiesContainer.propTypes = {
filter: PropTypes.filter,
gmp: PropTypes.gmp.isRequired,
gmpname: PropTypes.string.isRequired,
- history: PropTypes.object.isRequired,
+ navigate: PropTypes.object.isRequired,
isLoading: PropTypes.bool.isRequired,
listExportFileName: PropTypes.string,
loadSettings: PropTypes.func.isRequired,
@@ -604,9 +603,8 @@ EntitiesContainer.propTypes = {
const mapStateToProps = rootState => {
const userDefaultsSelector = getUserSettingsDefaults(rootState);
const username = getUsername(rootState);
- const listExportFileName = userDefaultsSelector.getValueByName(
- 'listexportfilename',
- );
+ const listExportFileName =
+ userDefaultsSelector.getValueByName('listexportfilename');
return {
listExportFileName,
username,
diff --git a/src/web/entity/component.jsx b/src/web/entity/component.jsx
index 662e4ac833..0f22134ec3 100644
--- a/src/web/entity/component.jsx
+++ b/src/web/entity/component.jsx
@@ -23,14 +23,16 @@ import {generateFilename} from 'web/utils/render';
import withGmp from 'web/utils/withGmp';
-export const goto_details = (type, props) => ({data}) => {
- const {history} = props;
- return history.push('/' + type + '/' + data.id);
-};
+export const goto_details =
+ (type, props) =>
+ ({data}) => {
+ const {navigate} = props;
+ return navigate('/' + type + '/' + data.id);
+ };
export const goto_list = (type, props) => () => {
- const {history} = props;
- return history.push('/' + type);
+ const {navigate} = props;
+ return navigate('/' + type);
};
class EntityComponent extends React.Component {
@@ -173,10 +175,7 @@ const mapDispatchToProps = (dispatch, {name, gmp}) => {
export default compose(
withGmp,
- connect(
- mapStateToProps,
- mapDispatchToProps,
- ),
+ connect(mapStateToProps, mapDispatchToProps),
)(EntityComponent);
// vim: set ts=2 sw=2 tw=80:
diff --git a/src/web/entity/withEntityContainer.jsx b/src/web/entity/withEntityContainer.jsx
index e0b1ebbf1e..c0a48bd7dd 100644
--- a/src/web/entity/withEntityContainer.jsx
+++ b/src/web/entity/withEntityContainer.jsx
@@ -7,7 +7,7 @@ import React from 'react';
import {connect} from 'react-redux';
-import {withRouter} from 'react-router-dom';
+import {withRouter} from 'web/utils/withRouter';
import Filter from 'gmp/models/filter';
@@ -45,71 +45,70 @@ export const permissionsSubjectFilter = id =>
id,
).all();
-const withEntityContainer = (
- entityType,
- {
- load,
- entitySelector,
- mapStateToProps: componentMapStateToProps,
- reloadInterval = defaultEntityReloadIntervalFunc,
- },
-) => Component => {
- const EntityContainerWrapper = props => (
-
reloadInterval(props)}
- reload={(id = props.id) => props.load(id)}
- name={entityType}
- >
- {({reload}) => (
-
- {cprops => }
-
- )}
-
- );
-
- EntityContainerWrapper.propTypes = {
- id: PropTypes.id.isRequired,
- load: PropTypes.func.isRequired,
- };
+const withEntityContainer =
+ (
+ entityType,
+ {
+ load,
+ entitySelector,
+ mapStateToProps: componentMapStateToProps,
+ reloadInterval = defaultEntityReloadIntervalFunc,
+ },
+ ) =>
+ Component => {
+ const EntityContainerWrapper = props => (
+
reloadInterval(props)}
+ reload={(id = props.id) => props.load(id)}
+ name={entityType}
+ >
+ {({reload}) => (
+
+ {cprops => }
+
+ )}
+
+ );
+
+ EntityContainerWrapper.propTypes = {
+ id: PropTypes.id.isRequired,
+ load: PropTypes.func.isRequired,
+ };
- const mapDispatchToProps = (dispatch, {gmp}) => ({
- onInteraction: () => dispatch(renewSessionTimeout(gmp)()),
- load: id => dispatch(load(gmp)(id)),
- });
-
- const mapStateToProps = (rootState, {gmp, id, match, ...props}) => {
- if (!isDefined(id)) {
- id = decodeURIComponent(match.params.id); // decodeURIComponent needs to be done for CPE IDs
- }
- const entitySel = entitySelector(rootState);
- const otherProps = isDefined(componentMapStateToProps)
- ? componentMapStateToProps(rootState, {
- gmp,
- id,
- ...props,
- })
- : undefined;
- return {
- isLoading: entitySel.isLoadingEntity(id),
- ...otherProps,
- id,
- entity: entitySel.getEntity(id),
- entityError: entitySel.getEntityError(id),
+ const mapDispatchToProps = (dispatch, {gmp}) => ({
+ onInteraction: () => dispatch(renewSessionTimeout(gmp)()),
+ load: id => dispatch(load(gmp)(id)),
+ });
+
+ const mapStateToProps = (rootState, {gmp, id, params, ...props}) => {
+ if (!isDefined(id)) {
+ id = decodeURIComponent(params.id); // decodeURIComponent needs to be done for CPE IDs
+ }
+ const entitySel = entitySelector(rootState);
+ const otherProps = isDefined(componentMapStateToProps)
+ ? componentMapStateToProps(rootState, {
+ gmp,
+ id,
+ ...props,
+ })
+ : undefined;
+ return {
+ isLoading: entitySel.isLoadingEntity(id),
+ ...otherProps,
+ id,
+ entity: entitySel.getEntity(id),
+ entityError: entitySel.getEntityError(id),
+ };
};
- };
- return compose(
- withGmp,
- withRouter,
- withDialogNotification,
- withDownload,
- connect(
- mapStateToProps,
- mapDispatchToProps,
- ),
- )(EntityContainerWrapper);
-};
+ return compose(
+ withGmp,
+ withRouter,
+ withDialogNotification,
+ withDownload,
+ connect(mapStateToProps, mapDispatchToProps),
+ )(EntityContainerWrapper);
+ };
export default withEntityContainer;
diff --git a/src/web/hooks/__tests__/usePageFilter.jsx b/src/web/hooks/__tests__/usePageFilter.jsx
index 7d4d008b57..e6d868a545 100644
--- a/src/web/hooks/__tests__/usePageFilter.jsx
+++ b/src/web/hooks/__tests__/usePageFilter.jsx
@@ -18,14 +18,14 @@ import usePageFilter from '../usePageFilter';
import {pageFilter} from 'web/store/pages/actions';
import {vi} from 'vitest';
-const mockUseHistory = testing.fn();
+const mockUseNavigate = testing.fn();
vi.mock('react-router-dom', async () => {
const actual = await vi.importActual('react-router-dom');
return {
...actual,
useLocation: () => ({pathname: '/'}),
- useHistory: () => mockUseHistory(),
+ useNavigate: () => mockUseNavigate(),
};
});
@@ -42,14 +42,12 @@ describe('usePageFilter tests', () => {
},
};
- const {renderHook, store, history} = rendererWith({
+ const {renderHook, store} = rendererWith({
gmp,
store: true,
router: true,
});
- history.push({query: locationQuery});
-
store.dispatch(loadingActions.success({rowsperpage: {value: '42'}}));
store.dispatch(
defaultFilterLoadingActions.success('somePage', defaultSettingFilter),
diff --git a/src/web/hooks/usePageFilter.js b/src/web/hooks/usePageFilter.js
index e7b9f472b1..16f2f225cc 100644
--- a/src/web/hooks/usePageFilter.js
+++ b/src/web/hooks/usePageFilter.js
@@ -5,7 +5,7 @@
import {useCallback, useEffect, useState} from 'react';
-import {useLocation, useHistory} from 'react-router-dom';
+import {useLocation, useNavigate} from 'react-router-dom';
import {useDispatch} from 'react-redux';
@@ -63,7 +63,7 @@ const usePageFilter = (
const gmp = useGmp();
const dispatch = useDispatch();
const location = useLocation();
- const history = useHistory();
+ const navigate = useNavigate();
const [defaultSettingFilter, defaultSettingsFilterError] =
useDefaultFilter(gmpName);
@@ -168,10 +168,10 @@ const usePageFilter = (
// remove filter param from url
delete query.filter;
- history.push({pathname: location.pathname, query});
+ navigate({pathname: location.pathname, query});
changeFilter();
- }, [changeFilter, history, location]);
+ }, [changeFilter, navigate, location]);
return [
returnedFilter,
diff --git a/src/web/pages/audits/__tests__/__snapshots__/details.jsx.snap b/src/web/pages/audits/__tests__/__snapshots__/details.jsx.snap
index 7c56606273..8c732ad812 100644
--- a/src/web/pages/audits/__tests__/__snapshots__/details.jsx.snap
+++ b/src/web/pages/audits/__tests__/__snapshots__/details.jsx.snap
@@ -59,35 +59,48 @@ exports[`Audit Details tests > should render full audit details 1`] = `
align-items: center;
}
-.c2 {
+.c5 {
+ margin-left: -5px;
+}
+
+.c5>* {
display: -webkit-inline-box;
display: -webkit-inline-flex;
display: -ms-inline-flexbox;
display: inline-flex;
}
-.c5 {
- margin-left: -5px;
+.c5>* {
+ margin-left: 5px;
}
-.c5>* {
+.c4 {
display: -webkit-inline-box;
display: -webkit-inline-flex;
display: -ms-inline-flexbox;
display: inline-flex;
}
-.c5>* {
+.c6>*:not(:last-child)::after {
+ content: '•';
margin-left: 5px;
}
-.c4 {
+.c2 {
display: -webkit-inline-box;
display: -webkit-inline-flex;
display: -ms-inline-flexbox;
display: inline-flex;
}
+.c9 {
+ width: 10%;
+}
+
+.c10 {
+ width: 90%;
+}
+
.c7 {
border: 0;
border-spacing: 0px;
@@ -97,11 +110,6 @@ exports[`Audit Details tests > should render full audit details 1`] = `
width: 100%;
}
-.c6>*:not(:last-child)::after {
- content: '•';
- margin-left: 5px;
-}
-
.c8 td {
padding: 4px 4px 4px 0;
}
@@ -110,14 +118,6 @@ exports[`Audit Details tests > should render full audit details 1`] = `
padding-right: 5px;
}
-.c9 {
- width: 10%;
-}
-
-.c10 {
- width: 90%;
-}
-
@media print {
.c7 {
border-collapse: collapse;
diff --git a/src/web/pages/audits/component.jsx b/src/web/pages/audits/component.jsx
index a3deda1916..810a831ec6 100644
--- a/src/web/pages/audits/component.jsx
+++ b/src/web/pages/audits/component.jsx
@@ -19,7 +19,7 @@ import {isDefined} from 'gmp/utils/identity';
import {hasId} from 'gmp/utils/id';
import withDownload from 'web/components/form/withDownload';
-import {withRouter} from 'react-router-dom';
+import {withRouter} from 'web/utils/withRouter';
import {
OPENVAS_DEFAULT_SCANNER_ID,
@@ -588,7 +588,7 @@ AuditComponent.propTypes = {
onStopped: PropTypes.func,
};
-const mapStateToProps = (rootState, {match}) => {
+const mapStateToProps = rootState => {
const alertSel = alertSelector(rootState);
const userDefaults = getUserSettingsDefaults(rootState);
const policiesSel = policiesSelector(rootState);
diff --git a/src/web/pages/hosts/dashboard/topologydisplay.jsx b/src/web/pages/hosts/dashboard/topologydisplay.jsx
index f2c0e3dad1..f1835673da 100644
--- a/src/web/pages/hosts/dashboard/topologydisplay.jsx
+++ b/src/web/pages/hosts/dashboard/topologydisplay.jsx
@@ -3,10 +3,9 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
-import {withRouter} from 'react-router-dom';
+import {withRouter} from 'web/utils/withRouter';
import {_, _l} from 'gmp/locale/lang';
@@ -115,9 +114,9 @@ export class HostsTopologyDisplay extends React.Component {
}
handleDataClick(data) {
- const {history} = this.props;
+ const {navigate} = this.props;
- history.push(`/host/${data.id}`);
+ navigate(`/host/${data.id}`);
}
render() {
@@ -151,7 +150,7 @@ export class HostsTopologyDisplay extends React.Component {
HostsTopologyDisplay.propTypes = {
filter: PropTypes.filter,
- history: PropTypes.object.isRequired,
+ navigate: PropTypes.object.isRequired,
};
const DISPLAY_ID = 'host-by-topology';
diff --git a/src/web/pages/hosts/dashboard/vulnscoredisplay.jsx b/src/web/pages/hosts/dashboard/vulnscoredisplay.jsx
index 370944562c..ebe54913b9 100644
--- a/src/web/pages/hosts/dashboard/vulnscoredisplay.jsx
+++ b/src/web/pages/hosts/dashboard/vulnscoredisplay.jsx
@@ -5,7 +5,7 @@
import React from 'react';
-import {withRouter} from 'react-router-dom';
+import {withRouter} from 'web/utils/withRouter';
import styled from 'styled-components';
@@ -86,9 +86,9 @@ export class HostsVulnScoreDisplay extends React.Component {
}
handleDataClick(data) {
- const {history} = this.props;
+ const {navigate} = this.props;
- history.push(`/host/${data.id}`);
+ navigate(`/host/${data.id}`);
}
render() {
@@ -125,7 +125,7 @@ export class HostsVulnScoreDisplay extends React.Component {
HostsVulnScoreDisplay.propTypes = {
filter: PropTypes.filter,
- history: PropTypes.object.isRequired,
+ navigate: PropTypes.func.isRequired,
};
HostsVulnScoreDisplay = compose(
diff --git a/src/web/pages/login/__tests__/loginpage.jsx b/src/web/pages/login/__tests__/loginpage.jsx
index 757563f632..6871cdfbe0 100644
--- a/src/web/pages/login/__tests__/loginpage.jsx
+++ b/src/web/pages/login/__tests__/loginpage.jsx
@@ -155,10 +155,10 @@ describe('LoginPage tests', () => {
clearToken,
settings: {},
};
- const {render, history} = rendererWith({gmp, router: true, store: true});
+ const {render} = rendererWith({gmp, router: true, store: true});
render(
);
- expect(history.location.pathname).toMatch(/^\/$/);
+ expect(window.location.pathname).toMatch(/^\/dashboard$/);
});
});
diff --git a/src/web/pages/login/loginpage.jsx b/src/web/pages/login/loginpage.jsx
index 1745152e28..67a6bb77ec 100644
--- a/src/web/pages/login/loginpage.jsx
+++ b/src/web/pages/login/loginpage.jsx
@@ -3,12 +3,11 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
import {connect} from 'react-redux';
-import {withRouter} from 'react-router-dom';
+import {withRouter} from 'web/utils/withRouter';
import styled from 'styled-components';
@@ -102,7 +101,7 @@ class LoginPage extends React.Component {
data => {
const {locale, timezone, sessionTimeout} = data;
- const {location, history} = this.props;
+ const {location, navigate} = this.props;
this.props.setTimezone(timezone);
this.props.setLocale(locale);
@@ -117,9 +116,9 @@ class LoginPage extends React.Component {
location.state.next &&
location.state.next !== location.pathname
) {
- history.replace(location.state.next);
+ navigate(location.state.next, {replace: true});
} else {
- history.replace('/');
+ navigate('/dashboard', {replace: true});
}
},
rej => {
@@ -130,11 +129,11 @@ class LoginPage extends React.Component {
}
componentDidMount() {
- const {history, isLoggedIn = false} = this.props; // eslint-disable-line no-shadow
+ const {navigate, isLoggedIn = false} = this.props; // eslint-disable-line no-shadow
// redirect user to main page if he is already logged in
if (isLoggedIn) {
- history.replace('/');
+ navigate('/dashboard', {replace: true});
}
}
@@ -182,7 +181,7 @@ class LoginPage extends React.Component {
LoginPage.propTypes = {
gmp: PropTypes.gmp.isRequired,
- history: PropTypes.object.isRequired,
+ navigate: PropTypes.func.isRequired,
isLoggedIn: PropTypes.bool,
location: PropTypes.object.isRequired,
setIsLoggedIn: PropTypes.func.isRequired,
diff --git a/src/web/pages/omp.jsx b/src/web/pages/omp.jsx
index 485264a5bf..7dfe296a74 100644
--- a/src/web/pages/omp.jsx
+++ b/src/web/pages/omp.jsx
@@ -3,10 +3,9 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
-import {withRouter} from 'react-router-dom';
+import {withRouter} from 'web/utils/withRouter';
import PropTypes from 'web/utils/proptypes';
@@ -19,11 +18,11 @@ import PropTypes from 'web/utils/proptypes';
*/
class LegacyOmpPage extends React.Component {
componentDidMount() {
- const {location, history} = this.props;
+ const {location, navigate} = this.props;
const {cmd, info_type, info_id = ''} = location.query;
if (cmd !== 'get_info') {
- history.replace('/notfound');
+ navigate('/notfound', {replace: true});
return;
}
@@ -31,22 +30,22 @@ class LegacyOmpPage extends React.Component {
switch (info_type) {
case 'nvt':
- history.replace('/nvt/' + id);
+ navigate('/nvt/' + id, {replace: true});
break;
case 'cve':
- history.replace('/cve/' + id);
+ navigate('/cve/' + id, {replace: true});
break;
case 'cpe':
- history.replace('/cpe/' + id);
+ navigate('/cpe/' + id, {replace: true});
break;
case 'cert_bund_adv':
- history.replace('/certbund/' + id);
+ navigate('/certbund/' + id, {replace: true});
break;
case 'dfn_cert_adv':
- history.replace('/dfncert/' + id);
+ navigate('/dfncert/' + id, {replace: true});
break;
default:
- history.replace('/notfound');
+ navigate('/notfound', {replace: true});
break;
}
}
@@ -57,7 +56,7 @@ class LegacyOmpPage extends React.Component {
}
LegacyOmpPage.propTypes = {
- history: PropTypes.object.isRequired,
+ navigate: PropTypes.object.isRequired,
};
export default withRouter(LegacyOmpPage);
diff --git a/src/web/pages/operatingsystems/dashboard/vulnscoredisplay.jsx b/src/web/pages/operatingsystems/dashboard/vulnscoredisplay.jsx
index 729a3e8a54..96c4409643 100644
--- a/src/web/pages/operatingsystems/dashboard/vulnscoredisplay.jsx
+++ b/src/web/pages/operatingsystems/dashboard/vulnscoredisplay.jsx
@@ -5,7 +5,7 @@
import React from 'react';
-import {withRouter} from 'react-router-dom';
+import {withRouter} from 'web/utils/withRouter';
import styled from 'styled-components';
@@ -88,9 +88,9 @@ export class OsVulnScoreDisplay extends React.Component {
}
handleDataClick(data) {
- const {history} = this.props;
+ const {navigate} = this.props;
- history.push(`/operatingsystem/${data.id}`);
+ navigate(`/operatingsystem/${data.id}`);
}
render() {
@@ -127,7 +127,7 @@ export class OsVulnScoreDisplay extends React.Component {
OsVulnScoreDisplay.propTypes = {
filter: PropTypes.filter,
- history: PropTypes.object.isRequired,
+ navigate: PropTypes.func.isRequired,
};
OsVulnScoreDisplay.displayId = 'os-by-most-vulnerable';
diff --git a/src/web/pages/page.jsx b/src/web/pages/page.jsx
index db27412f0e..d9a15ba645 100644
--- a/src/web/pages/page.jsx
+++ b/src/web/pages/page.jsx
@@ -3,10 +3,9 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
-import {withRouter} from 'react-router-dom';
+import {withRouter} from 'web/utils/withRouter';
import styled from 'styled-components';
diff --git a/src/web/pages/policies/__tests__/__snapshots__/details.jsx.snap b/src/web/pages/policies/__tests__/__snapshots__/details.jsx.snap
index 5b8077164c..384eef093c 100644
--- a/src/web/pages/policies/__tests__/__snapshots__/details.jsx.snap
+++ b/src/web/pages/policies/__tests__/__snapshots__/details.jsx.snap
@@ -81,13 +81,6 @@ exports[`Policy Details tests > should render full Details 1`] = `
align-items: center;
}
-.c10 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
.c9 {
margin-left: -5px;
}
@@ -110,6 +103,13 @@ exports[`Policy Details tests > should render full Details 1`] = `
display: inline-flex;
}
+.c10 {
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+}
+
.c1 {
border: 0;
border-spacing: 0px;
diff --git a/src/web/pages/reportconfigs/__tests__/__snapshots__/component.jsx.snap b/src/web/pages/reportconfigs/__tests__/__snapshots__/component.jsx.snap
index 46cc076154..8652502d54 100644
--- a/src/web/pages/reportconfigs/__tests__/__snapshots__/component.jsx.snap
+++ b/src/web/pages/reportconfigs/__tests__/__snapshots__/component.jsx.snap
@@ -382,6 +382,55 @@ exports[`Report Config Component tests > should open create dialog and call GMP
padding-right: 10px;
}
+.c14 {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ display: block;
+ height: 22px;
+ color: #4C4C4C;
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #bfbfbf;
+ border-radius: 2px;
+ padding: 1px 8px;
+}
+
+.c14:-webkit-autofill {
+ box-shadow: 0 0 0 1000px white inset;
+}
+
+.c15 {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ -webkit-box-pack: start;
+ -ms-flex-pack: start;
+ -webkit-justify-content: start;
+ justify-content: start;
+ -webkit-align-items: center;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+}
+
+.c16 {
+ color: #c12c30;
+ font-weight: bold;
+ font-size: 19px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ display: none;
+}
+
.c23 {
background-color: transparent;
border: none;
@@ -470,15 +519,6 @@ exports[`Report Config Component tests > should open create dialog and call GMP
cursor: pointer;
}
-.c16 {
- color: #c12c30;
- font-weight: bold;
- font-size: 19px;
- padding-bottom: 1px;
- padding-left: 4px;
- display: none;
-}
-
.c21 {
cursor: default;
}
@@ -490,46 +530,6 @@ exports[`Report Config Component tests > should open create dialog and call GMP
display: flex;
}
-.c14 {
- font-family: inherit;
- font-size: inherit;
- line-height: inherit;
- display: block;
- height: 22px;
- color: #4C4C4C;
- background-color: #fff;
- background-image: none;
- border: 1px solid #bfbfbf;
- border-radius: 2px;
- padding: 1px 8px;
-}
-
-.c14:-webkit-autofill {
- box-shadow: 0 0 0 1000px white inset;
-}
-
-.c15 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: start;
- justify-content: start;
- -webkit-align-items: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
should render full Details 1`] = `
table-layout: auto;
}
-.c7 {
- vertical-align: top;
-}
-
.c2 td {
padding: 4px 4px 4px 0;
}
@@ -86,6 +82,10 @@ exports[`Report Config Details tests > should render full Details 1`] = `
padding-right: 5px;
}
+.c7 {
+ vertical-align: top;
+}
+
.c3 {
width: 10%;
}
@@ -402,10 +402,6 @@ exports[`Report Config Details tests > should render orphaned config details 1`]
table-layout: auto;
}
-.c6 {
- vertical-align: top;
-}
-
.c2 td {
padding: 4px 4px 4px 0;
}
@@ -414,6 +410,10 @@ exports[`Report Config Details tests > should render orphaned config details 1`]
padding-right: 5px;
}
+.c6 {
+ vertical-align: top;
+}
+
.c3 {
width: 10%;
}
diff --git a/src/web/pages/reports/auditdeltadetailspage.jsx b/src/web/pages/reports/auditdeltadetailspage.jsx
index 2a65928c1f..09ead8258d 100644
--- a/src/web/pages/reports/auditdeltadetailspage.jsx
+++ b/src/web/pages/reports/auditdeltadetailspage.jsx
@@ -3,12 +3,11 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React, {useEffect, useState} from 'react';
import {useDispatch, useSelector, shallowEqual} from 'react-redux';
-import {useRouteMatch} from 'react-router-dom';
+import {useParams} from 'react-router-dom';
import useTranslation from 'web/hooks/useTranslation';
@@ -17,7 +16,7 @@ import logger from 'gmp/log';
import Filter, {
ALL_FILTER,
RESET_FILTER,
- RESULTS_FILTER_FILTER
+ RESULTS_FILTER_FILTER,
} from 'gmp/models/filter';
import {isActive} from 'gmp/models/task';
@@ -114,12 +113,12 @@ const DeltaAuditReportDetails = props => {
sortReverse: false,
},
});
-
+
const [_] = useTranslation();
const gmp = useGmp();
const dispatch = useDispatch();
- const match = useRouteMatch();
- const {id: reportId, deltaid: deltaReportId} = match.params;
+ const params = useParams();
+ const {id: reportId, deltaid: deltaReportId} = params;
const reportFormatsSel = useSelector(reportFormatsSelector);
const reportConfigsSel = useSelector(reportConfigsSelector);
@@ -513,9 +512,9 @@ const load =
const DeltaAuditReportDetailsWrapper = ({defaultFilter, ...props}) => {
const gmp = useGmp();
const dispatch = useDispatch();
- const match = useRouteMatch();
+ const params = useParams('/auditreport/delta/:id/:deltaid');
- const {id: reportId, deltaid: deltaReportId} = match.params;
+ const {id: reportId, deltaid: deltaReportId} = params;
const deltaSel = useSelector(deltaAuditReportSelector, shallowEqual);
const entity = deltaSel.getEntity(reportId, deltaReportId);
const reportFilter = entity?.report?.filter;
@@ -562,4 +561,4 @@ DeltaAuditReportDetailsWrapper.propTypes = {
export default compose(
withDialogNotification,
withDownload,
-)(DeltaAuditReportDetailsWrapper);
\ No newline at end of file
+)(DeltaAuditReportDetailsWrapper);
diff --git a/src/web/pages/reports/auditdetailspage.jsx b/src/web/pages/reports/auditdetailspage.jsx
index b0585d6ffa..73ff234257 100644
--- a/src/web/pages/reports/auditdetailspage.jsx
+++ b/src/web/pages/reports/auditdetailspage.jsx
@@ -3,12 +3,11 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React, {useEffect, useState} from 'react';
import {useDispatch, useSelector, shallowEqual} from 'react-redux';
-import {useRouteMatch} from 'react-router-dom';
+import {useParams} from 'react-router-dom';
import useTranslation from 'web/hooks/useTranslation';
@@ -17,7 +16,7 @@ import logger from 'gmp/log';
import Filter, {
ALL_FILTER,
RESET_FILTER,
- RESULTS_FILTER_FILTER
+ RESULTS_FILTER_FILTER,
} from 'gmp/models/filter';
import {isActive} from 'gmp/models/task';
@@ -149,8 +148,8 @@ const ReportDetails = props => {
const [_] = useTranslation();
const gmp = useGmp();
const dispatch = useDispatch();
- const match = useRouteMatch();
- const {id: reportId} = match.params;
+ const params = useParams('/audit/:id');
+ const {id: reportId} = params;
const pSelector = useSelector(getPage, shallowEqual);
const pageFilter = pSelector?.getFilter(getReportPageName(reportId));
@@ -613,7 +612,7 @@ const load =
// eslint-disable-next-line no-shadow
dispatch,
gmp,
- match,
+ params,
pageFilter,
reportFilter,
}) =>
@@ -637,16 +636,16 @@ const load =
// use fallback filter
filter = DEFAULT_FILTER;
}
- dispatch(setPageFilter(getReportPageName(match.params.id), filter));
+ dispatch(setPageFilter(getReportPageName(params.id), filter));
return dispatch(loadAuditReportWithThreshold(gmp)(reportId, {filter}));
};
const ReportDetailsWrapper = props => {
const dispatch = useDispatch();
const gmp = useGmp();
- const match = useRouteMatch();
+ const params = useParams();
- const {id: reportId} = match.params;
+ const {id: reportId} = params;
const reportSel = useSelector(auditReportSelector, shallowEqual);
const pSelector = useSelector(getPage, shallowEqual);
@@ -667,7 +666,7 @@ const ReportDetailsWrapper = props => {
...props,
dispatch,
gmp,
- match,
+ params,
defaultFilter: filter,
reportFilter,
reportId,
@@ -677,7 +676,7 @@ const ReportDetailsWrapper = props => {
...props,
dispatch,
gmp,
- match,
+ params,
defaultFilter: filter,
reportFilter,
reportId,
@@ -702,4 +701,4 @@ const ReportDetailsWrapper = props => {
export default compose(
withDialogNotification,
withDownload,
-)(ReportDetailsWrapper);
\ No newline at end of file
+)(ReportDetailsWrapper);
diff --git a/src/web/pages/reports/auditreportslistpage.jsx b/src/web/pages/reports/auditreportslistpage.jsx
index b12d3739a0..57949e3490 100644
--- a/src/web/pages/reports/auditreportslistpage.jsx
+++ b/src/web/pages/reports/auditreportslistpage.jsx
@@ -3,10 +3,9 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React, {useEffect, useState} from 'react';
-import {useHistory} from 'react-router-dom';
+import {useNavigate} from 'react-router-dom';
import useTranslation from 'web/hooks/useTranslation';
@@ -49,14 +48,14 @@ import AuditReportsDashboard, {
const ToolBarIcons = () => {
const [_] = useTranslation();
return (
-
-
-
- )
+
+
+
+ );
};
const AuditReportsPage = ({
@@ -68,7 +67,7 @@ const AuditReportsPage = ({
}) => {
const [selectedDeltaReport, setSelectedDeltaReport] = useState();
const [beforeSelectFilter, setBeforeSelectFilter] = useState();
- const history = useHistory();
+ const navigate = useNavigate();
const [_] = useTranslation();
useEffect(() => {
@@ -88,7 +87,7 @@ const AuditReportsPage = ({
if (isDefined(selectedDeltaReport)) {
onFilterChanged(beforeSelectFilter);
- history.push(
+ navigate(
'/auditreport/delta/' + selectedDeltaReport.id + '/' + report.id,
);
} else {
@@ -144,7 +143,7 @@ const AuditReportsPage = ({
AuditReportsPage.propTypes = {
filter: PropTypes.filter,
- history: PropTypes.object.isRequired,
+ navigate: PropTypes.func.isRequired,
onChanged: PropTypes.func.isRequired,
onDelete: PropTypes.func.isRequired,
onError: PropTypes.func.isRequired,
@@ -162,8 +161,8 @@ const FALLBACK_AUDIT_REPORT_LIST_FILTER = Filter.fromString(
);
export default withEntitiesContainer('auditreport', {
- fallbackFilter: FALLBACK_AUDIT_REPORT_LIST_FILTER,
- entitiesSelector,
- loadEntities,
- reloadInterval: reportsReloadInterval,
- })(AuditReportsPage);
\ No newline at end of file
+ fallbackFilter: FALLBACK_AUDIT_REPORT_LIST_FILTER,
+ entitiesSelector,
+ loadEntities,
+ reloadInterval: reportsReloadInterval,
+})(AuditReportsPage);
diff --git a/src/web/pages/reports/deltadetailspage.jsx b/src/web/pages/reports/deltadetailspage.jsx
index 6a854d3d34..4683940529 100644
--- a/src/web/pages/reports/deltadetailspage.jsx
+++ b/src/web/pages/reports/deltadetailspage.jsx
@@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
import {connect} from 'react-redux';
@@ -15,7 +14,8 @@ import logger from 'gmp/log';
import Filter, {
ALL_FILTER,
RESET_FILTER,
- RESULTS_FILTER_FILTER} from 'gmp/models/filter';
+ RESULTS_FILTER_FILTER,
+} from 'gmp/models/filter';
import {isActive} from 'gmp/models/task';
import {first} from 'gmp/utils/array';
@@ -76,6 +76,7 @@ import TargetComponent from '../targets/component';
import Page from './deltadetailscontent';
import FilterDialog from './detailsfilterdialog';
+import {withRouter} from 'web/utils/withRouter';
const log = logger.getLogger('web.pages.report.deltadetailspage');
@@ -99,7 +100,6 @@ const getFilter = (entity = {}) => {
class DeltaReportDetails extends React.Component {
constructor(...args) {
super(...args);
-
this.state = {
activeTab: 0,
showFilterDialog: false,
@@ -318,7 +318,7 @@ class DeltaReportDetails extends React.Component {
includeOverrides,
reportConfigId,
reportFormatId,
- storeAsDefault
+ storeAsDefault,
} = state;
const newFilter = reportFilter.copy();
@@ -564,7 +564,6 @@ DeltaReportDetails.propTypes = {
loadSettings: PropTypes.func.isRequired,
loadTarget: PropTypes.func.isRequired,
location: PropTypes.object.isRequired,
- match: PropTypes.object.isRequired,
reload: PropTypes.func.isRequired,
reportComposerDefaults: PropTypes.object,
reportExportFileName: PropTypes.string,
@@ -605,8 +604,9 @@ const mapDispatchToProps = (dispatch, {gmp}) => {
};
};
-const mapStateToProps = (rootState, {match}) => {
- const {id, deltaid} = match.params;
+const mapStateToProps = (rootState, {params}) => {
+ const {id, deltaid} = params;
+
const filterSel = filterSelector(rootState);
const deltaSel = deltaReportSelector(rootState);
const reportFormatsSel = reportFormatsSelector(rootState);
@@ -708,6 +708,7 @@ export default compose(
withGmp,
withDialogNotification,
withDownload,
+ withRouter,
connect(mapStateToProps, mapDispatchToProps),
)(DeltaReportDetailsWrapper);
diff --git a/src/web/pages/reports/details/toolbaricons.jsx b/src/web/pages/reports/details/toolbaricons.jsx
index 7a61def7f5..76554d924c 100644
--- a/src/web/pages/reports/details/toolbaricons.jsx
+++ b/src/web/pages/reports/details/toolbaricons.jsx
@@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
import _ from 'gmp/locale';
@@ -120,7 +119,7 @@ const ToolBarIcons = ({
end: isDefined(report.scan_end)
? report.scan_end.toISOString()
: undefined,
- scanner: isDefined(report.slave) ? report.slave.id : undefined,
+ ...(isDefined(report.slave) && {scanner: report.slave.id}),
}}
>
diff --git a/src/web/pages/reports/detailspage.jsx b/src/web/pages/reports/detailspage.jsx
index 63a76527f3..9f56cea385 100644
--- a/src/web/pages/reports/detailspage.jsx
+++ b/src/web/pages/reports/detailspage.jsx
@@ -3,10 +3,10 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
import {connect} from 'react-redux';
+import {withRouter} from 'web/utils/withRouter';
import _ from 'gmp/locale';
@@ -685,7 +685,6 @@ ReportDetails.propTypes = {
loadSettings: PropTypes.func.isRequired,
loadTarget: PropTypes.func.isRequired,
location: PropTypes.object.isRequired,
- match: PropTypes.object.isRequired,
pageFilter: PropTypes.filter,
reload: PropTypes.func.isRequired,
reportComposerDefaults: PropTypes.object,
@@ -781,7 +780,7 @@ ReportDetailsWrapper.propTypes = {
const getReportPageName = id => `report-${id}`;
-const mapDispatchToProps = (dispatch, {gmp, match}) => ({
+const mapDispatchToProps = (dispatch, {gmp, params}) => ({
onInteraction: () => dispatch(renewSessionTimeout(gmp)()),
loadFilters: () => dispatch(loadFilters(gmp)(RESULTS_FILTER_FILTER)),
loadSettings: () => dispatch(loadUserSettingDefaults(gmp)()),
@@ -794,12 +793,11 @@ const mapDispatchToProps = (dispatch, {gmp, match}) => ({
loadReportComposerDefaults: () => dispatch(loadReportComposerDefaults(gmp)()),
saveReportComposerDefaults: reportComposerDefaults =>
dispatch(saveReportComposerDefaults(gmp)(reportComposerDefaults)),
- updateFilter: f =>
- dispatch(setPageFilter(getReportPageName(match.params.id), f)),
+ updateFilter: f => dispatch(setPageFilter(getReportPageName(params.id), f)),
});
-const mapStateToProps = (rootState, {match}) => {
- const {id} = match.params;
+const mapStateToProps = (rootState, {params}) => {
+ const {id} = params;
const filterSel = filterSelector(rootState);
const reportSel = reportSelector(rootState);
const reportConfigsSel = reportConfigsSelector(rootState);
@@ -847,6 +845,7 @@ export default compose(
withGmp,
withDialogNotification,
withDownload,
+ withRouter,
connect(mapStateToProps, mapDispatchToProps),
)(ReportDetailsWrapper);
diff --git a/src/web/pages/reports/listpage.jsx b/src/web/pages/reports/listpage.jsx
index 946f2a0966..24ef66be9a 100644
--- a/src/web/pages/reports/listpage.jsx
+++ b/src/web/pages/reports/listpage.jsx
@@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
import {connect} from 'react-redux';
@@ -159,11 +158,13 @@ class Page extends React.Component {
const {selectedDeltaReport, beforeSelectFilter} = this.state;
if (isDefined(selectedDeltaReport)) {
- const {history} = this.props;
+ const {navigate} = this.props;
onFilterChanged(beforeSelectFilter);
- history.push('/report/delta/' + selectedDeltaReport.id + '/' + report.id);
+ navigate('/report/delta/' + selectedDeltaReport.id + '/' + report.id, {
+ replace: true,
+ });
} else {
const {filter = new Filter()} = this.props;
@@ -192,11 +193,8 @@ class Page extends React.Component {
render() {
const {filter, onFilterChanged, onInteraction, tasks} = this.props;
- const {
- containerTaskDialogVisible,
- importDialogVisible,
- task_id,
- } = this.state;
+ const {containerTaskDialogVisible, importDialogVisible, task_id} =
+ this.state;
return (
@@ -252,7 +250,7 @@ class Page extends React.Component {
Page.propTypes = {
filter: PropTypes.filter,
gmp: PropTypes.gmp.isRequired,
- history: PropTypes.object.isRequired,
+ navigate: PropTypes.func.isRequired,
loadTasks: PropTypes.func.isRequired,
tasks: PropTypes.arrayOf(PropTypes.model),
onChanged: PropTypes.func.isRequired,
@@ -284,10 +282,7 @@ const FALLBACK_REPORT_LIST_FILTER = Filter.fromString(
export default compose(
withGmp,
- connect(
- mapStateToProps,
- mapDispatchToProps,
- ),
+ connect(mapStateToProps, mapDispatchToProps),
withEntitiesContainer('report', {
fallbackFilter: FALLBACK_REPORT_LIST_FILTER,
entitiesSelector,
diff --git a/src/web/pages/scanconfigs/__tests__/__snapshots__/details.jsx.snap b/src/web/pages/scanconfigs/__tests__/__snapshots__/details.jsx.snap
index 0960b0fddc..339788e5fc 100644
--- a/src/web/pages/scanconfigs/__tests__/__snapshots__/details.jsx.snap
+++ b/src/web/pages/scanconfigs/__tests__/__snapshots__/details.jsx.snap
@@ -81,13 +81,6 @@ exports[`Scan Config Details tests > should render full Details 1`] = `
align-items: center;
}
-.c10 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
.c9 {
margin-left: -5px;
}
@@ -110,6 +103,13 @@ exports[`Scan Config Details tests > should render full Details 1`] = `
display: inline-flex;
}
+.c10 {
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+}
+
.c1 {
border: 0;
border-spacing: 0px;
diff --git a/src/web/pages/scanconfigs/__tests__/__snapshots__/editdialog.jsx.snap b/src/web/pages/scanconfigs/__tests__/__snapshots__/editdialog.jsx.snap
index fa5712f392..f8ce81efb6 100644
--- a/src/web/pages/scanconfigs/__tests__/__snapshots__/editdialog.jsx.snap
+++ b/src/web/pages/scanconfigs/__tests__/__snapshots__/editdialog.jsx.snap
@@ -281,59 +281,6 @@ exports[`EditScanConfigDialog component tests > should render dialog 1`] = `
width: inherit;
}
-.c25 {
- overflow: hidden;
- -webkit-transition: 0.4s;
- transition: 0.4s;
-}
-
-.c44 {
- overflow: hidden;
- -webkit-transition: 0.4s;
- transition: 0.4s;
- display: none;
- height: 0;
-}
-
-.c18 {
- margin: 10px 0px;
- padding-bottom: 1px;
- border-bottom: 2px solid #e5e5e5;
- position: relative;
-}
-
-.c19 {
- margin: 0 0 1px 0;
-}
-
-.c20 {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- -webkit-justify-content: flex-start;
- justify-content: flex-start;
- -webkit-align-items: stretch;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
-}
-
-.c22 {
- word-break: break-all;
- min-width: 100px;
-}
-
-.c23 {
- margin-left: 3px;
- margin-top: -2px;
-}
-
.c1 {
position: relative;
display: -webkit-box;
@@ -601,90 +548,6 @@ exports[`EditScanConfigDialog component tests > should render dialog 1`] = `
padding-right: 10px;
}
-.c16 {
- color: #c12c30;
- font-weight: bold;
- font-size: 19px;
- padding-bottom: 1px;
- padding-left: 4px;
- display: none;
-}
-
-.c27 {
- border: 0;
- border-spacing: 0px;
- font-size: 12px;
- text-align: left;
- table-layout: auto;
- width: 100%;
-}
-
-.c46 {
- border: 0;
- border-spacing: 0px;
- font-size: 12px;
- text-align: left;
- table-layout: fixed;
- width: 100%;
-}
-
-.c28 th,
-.c28 td {
- padding: 4px 10px;
- border-bottom: 1px solid #e5e5e5;
-}
-
-.c28 tfoot tr {
- background: #fff;
-}
-
-.c28 tfoot tr td {
- border-bottom: 1px solid #e5e5e5;
-}
-
-.c29 a {
- -webkit-text-decoration: none;
- text-decoration: none;
- color: #000;
-}
-
-.c29 a:hover {
- -webkit-text-decoration: underline;
- text-decoration: underline;
- color: #000;
-}
-
-.c30 {
- background-color: #fff;
- color: #000;
- border-top: 1px solid #e5e5e5;
- font-weight: bold;
-}
-
-.c31 {
- background-color: #fff;
- color: #000;
- border-top: 1px solid #e5e5e5;
- font-weight: bold;
- width: 9em;
-}
-
-.c47 {
- background-color: #fff;
- color: #000;
- border-top: 1px solid #e5e5e5;
- font-weight: bold;
- width: 30%;
-}
-
-.c48 {
- background-color: #fff;
- color: #000;
- border-top: 1px solid #e5e5e5;
- font-weight: bold;
- width: 10%;
-}
-
.c14 {
font-family: inherit;
font-size: inherit;
@@ -743,6 +606,15 @@ exports[`EditScanConfigDialog component tests > should render dialog 1`] = `
align-items: center;
}
+.c16 {
+ color: #c12c30;
+ font-weight: bold;
+ font-size: 19px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ display: none;
+}
+
.c37 {
display: -webkit-inline-box;
display: -webkit-inline-flex;
@@ -806,6 +678,134 @@ exports[`EditScanConfigDialog component tests > should render dialog 1`] = `
align-items: center;
}
+.c25 {
+ overflow: hidden;
+ -webkit-transition: 0.4s;
+ transition: 0.4s;
+}
+
+.c44 {
+ overflow: hidden;
+ -webkit-transition: 0.4s;
+ transition: 0.4s;
+ display: none;
+ height: 0;
+}
+
+.c18 {
+ margin: 10px 0px;
+ padding-bottom: 1px;
+ border-bottom: 2px solid #e5e5e5;
+ position: relative;
+}
+
+.c19 {
+ margin: 0 0 1px 0;
+}
+
+.c20 {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-box-pack: start;
+ -ms-flex-pack: start;
+ -webkit-justify-content: flex-start;
+ justify-content: flex-start;
+ -webkit-align-items: stretch;
+ -webkit-box-align: stretch;
+ -ms-flex-align: stretch;
+ align-items: stretch;
+}
+
+.c22 {
+ word-break: break-all;
+ min-width: 100px;
+}
+
+.c23 {
+ margin-left: 3px;
+ margin-top: -2px;
+}
+
+.c27 {
+ border: 0;
+ border-spacing: 0px;
+ font-size: 12px;
+ text-align: left;
+ table-layout: auto;
+ width: 100%;
+}
+
+.c46 {
+ border: 0;
+ border-spacing: 0px;
+ font-size: 12px;
+ text-align: left;
+ table-layout: fixed;
+ width: 100%;
+}
+
+.c28 th,
+.c28 td {
+ padding: 4px 10px;
+ border-bottom: 1px solid #e5e5e5;
+}
+
+.c28 tfoot tr {
+ background: #fff;
+}
+
+.c28 tfoot tr td {
+ border-bottom: 1px solid #e5e5e5;
+}
+
+.c29 a {
+ -webkit-text-decoration: none;
+ text-decoration: none;
+ color: #000;
+}
+
+.c29 a:hover {
+ -webkit-text-decoration: underline;
+ text-decoration: underline;
+ color: #000;
+}
+
+.c30 {
+ background-color: #fff;
+ color: #000;
+ border-top: 1px solid #e5e5e5;
+ font-weight: bold;
+}
+
+.c31 {
+ background-color: #fff;
+ color: #000;
+ border-top: 1px solid #e5e5e5;
+ font-weight: bold;
+ width: 9em;
+}
+
+.c47 {
+ background-color: #fff;
+ color: #000;
+ border-top: 1px solid #e5e5e5;
+ font-weight: bold;
+ width: 30%;
+}
+
+.c48 {
+ background-color: #fff;
+ color: #000;
+ border-top: 1px solid #e5e5e5;
+ font-weight: bold;
+ width: 10%;
+}
+
.c49 {
overflow-wrap: break-word;
}
@@ -2609,6 +2609,19 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
height: 100%;
}
+.c17 {
+ font-size: 14px;
+ margin-bottom: 0px;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ -webkit-justify-content: center;
+ justify-content: center;
+}
+
.c10 {
display: -webkit-box;
display: -webkit-flex;
@@ -2642,15 +2655,6 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
padding-right: 10px;
}
-.c16 {
- color: #c12c30;
- font-weight: bold;
- font-size: 19px;
- padding-bottom: 1px;
- padding-left: 4px;
- display: none;
-}
-
.c14 {
font-family: inherit;
font-size: inherit;
@@ -2691,17 +2695,13 @@ exports[`EditScanConfigDialog component tests > should render dialog for config
align-items: center;
}
-.c17 {
- font-size: 14px;
- margin-bottom: 0px;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
+.c16 {
+ color: #c12c30;
+ font-weight: bold;
+ font-size: 19px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ display: none;
}
@@ -3177,6 +3177,19 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
height: 100%;
}
+.c17 {
+ font-size: 14px;
+ margin-bottom: 0px;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ -webkit-justify-content: center;
+ justify-content: center;
+}
+
.c10 {
display: -webkit-box;
display: -webkit-flex;
@@ -3210,15 +3223,6 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
padding-right: 10px;
}
-.c16 {
- color: #c12c30;
- font-weight: bold;
- font-size: 19px;
- padding-bottom: 1px;
- padding-left: 4px;
- display: none;
-}
-
.c14 {
font-family: inherit;
font-size: inherit;
@@ -3259,17 +3263,13 @@ exports[`EditScanConfigDialog component tests > should render dialog inline noti
align-items: center;
}
-.c17 {
- font-size: 14px;
- margin-bottom: 0px;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- justify-content: center;
+.c16 {
+ color: #c12c30;
+ font-weight: bold;
+ font-size: 19px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ display: none;
}
diff --git a/src/web/pages/tasks/__tests__/__snapshots__/autodeletereportsgroup.jsx.snap b/src/web/pages/tasks/__tests__/__snapshots__/autodeletereportsgroup.jsx.snap
index 12fe4743ae..d828689415 100644
--- a/src/web/pages/tasks/__tests__/__snapshots__/autodeletereportsgroup.jsx.snap
+++ b/src/web/pages/tasks/__tests__/__snapshots__/autodeletereportsgroup.jsx.snap
@@ -37,28 +37,6 @@ exports[`AutoDeleteReportsGroup tests > should render dialog group 1`] = `
align-items: center;
}
-.c7 {
- margin-left: -5px;
-}
-
-.c7>* {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
-.c7>* {
- margin-left: 5px;
-}
-
-.c6 {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
- display: -ms-inline-flexbox;
- display: inline-flex;
-}
-
.c0 {
display: -webkit-box;
display: -webkit-flex;
@@ -92,6 +70,28 @@ exports[`AutoDeleteReportsGroup tests > should render dialog group 1`] = `
padding-right: 10px;
}
+.c7 {
+ margin-left: -5px;
+}
+
+.c7>* {
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+}
+
+.c7>* {
+ margin-left: 5px;
+}
+
+.c6 {
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+}
+
.c4 {
display: -webkit-inline-box;
display: -webkit-inline-flex;
diff --git a/src/web/pages/tasks/__tests__/__snapshots__/details.jsx.snap b/src/web/pages/tasks/__tests__/__snapshots__/details.jsx.snap
index e743288e07..d88ca107ed 100644
--- a/src/web/pages/tasks/__tests__/__snapshots__/details.jsx.snap
+++ b/src/web/pages/tasks/__tests__/__snapshots__/details.jsx.snap
@@ -59,35 +59,48 @@ exports[`Task Details tests > should render full task details 1`] = `
align-items: center;
}
-.c2 {
+.c5 {
+ margin-left: -5px;
+}
+
+.c5>* {
display: -webkit-inline-box;
display: -webkit-inline-flex;
display: -ms-inline-flexbox;
display: inline-flex;
}
-.c5 {
- margin-left: -5px;
+.c5>* {
+ margin-left: 5px;
}
-.c5>* {
+.c4 {
display: -webkit-inline-box;
display: -webkit-inline-flex;
display: -ms-inline-flexbox;
display: inline-flex;
}
-.c5>* {
+.c6>*:not(:last-child)::after {
+ content: '•';
margin-left: 5px;
}
-.c4 {
+.c2 {
display: -webkit-inline-box;
display: -webkit-inline-flex;
display: -ms-inline-flexbox;
display: inline-flex;
}
+.c9 {
+ width: 10%;
+}
+
+.c10 {
+ width: 90%;
+}
+
.c7 {
border: 0;
border-spacing: 0px;
@@ -97,11 +110,6 @@ exports[`Task Details tests > should render full task details 1`] = `
width: 100%;
}
-.c6>*:not(:last-child)::after {
- content: '•';
- margin-left: 5px;
-}
-
.c8 td {
padding: 4px 4px 4px 0;
}
@@ -110,14 +118,6 @@ exports[`Task Details tests > should render full task details 1`] = `
padding-right: 5px;
}
-.c9 {
- width: 10%;
-}
-
-.c10 {
- width: 90%;
-}
-
@media print {
.c7 {
border-collapse: collapse;
diff --git a/src/web/pages/tasks/dashboard/highresults.jsx b/src/web/pages/tasks/dashboard/highresults.jsx
index 34a43c8b2a..9190c8009b 100644
--- a/src/web/pages/tasks/dashboard/highresults.jsx
+++ b/src/web/pages/tasks/dashboard/highresults.jsx
@@ -5,7 +5,7 @@
import React from 'react';
-import {withRouter} from 'react-router-dom';
+import {withRouter} from 'web/utils/withRouter';
import {format as d3format} from 'd3-format';
@@ -73,9 +73,9 @@ export class TasksHighResultsDisplay extends React.Component {
}
handleDataClick(data) {
- const {history} = this.props;
+ const {navigate} = this.props;
- history.push(`/task/${data.id}`);
+ navigate(`/task/${data.id}`);
}
render() {
@@ -109,7 +109,7 @@ export class TasksHighResultsDisplay extends React.Component {
TasksHighResultsDisplay.propTypes = {
filter: PropTypes.filter,
- history: PropTypes.object.isRequired,
+ navigate: PropTypes.func.isRequired,
};
TasksHighResultsDisplay = compose(
diff --git a/src/web/pages/tasks/dashboard/mosthighresults.jsx b/src/web/pages/tasks/dashboard/mosthighresults.jsx
index 2fbe5bf242..3e827ed1bf 100644
--- a/src/web/pages/tasks/dashboard/mosthighresults.jsx
+++ b/src/web/pages/tasks/dashboard/mosthighresults.jsx
@@ -5,7 +5,7 @@
import React from 'react';
-import {withRouter} from 'react-router-dom';
+import {withRouter} from 'web/utils/withRouter';
import {format as d3format} from 'd3-format';
@@ -66,9 +66,9 @@ export class TasksMostHighResultsDisplay extends React.Component {
}
handleDataClick(data) {
- const {history} = this.props;
+ const {navigate} = this.props;
- history.push(`/task/${data.id}`);
+ navigate(`/task/${data.id}`);
}
render() {
@@ -107,7 +107,7 @@ export class TasksMostHighResultsDisplay extends React.Component {
TasksMostHighResultsDisplay.propTypes = {
filter: PropTypes.filter,
- history: PropTypes.object.isRequired,
+ navigate: PropTypes.func.isRequired,
};
TasksMostHighResultsDisplay = compose(
diff --git a/src/web/pages/tasks/detailspage.jsx b/src/web/pages/tasks/detailspage.jsx
index 4cf49ebf50..b44518cbb4 100644
--- a/src/web/pages/tasks/detailspage.jsx
+++ b/src/web/pages/tasks/detailspage.jsx
@@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
import _ from 'gmp/locale';
@@ -182,18 +181,19 @@ export const ToolBarIcons = ({
)}
- {!isDefined(entity.current_report) && isDefined(entity.last_report) && (
-
-
-
- )}
+ {!isDefined(entity.current_report) &&
+ isDefined(entity.last_report) && (
+
+
+
+ )}
- qhistory(history, stringify, parse);
+const LoggedOutRoutes = () => (
+
+ } />
+ } />
+ } />
+
+);
-const HISTORY = createQueryHistory();
+const LoggedInRoutes = () => {
+ return (
+
+
+
+
+
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ }
+ />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ }
+ />
+ } />
+ } />
+ } />
+ }
+ />
+ } />
+ }
+ />
+ }
+ />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ }
+ />
+ } />
-const Routes = () => (
-
-
-
-
-
-
-
-
-
-
+ } />
+
+ }
+ />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ }
+ />
+
+ }
+ />
+ } />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ } />
+
+
+
+
+ );
+};
-
-
-
-
-
-
-
-
-);
+const AppRoutes = () => {
+ const isLoggedIn = useSelector(selectIsLoggedIn);
-Routes.propTypes = {
- gmp: PropTypes.gmp.isRequired,
+ return (
+ {isLoggedIn ? : }
+ );
};
-export default withGmp(Routes);
-
-// vim: set ts=2 sw=2 tw=80:
+export default AppRoutes;
diff --git a/src/web/utils/testing.jsx b/src/web/utils/testing.jsx
index 626b33b3dc..788f70f2d8 100644
--- a/src/web/utils/testing.jsx
+++ b/src/web/utils/testing.jsx
@@ -22,14 +22,13 @@ import {
within,
renderHook as rtlRenderHook,
} from '@testing-library/react/pure';
+
import userEvent from '@testing-library/user-event';
-import {Router} from 'react-router-dom';
+import {BrowserRouter} from 'react-router-dom';
import {Provider} from 'react-redux';
-import {createMemoryHistory} from 'history';
-
import EverythingCapabilities from 'gmp/capabilities/everything';
import {hasValue, isDefined} from 'gmp/utils/identity';
@@ -38,7 +37,6 @@ import GmpContext from 'web/components/provider/gmpprovider';
import CapabilitiesContext from 'web/components/provider/capabilitiesprovider';
import LicenseProvider from 'web/components/provider/licenseprovider';
-import {createQueryHistory} from 'web/routes';
import configureStore from 'web/store';
import {StyleSheetManager} from 'styled-components';
@@ -116,7 +114,6 @@ const withProvider =
const TestingGmpProvider = withProvider('gmp', 'value')(GmpContext.Provider);
const TestingStoreProvider = withProvider('store')(Provider);
-const TestingRouter = withProvider('history')(Router);
const TestingCapabilitiesProvider = withProvider(
'capabilities',
'value',
@@ -136,11 +133,6 @@ export const rendererWith = (
store = configureStore({testing: true});
}
- let history;
- if (router === true) {
- history = createQueryHistory(createMemoryHistory({initialEntries: ['/']}));
- }
-
if (capabilities === true) {
capabilities = new EverythingCapabilities();
}
@@ -150,7 +142,11 @@ export const rendererWith = (
- {children}
+ {router ? (
+ {children}
+ ) : (
+ children
+ )}
@@ -163,7 +159,6 @@ export const rendererWith = (
render: ui => render({ui} ),
gmp,
store,
- history,
renderHook: hook => rtlRenderHook(hook, {wrapper}),
};
};
diff --git a/src/web/utils/withRouter.jsx b/src/web/utils/withRouter.jsx
new file mode 100644
index 0000000000..b97f0c0679
--- /dev/null
+++ b/src/web/utils/withRouter.jsx
@@ -0,0 +1,25 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {useLocation, useNavigate, useParams} from 'react-router-dom';
+
+export const withRouter = Component => {
+ function ComponentWithRouterProp(props) {
+ let location = useLocation();
+ let navigate = useNavigate();
+ let params = useParams();
+
+ return (
+
+ );
+ }
+
+ return ComponentWithRouterProp;
+};
From 47e9047ffae6d0585d6ef06c2dfec7f0a159f6af Mon Sep 17 00:00:00 2001
From: daniele-mng
Date: Fri, 13 Sep 2024 10:01:30 +0200
Subject: [PATCH 121/130] fix: location.query
---
src/web/entities/container.jsx | 17 +-
src/web/entities/withEntitiesContainer.jsx | 175 +++++++++---------
src/web/hooks/usePageFilter.js | 20 +-
.../extras/__tests__/cvsscalculatorpage.jsx | 30 ++-
.../pages/extras/cvssV4/CvssV4Calculator.jsx | 12 +-
.../cvssV4/__tests__/cvssV4Calculator.jsx | 40 ++--
src/web/pages/extras/cvsscalculatorpage.jsx | 39 ++--
src/web/pages/omp.jsx | 7 +-
src/web/pages/performance/performancepage.jsx | 9 +-
src/web/utils/withRouter.jsx | 15 +-
10 files changed, 191 insertions(+), 173 deletions(-)
diff --git a/src/web/entities/container.jsx b/src/web/entities/container.jsx
index b05c809a84..b7871952bb 100644
--- a/src/web/entities/container.jsx
+++ b/src/web/entities/container.jsx
@@ -320,17 +320,18 @@ class EntitiesContainer extends React.Component {
this.changeFilter(RESET_FILTER);
}
- handleFilterReset() {
- const {navigate, location} = this.props;
- const query = {...location.query};
+ handleFilterReset = () => {
+ const {navigate, location, searchParams} = this.props;
- // remove filter param from url
- delete query.filter;
+ searchParams.delete('filter');
- navigate({pathname: location.pathname, query});
+ navigate({
+ pathname: location.pathname,
+ search: searchParams.toString(),
+ });
this.changeFilter();
- }
+ };
openTagDialog() {
this.setState({tagDialogVisible: true});
@@ -582,6 +583,8 @@ EntitiesContainer.propTypes = {
entitiesCounts: PropTypes.counts,
entitiesError: PropTypes.error,
filter: PropTypes.filter,
+ searchParams: PropTypes.object,
+ location: PropTypes.object,
gmp: PropTypes.gmp.isRequired,
gmpname: PropTypes.string.isRequired,
navigate: PropTypes.object.isRequired,
diff --git a/src/web/entities/withEntitiesContainer.jsx b/src/web/entities/withEntitiesContainer.jsx
index 0db78be131..7f3f179db9 100644
--- a/src/web/entities/withEntitiesContainer.jsx
+++ b/src/web/entities/withEntitiesContainer.jsx
@@ -5,7 +5,7 @@
import React from 'react';
-import {useLocation} from 'react-router-dom';
+import {useSearchParams} from 'react-router-dom';
import {connect} from 'react-redux';
@@ -27,99 +27,98 @@ import EntitiesContainer from './container';
const noop = () => {};
-const withEntitiesContainer = (
- gmpname,
- {
- entitiesSelector,
- loadEntities: loadEntitiesFunc,
- reloadInterval = noop,
- fallbackFilter,
- },
-) => Component => {
- let EntitiesContainerWrapper = ({
- children,
- filter,
- loadEntities,
- notify,
- ...props
- }) => (
- reloadInterval(props)}
- reload={(newFilter = filter) => loadEntities(newFilter)}
- name={gmpname}
- >
- {({reload}) => (
-
- {pageProps => }
-
- )}
-
- );
-
- EntitiesContainerWrapper.propTypes = {
- filter: PropTypes.filter,
- loadEntities: PropTypes.func.isRequired,
- notify: PropTypes.func.isRequired,
- };
-
- const mapStateToProps = (state, {filter}) => {
- const eSelector = entitiesSelector(state);
- const entities = eSelector.getEntities(filter);
- return {
- entities,
- entitiesCounts: eSelector.getEntitiesCounts(filter),
- entitiesError: eSelector.getEntitiesError(filter),
+const withEntitiesContainer =
+ (
+ gmpname,
+ {
+ entitiesSelector,
+ loadEntities: loadEntitiesFunc,
+ reloadInterval = noop,
+ fallbackFilter,
+ },
+ ) =>
+ Component => {
+ let EntitiesContainerWrapper = ({
+ children,
filter,
- isLoading: eSelector.isLoadingEntities(filter),
- loadedFilter: eSelector.getLoadedFilter(filter),
- };
- };
-
- const mapDispatchToProps = (dispatch, {gmp}) => ({
- loadEntities: filter => dispatch(loadEntitiesFunc(gmp)(filter)),
- updateFilter: filter => dispatch(pageFilter(gmpname, filter)),
- onInteraction: () => dispatch(renewSessionTimeout(gmp)()),
- });
-
- EntitiesContainerWrapper = compose(
- withDialogNotification,
- withDownload,
- withGmp,
- connect(
- mapStateToProps,
- mapDispatchToProps,
- ),
- )(EntitiesContainerWrapper);
-
- return props => {
- const location = useLocation();
- return (
-
- {({notify}) => (
- (
+ reloadInterval(props)}
+ reload={(newFilter = filter) => loadEntities(newFilter)}
+ name={gmpname}
+ >
+ {({reload}) => (
+
- {({filter}) => (
-
- )}
-
+ {pageProps => }
+
)}
-
+
);
+
+ EntitiesContainerWrapper.propTypes = {
+ filter: PropTypes.filter,
+ loadEntities: PropTypes.func.isRequired,
+ notify: PropTypes.func.isRequired,
+ };
+
+ const mapStateToProps = (state, {filter}) => {
+ const eSelector = entitiesSelector(state);
+ const entities = eSelector.getEntities(filter);
+ return {
+ entities,
+ entitiesCounts: eSelector.getEntitiesCounts(filter),
+ entitiesError: eSelector.getEntitiesError(filter),
+ filter,
+ isLoading: eSelector.isLoadingEntities(filter),
+ loadedFilter: eSelector.getLoadedFilter(filter),
+ };
+ };
+
+ const mapDispatchToProps = (dispatch, {gmp}) => ({
+ loadEntities: filter => dispatch(loadEntitiesFunc(gmp)(filter)),
+ updateFilter: filter => dispatch(pageFilter(gmpname, filter)),
+ onInteraction: () => dispatch(renewSessionTimeout(gmp)()),
+ });
+
+ EntitiesContainerWrapper = compose(
+ withDialogNotification,
+ withDownload,
+ withGmp,
+ connect(mapStateToProps, mapDispatchToProps),
+ )(EntitiesContainerWrapper);
+
+ return props => {
+ const [searchParams] = useSearchParams();
+ return (
+
+ {({notify}) => (
+
+ {({filter}) => (
+
+ )}
+
+ )}
+
+ );
+ };
};
-};
export default withEntitiesContainer;
diff --git a/src/web/hooks/usePageFilter.js b/src/web/hooks/usePageFilter.js
index 16f2f225cc..f38fd2d689 100644
--- a/src/web/hooks/usePageFilter.js
+++ b/src/web/hooks/usePageFilter.js
@@ -5,7 +5,7 @@
import {useCallback, useEffect, useState} from 'react';
-import {useLocation, useNavigate} from 'react-router-dom';
+import {useSearchParams} from 'react-router-dom';
import {useDispatch} from 'react-redux';
@@ -52,6 +52,7 @@ const useDefaultFilter = pageName =>
* still loading, function to change the filter, function to remove the
* filter and function to reset the filter
*/
+
const usePageFilter = (
pageName,
gmpName,
@@ -62,8 +63,7 @@ const usePageFilter = (
) => {
const gmp = useGmp();
const dispatch = useDispatch();
- const location = useLocation();
- const navigate = useNavigate();
+ const [searchParams, setSearchParams] = useSearchParams();
const [defaultSettingFilter, defaultSettingsFilterError] =
useDefaultFilter(gmpName);
@@ -80,9 +80,9 @@ const usePageFilter = (
// use null as value for not set at all
let returnedFilter;
- // only use location directly if locationQueryFilterString is undefined
+ // only use searchParams directly if locationQueryFilterString is undefined
const locationQueryFilterString =
- initialLocationQueryFilterString || location?.query?.filter;
+ initialLocationQueryFilterString || searchParams.get('filter');
const [locationQueryFilter, setLocationQueryFilter] = useState(
hasValue(locationQueryFilterString)
@@ -163,15 +163,13 @@ const usePageFilter = (
}, [changeFilter]);
const resetFilter = useCallback(() => {
- const query = {...location.query};
-
- // remove filter param from url
- delete query.filter;
+ const query = new URLSearchParams(searchParams);
+ query.delete('filter');
- navigate({pathname: location.pathname, query});
+ setSearchParams(query);
changeFilter();
- }, [changeFilter, navigate, location]);
+ }, [changeFilter, setSearchParams, searchParams]);
return [
returnedFilter,
diff --git a/src/web/pages/extras/__tests__/cvsscalculatorpage.jsx b/src/web/pages/extras/__tests__/cvsscalculatorpage.jsx
index 78092c03c9..6f9e5b325f 100644
--- a/src/web/pages/extras/__tests__/cvsscalculatorpage.jsx
+++ b/src/web/pages/extras/__tests__/cvsscalculatorpage.jsx
@@ -3,8 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
-import {describe, test, expect, testing} from '@gsa/testing';
+import {describe, test, expect, testing, beforeEach} from '@gsa/testing';
import {fireEvent, rendererWith, waitFor, wait} from 'web/utils/testing';
@@ -37,10 +36,14 @@ const location = {
};
describe('CvssCalculator page tests', () => {
+ beforeEach(() => {
+ window.history.pushState({}, 'Test Title', '/');
+ });
test('Should render with default values', () => {
const {render} = rendererWith({
gmp,
store: true,
+ router: true,
});
const {element, getAllByTestId} = render( );
@@ -75,14 +78,19 @@ describe('CvssCalculator page tests', () => {
});
test('Should render userVector from url', async () => {
+ window.history.pushState(
+ {},
+ 'Test Title',
+ `?cvssVector=AV:N/AC:L/Au:N/C:P/I:P/A:P`,
+ );
+
const {render} = rendererWith({
gmp,
store: true,
+ router: true,
});
- const {element, getAllByTestId} = render(
- ,
- );
+ const {element, getAllByTestId} = render( );
await wait();
@@ -117,6 +125,7 @@ describe('CvssCalculator page tests', () => {
const {render} = rendererWith({
gmp,
store: true,
+ router: true,
});
const {element, getAllByTestId} = render(
@@ -164,14 +173,19 @@ describe('CvssCalculator page tests', () => {
});
test('Changing displayed select values should change userVector', async () => {
+ window.history.pushState(
+ {},
+ 'Test Title',
+ `?cvssVector=AV:N/AC:L/Au:N/C:P/I:P/A:P`,
+ );
+
const {render} = rendererWith({
gmp,
store: true,
+ router: true,
});
- const {element, getAllByTestId} = render(
- ,
- );
+ const {element, getAllByTestId} = render( );
await wait();
diff --git a/src/web/pages/extras/cvssV4/CvssV4Calculator.jsx b/src/web/pages/extras/cvssV4/CvssV4Calculator.jsx
index c75584b8f3..ceea5aa7c1 100644
--- a/src/web/pages/extras/cvssV4/CvssV4Calculator.jsx
+++ b/src/web/pages/extras/cvssV4/CvssV4Calculator.jsx
@@ -24,6 +24,7 @@ import SeverityBar from 'web/components/bar/severitybar';
import styled from 'styled-components';
import TextField from 'web/components/form/textfield';
import MetricsGroups from 'web/pages/extras/cvssV4/MetricsGroups';
+import {useSearchParams} from 'react-router-dom';
const StyledTextField = styled(TextField)`
width: 180px;
@@ -31,7 +32,9 @@ const StyledTextField = styled(TextField)`
const cvssV4Prefix = 'CVSS:4.0/';
-const CvssV4Calculator = ({location}) => {
+const CvssV4Calculator = () => {
+ const [searchParams] = useSearchParams();
+
const initialState = useMemo(() => {
return expectedMetricOptionsOrdered.reduce((obj, item) => {
obj[item[0]] = item[1];
@@ -50,13 +53,14 @@ const CvssV4Calculator = ({location}) => {
const cvssVector = `${cvssV4Prefix}${removeUnusedMetrics(selectedOptions)}`;
useEffect(() => {
- if (location?.query?.cvssVector?.includes(cvssV4Prefix)) {
- const newOptions = processVector(location.query.cvssVector);
+ const cvssVectorParam = searchParams.get('cvssVector');
+ if (cvssVectorParam?.includes(cvssV4Prefix)) {
+ const newOptions = processVector(cvssVectorParam);
setSelectedOptions({...initialState, ...newOptions});
}
// eslint-disable-next-line react-hooks/exhaustive-deps
- }, [location]);
+ }, [searchParams]);
const handleInputCVSSVectorChange = value => {
setInputCVSSVector(value);
diff --git a/src/web/pages/extras/cvssV4/__tests__/cvssV4Calculator.jsx b/src/web/pages/extras/cvssV4/__tests__/cvssV4Calculator.jsx
index ebc129c008..6e9f124c90 100644
--- a/src/web/pages/extras/cvssV4/__tests__/cvssV4Calculator.jsx
+++ b/src/web/pages/extras/cvssV4/__tests__/cvssV4Calculator.jsx
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-import {describe, test, expect} from '@gsa/testing';
+import {describe, test, expect, beforeEach} from '@gsa/testing';
import {fireEvent, rendererWith, wait} from 'web/utils/testing';
import CvssV4Calculator from 'web/pages/extras/cvssV4/CvssV4Calculator';
@@ -12,22 +12,18 @@ const gmp = {};
const baseCVSSVector =
'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:N/SC:N/SI:N/SA:N';
-const location = {
- query: {
- cvssVector: baseCVSSVector,
- },
-};
-
describe('CvssV4Calculator page tests', () => {
+ beforeEach(() => {
+ window.history.pushState({}, 'Test Title', '/');
+ });
test('Should render with default values', async () => {
const {render} = rendererWith({
gmp,
store: true,
+ router: true,
});
- const {getByText, within} = render(
- ,
- );
+ const {getByText, within} = render( );
const cvssVectorEl = getByText('CVSS Base Vector');
const spanElement = within(cvssVectorEl.parentElement).getByText(
@@ -38,24 +34,22 @@ describe('CvssV4Calculator page tests', () => {
});
test('Should render userVector from url', async () => {
- const locationModified = {
- query: {
- cvssVector:
- 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:N/SC:N/SI:N/SA:N/CR:M/MSC:H',
- },
- };
+ const cvssVector =
+ 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:N/SC:N/SI:N/SA:N/CR:M/MSC:H';
+
+ window.history.pushState({}, 'Test Title', `?cvssVector=${cvssVector}`);
+
const {render} = rendererWith({
gmp,
store: true,
+ router: true,
});
- const {getByText, within} = render(
- ,
- );
+ const {getByText, within} = render( );
const cvssVectorEl = getByText('CVSS Base Vector');
const spanElement = within(cvssVectorEl.parentElement).getByText(
- locationModified.query.cvssVector,
+ cvssVector,
);
expect(spanElement).toBeVisible();
@@ -65,10 +59,11 @@ describe('CvssV4Calculator page tests', () => {
const {render} = rendererWith({
gmp,
store: true,
+ router: true,
});
const {getByText, within, element, getAllByTestId} = render(
- ,
+ ,
);
await wait();
@@ -102,10 +97,11 @@ describe('CvssV4Calculator page tests', () => {
const {render} = rendererWith({
gmp,
store: true,
+ router: true,
});
const {element, getAllByTestId, getByText, within} = render(
- ,
+ ,
);
await wait();
diff --git a/src/web/pages/extras/cvsscalculatorpage.jsx b/src/web/pages/extras/cvsscalculatorpage.jsx
index a7e1b16102..a5635ca675 100644
--- a/src/web/pages/extras/cvsscalculatorpage.jsx
+++ b/src/web/pages/extras/cvsscalculatorpage.jsx
@@ -4,7 +4,7 @@
*/
import React, {useState, useEffect} from 'react';
-import PropTypes from 'prop-types';
+import {useSearchParams} from 'react-router-dom';
import styled from 'styled-components';
@@ -54,6 +54,7 @@ const ToolBarIcons = () => (
const CvssV2Calculator = props => {
const [, renewSession] = useUserSessionTimeout();
+ const [searchParams] = useSearchParams();
const [state, setState] = useState({
accessVector: 'Local',
@@ -68,18 +69,15 @@ const CvssV2Calculator = props => {
});
useEffect(() => {
- const {location} = props;
+ const cvssVector = searchParams.get('cvssVector');
if (
- isDefined(location) &&
- isDefined(location.query) &&
- isDefined(location.query.cvssVector)
+ cvssVector &&
+ !cvssVector.includes('CVSS:3') &&
+ !cvssVector.includes('CVSS:4')
) {
- const {cvssVector} = location.query;
- if (!cvssVector.includes('CVSS:3')) {
- setState(vals => ({...vals, cvssVector, userVector: cvssVector}));
- handleVectorChange();
- }
+ setState(vals => ({...vals, cvssVector, userVector: cvssVector}));
+ handleVectorChange();
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
@@ -351,6 +349,7 @@ const CvssV2Calculator = props => {
const CvssV3Calculator = props => {
const [, renewSession] = useUserSessionTimeout();
+ const [searchParams] = useSearchParams();
const [state, setState] = useState({
attackVector: 'Network',
@@ -367,18 +366,11 @@ const CvssV3Calculator = props => {
});
useEffect(() => {
- const {location} = props;
+ const cvssVector = searchParams.get('cvssVector');
- if (
- isDefined(location) &&
- isDefined(location.query) &&
- isDefined(location.query.cvssVector)
- ) {
- const {cvssVector} = location.query;
- if (cvssVector.includes('CVSS:3')) {
- setState(vals => ({...vals, cvssVector, userVector: cvssVector}));
- handleVectorChange();
- }
+ if (cvssVector?.includes('CVSS:3')) {
+ setState(vals => ({...vals, cvssVector, userVector: cvssVector}));
+ handleVectorChange();
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
@@ -706,14 +698,11 @@ const CvssCalculator = props => (
-
+
);
-CvssCalculator.propTypes = {
- location: PropTypes.object.isRequired,
-};
export default CvssCalculator;
// vim: set ts=2 sw=2 tw=80:
diff --git a/src/web/pages/omp.jsx b/src/web/pages/omp.jsx
index 7dfe296a74..eb293b63a2 100644
--- a/src/web/pages/omp.jsx
+++ b/src/web/pages/omp.jsx
@@ -18,8 +18,10 @@ import PropTypes from 'web/utils/proptypes';
*/
class LegacyOmpPage extends React.Component {
componentDidMount() {
- const {location, navigate} = this.props;
- const {cmd, info_type, info_id = ''} = location.query;
+ const {navigate, searchParams} = this.props;
+ const cmd = searchParams.get('cmd');
+ const info_type = searchParams.get('info_type');
+ const info_id = searchParams.get('info_id') || '';
if (cmd !== 'get_info') {
navigate('/notfound', {replace: true});
@@ -57,6 +59,7 @@ class LegacyOmpPage extends React.Component {
LegacyOmpPage.propTypes = {
navigate: PropTypes.object.isRequired,
+ searchParams: PropTypes.object.isRequired,
};
export default withRouter(LegacyOmpPage);
diff --git a/src/web/pages/performance/performancepage.jsx b/src/web/pages/performance/performancepage.jsx
index 7c8edb172e..e0d5e57adf 100644
--- a/src/web/pages/performance/performancepage.jsx
+++ b/src/web/pages/performance/performancepage.jsx
@@ -52,6 +52,7 @@ import {renderSelectItems} from 'web/utils/render';
import {styledExcludeProps} from 'web/utils/styledConfig';
import StartEndTimeSelection from './startendtimeselection';
+import {withRouter} from 'web/utils/withRouter';
const DURATION_HOUR = 60 * 60;
const DURATION_DAY = DURATION_HOUR * 24;
@@ -174,8 +175,10 @@ class PerformancePage extends React.Component {
}
componentDidMount() {
- const {start, end, scanner} = this.props.location.query;
- const {gmp, timezone} = this.props;
+ const {gmp, timezone, searchParams} = this.props;
+ const start = searchParams.get('start');
+ const end = searchParams.get('end');
+ const scanner = searchParams.get('scanner');
gmp.performance.get().then(response => {
this.setState({reports: response.data});
@@ -353,6 +356,7 @@ PerformancePage.propTypes = {
scanners: PropTypes.arrayOf(PropTypes.model),
timezone: PropTypes.string.isRequired,
onInteraction: PropTypes.func.isRequired,
+ searchParams: PropTypes.object,
};
const SENSOR_SCANNER_FILTER = Filter.fromString(
@@ -376,6 +380,7 @@ const mapStateToProps = rootState => {
export default compose(
withGmp,
+ withRouter,
connect(mapStateToProps, mapDispatchToProps),
)(PerformancePage);
diff --git a/src/web/utils/withRouter.jsx b/src/web/utils/withRouter.jsx
index b97f0c0679..fc5d45aa49 100644
--- a/src/web/utils/withRouter.jsx
+++ b/src/web/utils/withRouter.jsx
@@ -3,13 +3,19 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-import {useLocation, useNavigate, useParams} from 'react-router-dom';
+import {
+ useLocation,
+ useNavigate,
+ useParams,
+ useSearchParams,
+} from 'react-router-dom';
export const withRouter = Component => {
function ComponentWithRouterProp(props) {
- let location = useLocation();
- let navigate = useNavigate();
- let params = useParams();
+ const location = useLocation();
+ const navigate = useNavigate();
+ const params = useParams();
+ const [searchParams] = useSearchParams();
return (
{
location={location}
navigate={navigate}
params={params}
+ searchParams={searchParams}
/>
);
}
From 02bcad6c16267eaabe625a7fc78842c47aef4b8d Mon Sep 17 00:00:00 2001
From: daniele-mng
Date: Fri, 13 Sep 2024 12:14:23 +0200
Subject: [PATCH 122/130] Update usePageFilter.jsx
---
src/web/hooks/__tests__/usePageFilter.jsx | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/web/hooks/__tests__/usePageFilter.jsx b/src/web/hooks/__tests__/usePageFilter.jsx
index e6d868a545..3f817ec015 100644
--- a/src/web/hooks/__tests__/usePageFilter.jsx
+++ b/src/web/hooks/__tests__/usePageFilter.jsx
@@ -74,7 +74,11 @@ describe('usePageFilter tests', () => {
},
};
- const {renderHook, store} = rendererWith({store: true, gmp});
+ const {renderHook, store} = rendererWith({
+ store: true,
+ gmp,
+ router: true,
+ });
store.dispatch(loadingActions.success({rowsperpage: {value: '42'}}));
store.dispatch(
From b9354393a754fd3049bc5a24387808caadce53f4 Mon Sep 17 00:00:00 2001
From: daniele-mng
Date: Fri, 13 Sep 2024 14:35:08 +0200
Subject: [PATCH 123/130] fix: /omp page
---
src/web/pages/omp.jsx | 29 +++++++++++------------------
1 file changed, 11 insertions(+), 18 deletions(-)
diff --git a/src/web/pages/omp.jsx b/src/web/pages/omp.jsx
index eb293b63a2..6cbce3769b 100644
--- a/src/web/pages/omp.jsx
+++ b/src/web/pages/omp.jsx
@@ -3,11 +3,8 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-import React from 'react';
-
-import {withRouter} from 'web/utils/withRouter';
-
-import PropTypes from 'web/utils/proptypes';
+import {useNavigate, useSearchParams} from 'react-router-dom';
+import {useEffect} from 'react';
/**
* Component to redirect old secinfo urls like
@@ -16,9 +13,12 @@ import PropTypes from 'web/utils/proptypes';
*
* to the current replacement pages
*/
-class LegacyOmpPage extends React.Component {
- componentDidMount() {
- const {navigate, searchParams} = this.props;
+
+const OmpComponent = () => {
+ const navigate = useNavigate();
+ const [searchParams] = useSearchParams();
+
+ useEffect(() => {
const cmd = searchParams.get('cmd');
const info_type = searchParams.get('info_type');
const info_id = searchParams.get('info_id') || '';
@@ -50,16 +50,9 @@ class LegacyOmpPage extends React.Component {
navigate('/notfound', {replace: true});
break;
}
- }
-
- render() {
- return null;
- }
-}
+ }, [navigate, searchParams]);
-LegacyOmpPage.propTypes = {
- navigate: PropTypes.object.isRequired,
- searchParams: PropTypes.object.isRequired,
+ return null;
};
-export default withRouter(LegacyOmpPage);
+export default OmpComponent;
From b10b5255bf7ed1896931b49865e1c52ab8fe1df5 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 17 Sep 2024 19:30:14 +0000
Subject: [PATCH 124/130] Bump vite from 5.4.3 to 5.4.6
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.3 to 5.4.6.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.6/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.6/packages/vite)
---
updated-dependencies:
- dependency-name: vite
dependency-type: direct:development
...
Signed-off-by: dependabot[bot]
---
package-lock.json | 8 ++++----
package.json | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index b1c40d5907..ea3092325a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -76,7 +76,7 @@
"lint-staged": "^13.1.0",
"prettier": "^3.3.3",
"typescript": "^5.5.4",
- "vite": "^5.4.3",
+ "vite": "^5.4.6",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-eslint2": "^4.4.0",
"vite-plugin-svgr": "^4.2.0",
@@ -11166,9 +11166,9 @@
}
},
"node_modules/vite": {
- "version": "5.4.3",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.3.tgz",
- "integrity": "sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==",
+ "version": "5.4.6",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.6.tgz",
+ "integrity": "sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==",
"dev": true,
"dependencies": {
"esbuild": "^0.21.3",
diff --git a/package.json b/package.json
index d2ab577c31..1fcb412d1d 100644
--- a/package.json
+++ b/package.json
@@ -99,7 +99,7 @@
"lint-staged": "^13.1.0",
"prettier": "^3.3.3",
"typescript": "^5.5.4",
- "vite": "^5.4.3",
+ "vite": "^5.4.6",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-eslint2": "^4.4.0",
"vite-plugin-svgr": "^4.2.0",
From 28cac79d21644d26672427425f1ae24b753d3dda Mon Sep 17 00:00:00 2001
From: daniele-mng
Date: Mon, 9 Sep 2024 11:17:42 +0200
Subject: [PATCH 125/130] change: update from main
---
allowedSnakeCase.cjs | 3 +
package-lock.json | 1724 +++++++++--------
package.json | 34 +-
public/locales/gsa-de.json | 9 +
src/gmp/capabilities/capabilities.js | 15 +-
src/gmp/commands/__tests__/auditreport.js | 33 +
src/gmp/commands/__tests__/auditreports.js | 92 +
src/gmp/commands/__tests__/reports.js | 2 +
src/gmp/commands/auditreports.js | 139 ++
src/gmp/commands/reports.js | 1 +
src/gmp/commands/users.js | 2 +
src/gmp/gmp.js | 1 +
src/gmp/models/auditreport.js | 65 +
src/gmp/models/filter.js | 2 +
src/gmp/models/filter/keywords.js | 2 +
src/gmp/models/report/auditreport.js | 140 ++
src/gmp/models/report/host.js | 39 +-
src/gmp/models/report/os.js | 26 +
src/gmp/models/report/parser.js | 13 +-
src/gmp/models/result.js | 5 +
src/gmp/utils/entitytype.js | 5 +
src/version.js | 2 +-
src/web/components/bar/compliancebar.jsx | 44 +
.../components/bar/compliancestatusbar.jsx | 3 +-
.../dashboard/display/createDisplay.jsx | 9 +-
.../components/dashboard/display/utils.jsx | 6 +
src/web/components/dialog/content.jsx | 1 +
src/web/components/icon/downloadicon.jsx | 1 +
src/web/components/icon/exporticon.jsx | 1 +
src/web/components/label/compliancestate.jsx | 55 +
src/web/components/menu/menu.jsx | 14 +-
.../__tests__/compliancelevelsgroup.jsx | 239 +++
.../powerfilter/compliancelevelsgroup.jsx | 105 +
.../powerfilter/filterstringgroup.jsx | 1 +
.../components/powerfilter/sortbygroup.jsx | 1 +
.../powerfilter/ticketstatusgroup.jsx | 1 +
src/web/components/structure/footer.jsx | 1 +
src/web/entities/container.jsx | 1 +
src/web/pages/alerts/scpmethodpart.jsx | 2 +-
src/web/pages/audits/__tests__/row.jsx | 106 +-
src/web/pages/audits/__tests__/table.jsx | 2 +-
src/web/pages/audits/row.jsx | 30 +-
src/web/pages/audits/table.jsx | 4 +-
src/web/pages/filters/component.jsx | 9 +-
src/web/pages/ldap/dialog.jsx | 1 +
src/web/pages/notes/dialog.jsx | 1 +
src/web/pages/overrides/dialog.jsx | 1 +
src/web/pages/policies/__tests__/listpage.jsx | 2 +-
src/web/pages/policies/dialog.jsx | 1 +
src/web/pages/policies/table.jsx | 2 +-
src/web/pages/radius/dialog.jsx | 1 +
.../__mocks__/mockauditdeltareport.jsx | 388 ++++
.../reports/__mocks__/mockauditreport.jsx | 370 ++++
.../__tests__/auditdeltadetailspage.jsx | 377 ++++
.../reports/__tests__/auditdetailscontent.jsx | 394 ++++
.../reports/__tests__/auditfilterdialog.jsx | 66 +
.../reports/__tests__/auditreportrow.jsx | 54 +
.../__tests__/auditreportslistpage.jsx | 267 +++
.../reports/__tests__/detailsfilterdialog.jsx | 119 ++
.../pages/reports/auditdashboard/index.jsx | 36 +
.../pages/reports/auditdashboard/loaders.jsx | 30 +
.../reports/auditdashboard/statusdisplay.jsx | 89 +
.../pages/reports/auditdeltadetailspage.jsx | 565 ++++++
src/web/pages/reports/auditdetailscontent.jsx | 448 +++++
src/web/pages/reports/auditdetailspage.jsx | 705 +++++++
src/web/pages/reports/auditfilterdialog.jsx | 134 ++
src/web/pages/reports/auditreportrow.jsx | 147 ++
.../pages/reports/auditreportslistpage.jsx | 169 ++
src/web/pages/reports/auditreportstable.jsx | 130 ++
src/web/pages/reports/deltadetailscontent.jsx | 20 +-
src/web/pages/reports/deltadetailspage.jsx | 17 -
.../reports/details/__tests__/hoststab.jsx | 105 +
.../details/__tests__/operatingsystemstab.jsx | 83 +
.../reports/details/__tests__/resultstab.jsx | 369 ++++
.../reports/details/auditthresholdpanel.jsx | 150 ++
.../pages/reports/details/deltaresultstab.jsx | 4 +
.../reports/details/emptyresultsreport.jsx | 8 +-
src/web/pages/reports/details/hoststab.jsx | 10 +
src/web/pages/reports/details/hoststable.jsx | 226 ++-
.../reports/details/operatingsystemstab.jsx | 4 +
.../reports/details/operatingsystemstable.jsx | 55 +-
src/web/pages/reports/details/resultstab.jsx | 115 +-
.../pages/reports/details/toolbaricons.jsx | 24 +-
src/web/pages/reports/detailsfilterdialog.jsx | 53 +-
src/web/pages/results/__tests__/row.jsx | 144 ++
src/web/pages/results/row.jsx | 38 +-
src/web/pages/results/table.jsx | 32 +-
src/web/pages/roles/dialog.jsx | 1 +
src/web/pages/scanconfigs/dialog.jsx | 1 +
.../scanconfigs/editconfigfamilydialog.jsx | 1 +
src/web/pages/scanconfigs/editdialog.jsx | 1 +
src/web/pages/scanconfigs/nvtfamilies.jsx | 1 +
src/web/pages/start/dashboard.jsx | 19 +-
src/web/pages/tags/component.jsx | 10 +-
src/web/pages/tags/dialog.jsx | 1 +
src/web/pages/tasks/status.jsx | 15 +-
src/web/pages/users/confirmdeletedialog.jsx | 1 +
src/web/pages/usersettings/defaultspart.jsx | 1 +
src/web/pages/usersettings/dialog.jsx | 4 +
src/web/pages/usersettings/filterpart.jsx | 17 +
.../pages/usersettings/usersettingspage.jsx | 18 +
src/web/routes.jsx | 16 +
src/web/store/entities/__tests__/reducers.js | 2 +
src/web/store/entities/auditreports.js | 62 +
src/web/store/entities/reducers.js | 6 +
.../entities/report/__tests__/actions.js | 941 ++++++++-
src/web/store/entities/report/actions.js | 138 +-
src/web/store/entities/report/reducers.js | 2 +-
src/web/store/entities/report/selectors.js | 6 +
src/web/store/entities/reports/reducers.js | 2 +-
src/web/utils/theme.jsx | 5 +
111 files changed, 9176 insertions(+), 1039 deletions(-)
create mode 100644 src/gmp/commands/__tests__/auditreport.js
create mode 100644 src/gmp/commands/__tests__/auditreports.js
create mode 100644 src/gmp/commands/auditreports.js
create mode 100644 src/gmp/models/auditreport.js
create mode 100644 src/gmp/models/report/auditreport.js
create mode 100644 src/web/components/bar/compliancebar.jsx
create mode 100644 src/web/components/label/compliancestate.jsx
create mode 100644 src/web/components/powerfilter/__tests__/compliancelevelsgroup.jsx
create mode 100644 src/web/components/powerfilter/compliancelevelsgroup.jsx
create mode 100644 src/web/pages/reports/__mocks__/mockauditdeltareport.jsx
create mode 100644 src/web/pages/reports/__mocks__/mockauditreport.jsx
create mode 100644 src/web/pages/reports/__tests__/auditdeltadetailspage.jsx
create mode 100644 src/web/pages/reports/__tests__/auditdetailscontent.jsx
create mode 100644 src/web/pages/reports/__tests__/auditfilterdialog.jsx
create mode 100644 src/web/pages/reports/__tests__/auditreportrow.jsx
create mode 100644 src/web/pages/reports/__tests__/auditreportslistpage.jsx
create mode 100644 src/web/pages/reports/__tests__/detailsfilterdialog.jsx
create mode 100644 src/web/pages/reports/auditdashboard/index.jsx
create mode 100644 src/web/pages/reports/auditdashboard/loaders.jsx
create mode 100644 src/web/pages/reports/auditdashboard/statusdisplay.jsx
create mode 100644 src/web/pages/reports/auditdeltadetailspage.jsx
create mode 100644 src/web/pages/reports/auditdetailscontent.jsx
create mode 100644 src/web/pages/reports/auditdetailspage.jsx
create mode 100644 src/web/pages/reports/auditfilterdialog.jsx
create mode 100644 src/web/pages/reports/auditreportrow.jsx
create mode 100644 src/web/pages/reports/auditreportslistpage.jsx
create mode 100644 src/web/pages/reports/auditreportstable.jsx
create mode 100644 src/web/pages/reports/details/__tests__/resultstab.jsx
create mode 100644 src/web/pages/reports/details/auditthresholdpanel.jsx
create mode 100644 src/web/store/entities/auditreports.js
diff --git a/allowedSnakeCase.cjs b/allowedSnakeCase.cjs
index c23947595c..82ad5b6831 100644
--- a/allowedSnakeCase.cjs
+++ b/allowedSnakeCase.cjs
@@ -29,6 +29,8 @@ module.exports = [
'_asset_id',
'asset_id',
'assigned_to',
+ 'audit_report',
+ 'audit_reports',
'auth_algorithm',
'auth_conf_setting',
'auth_method',
@@ -248,6 +250,7 @@ module.exports = [
'highest_severity',
'high_per_host',
'host_allow',
+ 'host_compliance',
'host_cves',
'hostnames_by_ip',
'hosts_allow',
diff --git a/package-lock.json b/package-lock.json
index 595e1ce57a..7759bfa41e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,18 +1,18 @@
{
"name": "gsa",
- "version": "23.2.2-dev1",
+ "version": "23.3.1-dev1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "gsa",
- "version": "23.2.2-dev1",
+ "version": "23.3.1-dev1",
"license": "AGPL-3.0+",
"dependencies": {
"@greenbone/opensight-ui-components": "^0.3.0",
"@mantine/core": "^6.0.0",
"@reduxjs/toolkit": "^2.2.7",
- "@sentry/react": "^8.22.0",
+ "@sentry/react": "^8.28.0",
"@visx/axis": "^3.10.1",
"@visx/gradient": "^3.3.0",
"@visx/shape": "^3.5.0",
@@ -26,13 +26,13 @@
"d3-interpolate": "^3.0.1",
"d3-scale": "^4.0.2",
"d3-shape": "^3.2.0",
- "downshift": "^9.0.7",
+ "downshift": "^9.0.8",
"fast-deep-equal": "^3.1.3",
"fast-xml-parser": "^4.4.1",
"history": "^4.10.1",
"hoist-non-react-statics": "^3.3.2",
- "i18next": "^23.12.2",
- "i18next-http-backend": "^2.5.2",
+ "i18next": "^23.14.0",
+ "i18next-http-backend": "^2.6.1",
"ical.js": "^2.0.0",
"lucide-react": "^0.439.0",
"memoize-one": "^6.0.0",
@@ -40,7 +40,7 @@
"moment-timezone": "^0.5.45",
"prop-types": "^15.8.1",
"qhistory": "^1.1.0",
- "qs": "^6.12.3",
+ "qs": "^6.13.0",
"react": "^18.3.1",
"react-beautiful-dnd": "^13.1.1",
"react-dom": "^18.3.1",
@@ -50,21 +50,21 @@
"redux": "^5.0.1",
"redux-logger": "^3.0.6",
"resize-observer-polyfill": "^1.5.1",
- "styled-components": "^6.1.12",
+ "styled-components": "^6.1.13",
"uuid": "^10.0.0",
"whatwg-fetch": "^3.6.20"
},
"devDependencies": {
- "@babel/cli": "^7.24.8",
+ "@babel/cli": "^7.25.6",
"@pandatix/js-cvss": "^0.4.4",
- "@testing-library/jest-dom": "^6.4.8",
- "@testing-library/react": "^16.0.0",
+ "@testing-library/jest-dom": "^6.5.0",
+ "@testing-library/react": "^16.0.1",
"@testing-library/user-event": "^14.5.2",
- "@types/react": "^18.3.3",
+ "@types/react": "^18.3.5",
"@types/react-dom": "^18.3.0",
- "@typescript-eslint/eslint-plugin": "^8.0.0",
+ "@typescript-eslint/eslint-plugin": "^8.4.0",
"@typescript-eslint/parser": "^8.0.0",
- "@vitejs/plugin-legacy": "^5.4.1",
+ "@vitejs/plugin-legacy": "^5.4.2",
"@vitejs/plugin-react": "^4.3.1",
"@vitest/coverage-v8": "^2.0.5",
"@vitest/ui": "^2.0.5",
@@ -72,18 +72,18 @@
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-header": "^3.1.1",
- "eslint-plugin-react": "^7.35.0",
+ "eslint-plugin-react": "^7.35.2",
"eslint-plugin-react-hooks": "^4.6.2",
- "eslint-plugin-react-refresh": "^0.4.9",
+ "eslint-plugin-react-refresh": "^0.4.11",
"eslint-plugin-vitest": "^0.5.4",
"eslint-plugin-vitest-globals": "^1.5.0",
"husky": "^2.7.0",
"jest-styled-components": "^7.2.0",
- "jsdom": "^24.1.1",
+ "jsdom": "^25.0.0",
"lint-staged": "^13.1.0",
"prettier": "^3.3.3",
"typescript": "^5.5.4",
- "vite": "^5.3.5",
+ "vite": "^5.4.3",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-eslint2": "^4.4.0",
"vite-plugin-svgr": "^4.2.0",
@@ -121,9 +121,9 @@
}
},
"node_modules/@babel/cli": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.24.8.tgz",
- "integrity": "sha512-isdp+G6DpRyKc+3Gqxy2rjzgF7Zj9K0mzLNnxz+E/fgeag8qT3vVulX4gY9dGO1q0y+0lUv6V3a+uhUzMzrwXg==",
+ "version": "7.25.6",
+ "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.25.6.tgz",
+ "integrity": "sha512-Z+Doemr4VtvSD2SNHTrkiFZ1LX+JI6tyRXAAOb4N9khIuPyoEPmTPJarPm8ljJV1D6bnMQjyHMWTT9NeKbQuXA==",
"dev": true,
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.25",
@@ -143,7 +143,7 @@
},
"optionalDependencies": {
"@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3",
- "chokidar": "^3.4.0"
+ "chokidar": "^3.6.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
@@ -168,11 +168,11 @@
}
},
"node_modules/@babel/code-frame": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.6.tgz",
- "integrity": "sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
+ "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
"dependencies": {
- "@babel/highlight": "^7.24.6",
+ "@babel/highlight": "^7.24.7",
"picocolors": "^1.0.0"
},
"engines": {
@@ -180,28 +180,28 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.6.tgz",
- "integrity": "sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==",
+ "version": "7.25.4",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz",
+ "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.6.tgz",
- "integrity": "sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==",
+ "version": "7.25.2",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz",
+ "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==",
"dependencies": {
"@ampproject/remapping": "^2.2.0",
- "@babel/code-frame": "^7.24.6",
- "@babel/generator": "^7.24.6",
- "@babel/helper-compilation-targets": "^7.24.6",
- "@babel/helper-module-transforms": "^7.24.6",
- "@babel/helpers": "^7.24.6",
- "@babel/parser": "^7.24.6",
- "@babel/template": "^7.24.6",
- "@babel/traverse": "^7.24.6",
- "@babel/types": "^7.24.6",
+ "@babel/code-frame": "^7.24.7",
+ "@babel/generator": "^7.25.0",
+ "@babel/helper-compilation-targets": "^7.25.2",
+ "@babel/helper-module-transforms": "^7.25.2",
+ "@babel/helpers": "^7.25.0",
+ "@babel/parser": "^7.25.0",
+ "@babel/template": "^7.25.0",
+ "@babel/traverse": "^7.25.2",
+ "@babel/types": "^7.25.2",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -225,11 +225,11 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.6.tgz",
- "integrity": "sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==",
+ "version": "7.25.6",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz",
+ "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==",
"dependencies": {
- "@babel/types": "^7.24.6",
+ "@babel/types": "^7.25.6",
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25",
"jsesc": "^2.5.1"
@@ -239,35 +239,36 @@
}
},
"node_modules/@babel/helper-annotate-as-pure": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.6.tgz",
- "integrity": "sha512-DitEzDfOMnd13kZnDqns1ccmftwJTS9DMkyn9pYTxulS7bZxUxpMly3Nf23QQ6NwA4UB8lAqjbqWtyvElEMAkg==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz",
+ "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==",
"dependencies": {
- "@babel/types": "^7.24.6"
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.6.tgz",
- "integrity": "sha512-+wnfqc5uHiMYtvRX7qu80Toef8BXeh4HHR1SPeonGb1SKPniNEd4a/nlaJJMv/OIEYvIVavvo0yR7u10Gqz0Iw==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz",
+ "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==",
"dependencies": {
- "@babel/types": "^7.24.6"
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-compilation-targets": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz",
- "integrity": "sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==",
+ "version": "7.25.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz",
+ "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==",
"dependencies": {
- "@babel/compat-data": "^7.24.6",
- "@babel/helper-validator-option": "^7.24.6",
- "browserslist": "^4.22.2",
+ "@babel/compat-data": "^7.25.2",
+ "@babel/helper-validator-option": "^7.24.8",
+ "browserslist": "^4.23.1",
"lru-cache": "^5.1.1",
"semver": "^6.3.1"
},
@@ -284,18 +285,16 @@
}
},
"node_modules/@babel/helper-create-class-features-plugin": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.6.tgz",
- "integrity": "sha512-djsosdPJVZE6Vsw3kk7IPRWethP94WHGOhQTc67SNXE0ZzMhHgALw8iGmYS0TD1bbMM0VDROy43od7/hN6WYcA==",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.24.6",
- "@babel/helper-environment-visitor": "^7.24.6",
- "@babel/helper-function-name": "^7.24.6",
- "@babel/helper-member-expression-to-functions": "^7.24.6",
- "@babel/helper-optimise-call-expression": "^7.24.6",
- "@babel/helper-replace-supers": "^7.24.6",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6",
- "@babel/helper-split-export-declaration": "^7.24.6",
+ "version": "7.25.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz",
+ "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.24.7",
+ "@babel/helper-member-expression-to-functions": "^7.24.8",
+ "@babel/helper-optimise-call-expression": "^7.24.7",
+ "@babel/helper-replace-supers": "^7.25.0",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+ "@babel/traverse": "^7.25.4",
"semver": "^6.3.1"
},
"engines": {
@@ -314,11 +313,11 @@
}
},
"node_modules/@babel/helper-create-regexp-features-plugin": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.6.tgz",
- "integrity": "sha512-C875lFBIWWwyv6MHZUG9HmRrlTDgOsLWZfYR0nW69gaKJNe0/Mpxx5r0EID2ZdHQkdUmQo2t0uNckTL08/1BgA==",
+ "version": "7.25.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz",
+ "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.24.6",
+ "@babel/helper-annotate-as-pure": "^7.24.7",
"regexpu-core": "^5.3.1",
"semver": "^6.3.1"
},
@@ -338,9 +337,9 @@
}
},
"node_modules/@babel/helper-define-polyfill-provider": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz",
- "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==",
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz",
+ "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==",
"dependencies": {
"@babel/helper-compilation-targets": "^7.22.6",
"@babel/helper-plugin-utils": "^7.22.5",
@@ -352,69 +351,39 @@
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
}
},
- "node_modules/@babel/helper-environment-visitor": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz",
- "integrity": "sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-function-name": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz",
- "integrity": "sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==",
- "dependencies": {
- "@babel/template": "^7.24.6",
- "@babel/types": "^7.24.6"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-hoist-variables": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz",
- "integrity": "sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==",
- "dependencies": {
- "@babel/types": "^7.24.6"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
"node_modules/@babel/helper-member-expression-to-functions": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.6.tgz",
- "integrity": "sha512-OTsCufZTxDUsv2/eDXanw/mUZHWOxSbEmC3pP8cgjcy5rgeVPWWMStnv274DV60JtHxTk0adT0QrCzC4M9NWGg==",
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz",
+ "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==",
"dependencies": {
- "@babel/types": "^7.24.6"
+ "@babel/traverse": "^7.24.8",
+ "@babel/types": "^7.24.8"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-imports": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz",
- "integrity": "sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz",
+ "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==",
"dependencies": {
- "@babel/types": "^7.24.6"
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-transforms": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz",
- "integrity": "sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==",
+ "version": "7.25.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz",
+ "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==",
"dependencies": {
- "@babel/helper-environment-visitor": "^7.24.6",
- "@babel/helper-module-imports": "^7.24.6",
- "@babel/helper-simple-access": "^7.24.6",
- "@babel/helper-split-export-declaration": "^7.24.6",
- "@babel/helper-validator-identifier": "^7.24.6"
+ "@babel/helper-module-imports": "^7.24.7",
+ "@babel/helper-simple-access": "^7.24.7",
+ "@babel/helper-validator-identifier": "^7.24.7",
+ "@babel/traverse": "^7.25.2"
},
"engines": {
"node": ">=6.9.0"
@@ -424,32 +393,32 @@
}
},
"node_modules/@babel/helper-optimise-call-expression": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.6.tgz",
- "integrity": "sha512-3SFDJRbx7KuPRl8XDUr8O7GAEB8iGyWPjLKJh/ywP/Iy9WOmEfMrsWbaZpvBu2HSYn4KQygIsz0O7m8y10ncMA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz",
+ "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==",
"dependencies": {
- "@babel/types": "^7.24.6"
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-plugin-utils": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz",
- "integrity": "sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==",
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz",
+ "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-remap-async-to-generator": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.6.tgz",
- "integrity": "sha512-1Qursq9ArRZPAMOZf/nuzVW8HgJLkTB9y9LfP4lW2MVp4e9WkLJDovfKBxoDcCk6VuzIxyqWHyBoaCtSRP10yg==",
+ "version": "7.25.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz",
+ "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.24.6",
- "@babel/helper-environment-visitor": "^7.24.6",
- "@babel/helper-wrap-function": "^7.24.6"
+ "@babel/helper-annotate-as-pure": "^7.24.7",
+ "@babel/helper-wrap-function": "^7.25.0",
+ "@babel/traverse": "^7.25.0"
},
"engines": {
"node": ">=6.9.0"
@@ -459,13 +428,13 @@
}
},
"node_modules/@babel/helper-replace-supers": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.6.tgz",
- "integrity": "sha512-mRhfPwDqDpba8o1F8ESxsEkJMQkUF8ZIWrAc0FtWhxnjfextxMWxr22RtFizxxSYLjVHDeMgVsRq8BBZR2ikJQ==",
+ "version": "7.25.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz",
+ "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==",
"dependencies": {
- "@babel/helper-environment-visitor": "^7.24.6",
- "@babel/helper-member-expression-to-functions": "^7.24.6",
- "@babel/helper-optimise-call-expression": "^7.24.6"
+ "@babel/helper-member-expression-to-functions": "^7.24.8",
+ "@babel/helper-optimise-call-expression": "^7.24.7",
+ "@babel/traverse": "^7.25.0"
},
"engines": {
"node": ">=6.9.0"
@@ -475,93 +444,84 @@
}
},
"node_modules/@babel/helper-simple-access": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz",
- "integrity": "sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz",
+ "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==",
"dependencies": {
- "@babel/types": "^7.24.6"
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-skip-transparent-expression-wrappers": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.6.tgz",
- "integrity": "sha512-jhbbkK3IUKc4T43WadP96a27oYti9gEf1LdyGSP2rHGH77kwLwfhO7TgwnWvxxQVmke0ImmCSS47vcuxEMGD3Q==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz",
+ "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==",
"dependencies": {
- "@babel/types": "^7.24.6"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-split-export-declaration": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz",
- "integrity": "sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==",
- "dependencies": {
- "@babel/types": "^7.24.6"
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-string-parser": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz",
- "integrity": "sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==",
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz",
+ "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz",
- "integrity": "sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
+ "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-option": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz",
- "integrity": "sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==",
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz",
+ "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-wrap-function": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.6.tgz",
- "integrity": "sha512-f1JLrlw/jbiNfxvdrfBgio/gRBk3yTAEJWirpAkiJG2Hb22E7cEYKHWo0dFPTv/niPovzIdPdEDetrv6tC6gPQ==",
+ "version": "7.25.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz",
+ "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==",
"dependencies": {
- "@babel/helper-function-name": "^7.24.6",
- "@babel/template": "^7.24.6",
- "@babel/types": "^7.24.6"
+ "@babel/template": "^7.25.0",
+ "@babel/traverse": "^7.25.0",
+ "@babel/types": "^7.25.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helpers": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.6.tgz",
- "integrity": "sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==",
+ "version": "7.25.6",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz",
+ "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==",
"dependencies": {
- "@babel/template": "^7.24.6",
- "@babel/types": "^7.24.6"
+ "@babel/template": "^7.25.0",
+ "@babel/types": "^7.25.6"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/highlight": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.6.tgz",
- "integrity": "sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
+ "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
"dependencies": {
- "@babel/helper-validator-identifier": "^7.24.6",
+ "@babel/helper-validator-identifier": "^7.24.7",
"chalk": "^2.4.2",
"js-tokens": "^4.0.0",
"picocolors": "^1.0.0"
@@ -635,9 +595,12 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.6.tgz",
- "integrity": "sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==",
+ "version": "7.25.6",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz",
+ "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==",
+ "dependencies": {
+ "@babel/types": "^7.25.6"
+ },
"bin": {
"parser": "bin/babel-parser.js"
},
@@ -646,12 +609,26 @@
}
},
"node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.6.tgz",
- "integrity": "sha512-bYndrJ6Ph6Ar+GaB5VAc0JPoP80bQCm4qon6JEzXfRl5QZyQ8Ur1K6k7htxWmPA5z+k7JQvaMUrtXlqclWYzKw==",
+ "version": "7.25.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz",
+ "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==",
"dependencies": {
- "@babel/helper-environment-visitor": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.8",
+ "@babel/traverse": "^7.25.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
+ "version": "7.25.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz",
+ "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.8"
},
"engines": {
"node": ">=6.9.0"
@@ -661,11 +638,11 @@
}
},
"node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.6.tgz",
- "integrity": "sha512-iVuhb6poq5ikqRq2XWU6OQ+R5o9wF+r/or9CeUyovgptz0UlnK4/seOQ1Istu/XybYjAhQv1FRSSfHHufIku5Q==",
+ "version": "7.25.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz",
+ "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.8"
},
"engines": {
"node": ">=6.9.0"
@@ -675,13 +652,13 @@
}
},
"node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.6.tgz",
- "integrity": "sha512-c8TER5xMDYzzFcGqOEp9l4hvB7dcbhcGjcLVwxWfe4P5DOafdwjsBJZKsmv+o3aXh7NhopvayQIovHrh2zSRUQ==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz",
+ "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6",
- "@babel/plugin-transform-optional-chaining": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+ "@babel/plugin-transform-optional-chaining": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -691,12 +668,12 @@
}
},
"node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.6.tgz",
- "integrity": "sha512-z8zEjYmwBUHN/pCF3NuWBhHQjJCrd33qAi8MgANfMrAvn72k2cImT8VjK9LJFu4ysOLJqhfkYYb3MvwANRUNZQ==",
+ "version": "7.25.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz",
+ "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==",
"dependencies": {
- "@babel/helper-environment-visitor": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.8",
+ "@babel/traverse": "^7.25.0"
},
"engines": {
"node": ">=6.9.0"
@@ -900,11 +877,11 @@
}
},
"node_modules/@babel/plugin-syntax-import-assertions": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.6.tgz",
- "integrity": "sha512-BE6o2BogJKJImTmGpkmOic4V0hlRRxVtzqxiSPa8TIFxyhi4EFjHm08nq1M4STK4RytuLMgnSz0/wfflvGFNOg==",
+ "version": "7.25.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz",
+ "integrity": "sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.8"
},
"engines": {
"node": ">=6.9.0"
@@ -914,11 +891,11 @@
}
},
"node_modules/@babel/plugin-syntax-import-attributes": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.6.tgz",
- "integrity": "sha512-D+CfsVZousPXIdudSII7RGy52+dYRtbyKAZcvtQKq/NpsivyMVduepzcLqG5pMBugtMdedxdC8Ramdpcne9ZWQ==",
+ "version": "7.25.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz",
+ "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.8"
},
"engines": {
"node": ">=6.9.0"
@@ -1087,11 +1064,11 @@
}
},
"node_modules/@babel/plugin-transform-arrow-functions": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.6.tgz",
- "integrity": "sha512-jSSSDt4ZidNMggcLx8SaKsbGNEfIl0PHx/4mFEulorE7bpYLbN0d3pDW3eJ7Y5Z3yPhy3L3NaPCYyTUY7TuugQ==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz",
+ "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1101,14 +1078,14 @@
}
},
"node_modules/@babel/plugin-transform-async-generator-functions": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.6.tgz",
- "integrity": "sha512-VEP2o4iR2DqQU6KPgizTW2mnMx6BG5b5O9iQdrW9HesLkv8GIA8x2daXBQxw1MrsIkFQGA/iJ204CKoQ8UcnAA==",
+ "version": "7.25.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz",
+ "integrity": "sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==",
"dependencies": {
- "@babel/helper-environment-visitor": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6",
- "@babel/helper-remap-async-to-generator": "^7.24.6",
- "@babel/plugin-syntax-async-generators": "^7.8.4"
+ "@babel/helper-plugin-utils": "^7.24.8",
+ "@babel/helper-remap-async-to-generator": "^7.25.0",
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/traverse": "^7.25.4"
},
"engines": {
"node": ">=6.9.0"
@@ -1118,13 +1095,13 @@
}
},
"node_modules/@babel/plugin-transform-async-to-generator": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.6.tgz",
- "integrity": "sha512-NTBA2SioI3OsHeIn6sQmhvXleSl9T70YY/hostQLveWs0ic+qvbA3fa0kwAwQ0OA/XGaAerNZRQGJyRfhbJK4g==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz",
+ "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==",
"dependencies": {
- "@babel/helper-module-imports": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6",
- "@babel/helper-remap-async-to-generator": "^7.24.6"
+ "@babel/helper-module-imports": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-remap-async-to-generator": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1134,11 +1111,11 @@
}
},
"node_modules/@babel/plugin-transform-block-scoped-functions": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.6.tgz",
- "integrity": "sha512-XNW7jolYHW9CwORrZgA/97tL/k05qe/HL0z/qqJq1mdWhwwCM6D4BJBV7wAz9HgFziN5dTOG31znkVIzwxv+vw==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz",
+ "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1148,11 +1125,11 @@
}
},
"node_modules/@babel/plugin-transform-block-scoping": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.6.tgz",
- "integrity": "sha512-S/t1Xh4ehW7sGA7c1j/hiOBLnEYCp/c2sEG4ZkL8kI1xX9tW2pqJTCHKtdhe/jHKt8nG0pFCrDHUXd4DvjHS9w==",
+ "version": "7.25.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz",
+ "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.8"
},
"engines": {
"node": ">=6.9.0"
@@ -1162,12 +1139,12 @@
}
},
"node_modules/@babel/plugin-transform-class-properties": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.6.tgz",
- "integrity": "sha512-j6dZ0Z2Z2slWLR3kt9aOmSIrBvnntWjMDN/TVcMPxhXMLmJVqX605CBRlcGI4b32GMbfifTEsdEjGjiE+j/c3A==",
+ "version": "7.25.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz",
+ "integrity": "sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==",
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-create-class-features-plugin": "^7.25.4",
+ "@babel/helper-plugin-utils": "^7.24.8"
},
"engines": {
"node": ">=6.9.0"
@@ -1177,12 +1154,12 @@
}
},
"node_modules/@babel/plugin-transform-class-static-block": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.6.tgz",
- "integrity": "sha512-1QSRfoPI9RoLRa8Mnakc6v3e0gJxiZQTYrMfLn+mD0sz5+ndSzwymp2hDcYJTyT0MOn0yuWzj8phlIvO72gTHA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz",
+ "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==",
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6",
+ "@babel/helper-create-class-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-class-static-block": "^7.14.5"
},
"engines": {
@@ -1193,17 +1170,15 @@
}
},
"node_modules/@babel/plugin-transform-classes": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.6.tgz",
- "integrity": "sha512-+fN+NO2gh8JtRmDSOB6gaCVo36ha8kfCW1nMq2Gc0DABln0VcHN4PrALDvF5/diLzIRKptC7z/d7Lp64zk92Fg==",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.24.6",
- "@babel/helper-compilation-targets": "^7.24.6",
- "@babel/helper-environment-visitor": "^7.24.6",
- "@babel/helper-function-name": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6",
- "@babel/helper-replace-supers": "^7.24.6",
- "@babel/helper-split-export-declaration": "^7.24.6",
+ "version": "7.25.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz",
+ "integrity": "sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.24.7",
+ "@babel/helper-compilation-targets": "^7.25.2",
+ "@babel/helper-plugin-utils": "^7.24.8",
+ "@babel/helper-replace-supers": "^7.25.0",
+ "@babel/traverse": "^7.25.4",
"globals": "^11.1.0"
},
"engines": {
@@ -1214,12 +1189,12 @@
}
},
"node_modules/@babel/plugin-transform-computed-properties": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.6.tgz",
- "integrity": "sha512-cRzPobcfRP0ZtuIEkA8QzghoUpSB3X3qSH5W2+FzG+VjWbJXExtx0nbRqwumdBN1x/ot2SlTNQLfBCnPdzp6kg==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz",
+ "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
- "@babel/template": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/template": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1229,11 +1204,11 @@
}
},
"node_modules/@babel/plugin-transform-destructuring": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.6.tgz",
- "integrity": "sha512-YLW6AE5LQpk5npNXL7i/O+U9CE4XsBCuRPgyjl1EICZYKmcitV+ayuuUGMJm2lC1WWjXYszeTnIxF/dq/GhIZQ==",
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz",
+ "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.8"
},
"engines": {
"node": ">=6.9.0"
@@ -1243,12 +1218,12 @@
}
},
"node_modules/@babel/plugin-transform-dotall-regex": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.6.tgz",
- "integrity": "sha512-rCXPnSEKvkm/EjzOtLoGvKseK+dS4kZwx1HexO3BtRtgL0fQ34awHn34aeSHuXtZY2F8a1X8xqBBPRtOxDVmcA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz",
+ "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1258,11 +1233,11 @@
}
},
"node_modules/@babel/plugin-transform-duplicate-keys": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.6.tgz",
- "integrity": "sha512-/8Odwp/aVkZwPFJMllSbawhDAO3UJi65foB00HYnK/uXvvCPm0TAXSByjz1mpRmp0q6oX2SIxpkUOpPFHk7FLA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz",
+ "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1271,12 +1246,27 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
+ "version": "7.25.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz",
+ "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.0",
+ "@babel/helper-plugin-utils": "^7.24.8"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
"node_modules/@babel/plugin-transform-dynamic-import": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.6.tgz",
- "integrity": "sha512-vpq8SSLRTBLOHUZHSnBqVo0AKX3PBaoPs2vVzYVWslXDTDIpwAcCDtfhUcHSQQoYoUvcFPTdC8TZYXu9ZnLT/w==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz",
+ "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-dynamic-import": "^7.8.3"
},
"engines": {
@@ -1287,12 +1277,12 @@
}
},
"node_modules/@babel/plugin-transform-exponentiation-operator": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.6.tgz",
- "integrity": "sha512-EemYpHtmz0lHE7hxxxYEuTYOOBZ43WkDgZ4arQ4r+VX9QHuNZC+WH3wUWmRNvR8ECpTRne29aZV6XO22qpOtdA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz",
+ "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==",
"dependencies": {
- "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1302,11 +1292,11 @@
}
},
"node_modules/@babel/plugin-transform-export-namespace-from": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.6.tgz",
- "integrity": "sha512-inXaTM1SVrIxCkIJ5gqWiozHfFMStuGbGJAxZFBoHcRRdDP0ySLb3jH6JOwmfiinPwyMZqMBX+7NBDCO4z0NSA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz",
+ "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-export-namespace-from": "^7.8.3"
},
"engines": {
@@ -1332,12 +1322,12 @@
}
},
"node_modules/@babel/plugin-transform-for-of": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.6.tgz",
- "integrity": "sha512-n3Sf72TnqK4nw/jziSqEl1qaWPbCRw2CziHH+jdRYvw4J6yeCzsj4jdw8hIntOEeDGTmHVe2w4MVL44PN0GMzg==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz",
+ "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1347,13 +1337,13 @@
}
},
"node_modules/@babel/plugin-transform-function-name": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.6.tgz",
- "integrity": "sha512-sOajCu6V0P1KPljWHKiDq6ymgqB+vfo3isUS4McqW1DZtvSVU2v/wuMhmRmkg3sFoq6GMaUUf8W4WtoSLkOV/Q==",
+ "version": "7.25.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz",
+ "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==",
"dependencies": {
- "@babel/helper-compilation-targets": "^7.24.6",
- "@babel/helper-function-name": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-compilation-targets": "^7.24.8",
+ "@babel/helper-plugin-utils": "^7.24.8",
+ "@babel/traverse": "^7.25.1"
},
"engines": {
"node": ">=6.9.0"
@@ -1363,11 +1353,11 @@
}
},
"node_modules/@babel/plugin-transform-json-strings": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.6.tgz",
- "integrity": "sha512-Uvgd9p2gUnzYJxVdBLcU0KurF8aVhkmVyMKW4MIY1/BByvs3EBpv45q01o7pRTVmTvtQq5zDlytP3dcUgm7v9w==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz",
+ "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-json-strings": "^7.8.3"
},
"engines": {
@@ -1378,11 +1368,11 @@
}
},
"node_modules/@babel/plugin-transform-literals": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.6.tgz",
- "integrity": "sha512-f2wHfR2HF6yMj+y+/y07+SLqnOSwRp8KYLpQKOzS58XLVlULhXbiYcygfXQxJlMbhII9+yXDwOUFLf60/TL5tw==",
+ "version": "7.25.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz",
+ "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.8"
},
"engines": {
"node": ">=6.9.0"
@@ -1392,11 +1382,11 @@
}
},
"node_modules/@babel/plugin-transform-logical-assignment-operators": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.6.tgz",
- "integrity": "sha512-EKaWvnezBCMkRIHxMJSIIylzhqK09YpiJtDbr2wsXTwnO0TxyjMUkaw4RlFIZMIS0iDj0KyIg7H7XCguHu/YDA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz",
+ "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
},
"engines": {
@@ -1407,11 +1397,11 @@
}
},
"node_modules/@babel/plugin-transform-member-expression-literals": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.6.tgz",
- "integrity": "sha512-9g8iV146szUo5GWgXpRbq/GALTnY+WnNuRTuRHWWFfWGbP9ukRL0aO/jpu9dmOPikclkxnNsjY8/gsWl6bmZJQ==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz",
+ "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1421,12 +1411,12 @@
}
},
"node_modules/@babel/plugin-transform-modules-amd": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.6.tgz",
- "integrity": "sha512-eAGogjZgcwqAxhyFgqghvoHRr+EYRQPFjUXrTYKBRb5qPnAVxOOglaxc4/byHqjvq/bqO2F3/CGwTHsgKJYHhQ==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz",
+ "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==",
"dependencies": {
- "@babel/helper-module-transforms": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-module-transforms": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1436,13 +1426,13 @@
}
},
"node_modules/@babel/plugin-transform-modules-commonjs": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.6.tgz",
- "integrity": "sha512-JEV8l3MHdmmdb7S7Cmx6rbNEjRCgTQMZxllveHO0mx6uiclB0NflCawlQQ6+o5ZrwjUBYPzHm2XoK4wqGVUFuw==",
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz",
+ "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==",
"dependencies": {
- "@babel/helper-module-transforms": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6",
- "@babel/helper-simple-access": "^7.24.6"
+ "@babel/helper-module-transforms": "^7.24.8",
+ "@babel/helper-plugin-utils": "^7.24.8",
+ "@babel/helper-simple-access": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1452,14 +1442,14 @@
}
},
"node_modules/@babel/plugin-transform-modules-systemjs": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.6.tgz",
- "integrity": "sha512-xg1Z0J5JVYxtpX954XqaaAT6NpAY6LtZXvYFCJmGFJWwtlz2EmJoR8LycFRGNE8dBKizGWkGQZGegtkV8y8s+w==",
+ "version": "7.25.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz",
+ "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==",
"dependencies": {
- "@babel/helper-hoist-variables": "^7.24.6",
- "@babel/helper-module-transforms": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6",
- "@babel/helper-validator-identifier": "^7.24.6"
+ "@babel/helper-module-transforms": "^7.25.0",
+ "@babel/helper-plugin-utils": "^7.24.8",
+ "@babel/helper-validator-identifier": "^7.24.7",
+ "@babel/traverse": "^7.25.0"
},
"engines": {
"node": ">=6.9.0"
@@ -1469,12 +1459,12 @@
}
},
"node_modules/@babel/plugin-transform-modules-umd": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.6.tgz",
- "integrity": "sha512-esRCC/KsSEUvrSjv5rFYnjZI6qv4R1e/iHQrqwbZIoRJqk7xCvEUiN7L1XrmW5QSmQe3n1XD88wbgDTWLbVSyg==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz",
+ "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==",
"dependencies": {
- "@babel/helper-module-transforms": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-module-transforms": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1484,12 +1474,12 @@
}
},
"node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.6.tgz",
- "integrity": "sha512-6DneiCiu91wm3YiNIGDWZsl6GfTTbspuj/toTEqLh9d4cx50UIzSdg+T96p8DuT7aJOBRhFyaE9ZvTHkXrXr6Q==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz",
+ "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1499,11 +1489,11 @@
}
},
"node_modules/@babel/plugin-transform-new-target": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.6.tgz",
- "integrity": "sha512-f8liz9JG2Va8A4J5ZBuaSdwfPqN6axfWRK+y66fjKYbwf9VBLuq4WxtinhJhvp1w6lamKUwLG0slK2RxqFgvHA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz",
+ "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1513,11 +1503,11 @@
}
},
"node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.6.tgz",
- "integrity": "sha512-+QlAiZBMsBK5NqrBWFXCYeXyiU1y7BQ/OYaiPAcQJMomn5Tyg+r5WuVtyEuvTbpV7L25ZSLfE+2E9ywj4FD48A==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz",
+ "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
},
"engines": {
@@ -1528,11 +1518,11 @@
}
},
"node_modules/@babel/plugin-transform-numeric-separator": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.6.tgz",
- "integrity": "sha512-6voawq8T25Jvvnc4/rXcWZQKKxUNZcKMS8ZNrjxQqoRFernJJKjE3s18Qo6VFaatG5aiX5JV1oPD7DbJhn0a4Q==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz",
+ "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-numeric-separator": "^7.10.4"
},
"engines": {
@@ -1543,14 +1533,14 @@
}
},
"node_modules/@babel/plugin-transform-object-rest-spread": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.6.tgz",
- "integrity": "sha512-OKmi5wiMoRW5Smttne7BwHM8s/fb5JFs+bVGNSeHWzwZkWXWValR1M30jyXo1s/RaqgwwhEC62u4rFH/FBcBPg==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz",
+ "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==",
"dependencies": {
- "@babel/helper-compilation-targets": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6",
+ "@babel/helper-compilation-targets": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-transform-parameters": "^7.24.6"
+ "@babel/plugin-transform-parameters": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1560,12 +1550,12 @@
}
},
"node_modules/@babel/plugin-transform-object-super": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.6.tgz",
- "integrity": "sha512-N/C76ihFKlZgKfdkEYKtaRUtXZAgK7sOY4h2qrbVbVTXPrKGIi8aww5WGe/+Wmg8onn8sr2ut6FXlsbu/j6JHg==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz",
+ "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
- "@babel/helper-replace-supers": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-replace-supers": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1575,11 +1565,11 @@
}
},
"node_modules/@babel/plugin-transform-optional-catch-binding": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.6.tgz",
- "integrity": "sha512-L5pZ+b3O1mSzJ71HmxSCmTVd03VOT2GXOigug6vDYJzE5awLI7P1g0wFcdmGuwSDSrQ0L2rDOe/hHws8J1rv3w==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz",
+ "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
},
"engines": {
@@ -1590,12 +1580,12 @@
}
},
"node_modules/@babel/plugin-transform-optional-chaining": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.6.tgz",
- "integrity": "sha512-cHbqF6l1QP11OkYTYQ+hhVx1E017O5ZcSPXk9oODpqhcAD1htsWG2NpHrrhthEO2qZomLK0FXS+u7NfrkF5aOQ==",
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz",
+ "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6",
+ "@babel/helper-plugin-utils": "^7.24.8",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
"@babel/plugin-syntax-optional-chaining": "^7.8.3"
},
"engines": {
@@ -1606,11 +1596,11 @@
}
},
"node_modules/@babel/plugin-transform-parameters": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.6.tgz",
- "integrity": "sha512-ST7guE8vLV+vI70wmAxuZpIKzVjvFX9Qs8bl5w6tN/6gOypPWUmMQL2p7LJz5E63vEGrDhAiYetniJFyBH1RkA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz",
+ "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1620,12 +1610,12 @@
}
},
"node_modules/@babel/plugin-transform-private-methods": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.6.tgz",
- "integrity": "sha512-T9LtDI0BgwXOzyXrvgLTT8DFjCC/XgWLjflczTLXyvxbnSR/gpv0hbmzlHE/kmh9nOvlygbamLKRo6Op4yB6aw==",
+ "version": "7.25.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz",
+ "integrity": "sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==",
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-create-class-features-plugin": "^7.25.4",
+ "@babel/helper-plugin-utils": "^7.24.8"
},
"engines": {
"node": ">=6.9.0"
@@ -1635,13 +1625,13 @@
}
},
"node_modules/@babel/plugin-transform-private-property-in-object": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.6.tgz",
- "integrity": "sha512-Qu/ypFxCY5NkAnEhCF86Mvg3NSabKsh/TPpBVswEdkGl7+FbsYHy1ziRqJpwGH4thBdQHh8zx+z7vMYmcJ7iaQ==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz",
+ "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.24.6",
- "@babel/helper-create-class-features-plugin": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6",
+ "@babel/helper-annotate-as-pure": "^7.24.7",
+ "@babel/helper-create-class-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-private-property-in-object": "^7.14.5"
},
"engines": {
@@ -1652,11 +1642,11 @@
}
},
"node_modules/@babel/plugin-transform-property-literals": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.6.tgz",
- "integrity": "sha512-oARaglxhRsN18OYsnPTpb8TcKQWDYNsPNmTnx5++WOAsUJ0cSC/FZVlIJCKvPbU4yn/UXsS0551CFKJhN0CaMw==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz",
+ "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1757,11 +1747,11 @@
}
},
"node_modules/@babel/plugin-transform-regenerator": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.6.tgz",
- "integrity": "sha512-SMDxO95I8WXRtXhTAc8t/NFQUT7VYbIWwJCJgEli9ml4MhqUMh4S6hxgH6SmAC3eAQNWCDJFxcFeEt9w2sDdXg==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz",
+ "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
+ "@babel/helper-plugin-utils": "^7.24.7",
"regenerator-transform": "^0.15.2"
},
"engines": {
@@ -1772,11 +1762,11 @@
}
},
"node_modules/@babel/plugin-transform-reserved-words": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.6.tgz",
- "integrity": "sha512-DcrgFXRRlK64dGE0ZFBPD5egM2uM8mgfrvTMOSB2yKzOtjpGegVYkzh3s1zZg1bBck3nkXiaOamJUqK3Syk+4A==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz",
+ "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1813,11 +1803,11 @@
}
},
"node_modules/@babel/plugin-transform-shorthand-properties": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.6.tgz",
- "integrity": "sha512-xnEUvHSMr9eOWS5Al2YPfc32ten7CXdH7Zwyyk7IqITg4nX61oHj+GxpNvl+y5JHjfN3KXE2IV55wAWowBYMVw==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz",
+ "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1827,12 +1817,12 @@
}
},
"node_modules/@babel/plugin-transform-spread": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.6.tgz",
- "integrity": "sha512-h/2j7oIUDjS+ULsIrNZ6/TKG97FgmEk1PXryk/HQq6op4XUUUwif2f69fJrzK0wza2zjCS1xhXmouACaWV5uPA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz",
+ "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1842,11 +1832,11 @@
}
},
"node_modules/@babel/plugin-transform-sticky-regex": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.6.tgz",
- "integrity": "sha512-fN8OcTLfGmYv7FnDrsjodYBo1DhPL3Pze/9mIIE2MGCT1KgADYIOD7rEglpLHZj8PZlC/JFX5WcD+85FLAQusw==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz",
+ "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1856,11 +1846,11 @@
}
},
"node_modules/@babel/plugin-transform-template-literals": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.6.tgz",
- "integrity": "sha512-BJbEqJIcKwrqUP+KfUIkxz3q8VzXe2R8Wv8TaNgO1cx+nNavxn/2+H8kp9tgFSOL6wYPPEgFvU6IKS4qoGqhmg==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz",
+ "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1870,11 +1860,11 @@
}
},
"node_modules/@babel/plugin-transform-typeof-symbol": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.6.tgz",
- "integrity": "sha512-IshCXQ+G9JIFJI7bUpxTE/oA2lgVLAIK8q1KdJNoPXOpvRaNjMySGuvLfBw/Xi2/1lLo953uE8hyYSDW3TSYig==",
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz",
+ "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.8"
},
"engines": {
"node": ">=6.9.0"
@@ -1901,11 +1891,11 @@
}
},
"node_modules/@babel/plugin-transform-unicode-escapes": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.6.tgz",
- "integrity": "sha512-bKl3xxcPbkQQo5eX9LjjDpU2xYHeEeNQbOhj0iPvetSzA+Tu9q/o5lujF4Sek60CM6MgYvOS/DJuwGbiEYAnLw==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz",
+ "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1915,12 +1905,12 @@
}
},
"node_modules/@babel/plugin-transform-unicode-property-regex": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.6.tgz",
- "integrity": "sha512-8EIgImzVUxy15cZiPii9GvLZwsy7Vxc+8meSlR3cXFmBIl5W5Tn9LGBf7CDKkHj4uVfNXCJB8RsVfnmY61iedA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz",
+ "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1930,12 +1920,12 @@
}
},
"node_modules/@babel/plugin-transform-unicode-regex": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.6.tgz",
- "integrity": "sha512-pssN6ExsvxaKU638qcWb81RrvvgZom3jDgU/r5xFZ7TONkZGFf4MhI2ltMb8OcQWhHyxgIavEU+hgqtbKOmsPA==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz",
+ "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1945,12 +1935,12 @@
}
},
"node_modules/@babel/plugin-transform-unicode-sets-regex": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.6.tgz",
- "integrity": "sha512-quiMsb28oXWIDK0gXLALOJRXLgICLiulqdZGOaPPd0vRT7fQp74NtdADAVu+D8s00C+0Xs0MxVP0VKF/sZEUgw==",
+ "version": "7.25.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz",
+ "integrity": "sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6"
+ "@babel/helper-create-regexp-features-plugin": "^7.25.2",
+ "@babel/helper-plugin-utils": "^7.24.8"
},
"engines": {
"node": ">=6.9.0"
@@ -1960,26 +1950,27 @@
}
},
"node_modules/@babel/preset-env": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.6.tgz",
- "integrity": "sha512-CrxEAvN7VxfjOG8JNF2Y/eMqMJbZPZ185amwGUBp8D9USK90xQmv7dLdFSa+VbD7fdIqcy/Mfv7WtzG8+/qxKg==",
- "dependencies": {
- "@babel/compat-data": "^7.24.6",
- "@babel/helper-compilation-targets": "^7.24.6",
- "@babel/helper-plugin-utils": "^7.24.6",
- "@babel/helper-validator-option": "^7.24.6",
- "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.6",
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.6",
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.6",
- "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.6",
+ "version": "7.25.4",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.4.tgz",
+ "integrity": "sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw==",
+ "dependencies": {
+ "@babel/compat-data": "^7.25.4",
+ "@babel/helper-compilation-targets": "^7.25.2",
+ "@babel/helper-plugin-utils": "^7.24.8",
+ "@babel/helper-validator-option": "^7.24.8",
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3",
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7",
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0",
"@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
"@babel/plugin-syntax-async-generators": "^7.8.4",
"@babel/plugin-syntax-class-properties": "^7.12.13",
"@babel/plugin-syntax-class-static-block": "^7.14.5",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-syntax-export-namespace-from": "^7.8.3",
- "@babel/plugin-syntax-import-assertions": "^7.24.6",
- "@babel/plugin-syntax-import-attributes": "^7.24.6",
+ "@babel/plugin-syntax-import-assertions": "^7.24.7",
+ "@babel/plugin-syntax-import-attributes": "^7.24.7",
"@babel/plugin-syntax-import-meta": "^7.10.4",
"@babel/plugin-syntax-json-strings": "^7.8.3",
"@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
@@ -1991,59 +1982,60 @@
"@babel/plugin-syntax-private-property-in-object": "^7.14.5",
"@babel/plugin-syntax-top-level-await": "^7.14.5",
"@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
- "@babel/plugin-transform-arrow-functions": "^7.24.6",
- "@babel/plugin-transform-async-generator-functions": "^7.24.6",
- "@babel/plugin-transform-async-to-generator": "^7.24.6",
- "@babel/plugin-transform-block-scoped-functions": "^7.24.6",
- "@babel/plugin-transform-block-scoping": "^7.24.6",
- "@babel/plugin-transform-class-properties": "^7.24.6",
- "@babel/plugin-transform-class-static-block": "^7.24.6",
- "@babel/plugin-transform-classes": "^7.24.6",
- "@babel/plugin-transform-computed-properties": "^7.24.6",
- "@babel/plugin-transform-destructuring": "^7.24.6",
- "@babel/plugin-transform-dotall-regex": "^7.24.6",
- "@babel/plugin-transform-duplicate-keys": "^7.24.6",
- "@babel/plugin-transform-dynamic-import": "^7.24.6",
- "@babel/plugin-transform-exponentiation-operator": "^7.24.6",
- "@babel/plugin-transform-export-namespace-from": "^7.24.6",
- "@babel/plugin-transform-for-of": "^7.24.6",
- "@babel/plugin-transform-function-name": "^7.24.6",
- "@babel/plugin-transform-json-strings": "^7.24.6",
- "@babel/plugin-transform-literals": "^7.24.6",
- "@babel/plugin-transform-logical-assignment-operators": "^7.24.6",
- "@babel/plugin-transform-member-expression-literals": "^7.24.6",
- "@babel/plugin-transform-modules-amd": "^7.24.6",
- "@babel/plugin-transform-modules-commonjs": "^7.24.6",
- "@babel/plugin-transform-modules-systemjs": "^7.24.6",
- "@babel/plugin-transform-modules-umd": "^7.24.6",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.6",
- "@babel/plugin-transform-new-target": "^7.24.6",
- "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.6",
- "@babel/plugin-transform-numeric-separator": "^7.24.6",
- "@babel/plugin-transform-object-rest-spread": "^7.24.6",
- "@babel/plugin-transform-object-super": "^7.24.6",
- "@babel/plugin-transform-optional-catch-binding": "^7.24.6",
- "@babel/plugin-transform-optional-chaining": "^7.24.6",
- "@babel/plugin-transform-parameters": "^7.24.6",
- "@babel/plugin-transform-private-methods": "^7.24.6",
- "@babel/plugin-transform-private-property-in-object": "^7.24.6",
- "@babel/plugin-transform-property-literals": "^7.24.6",
- "@babel/plugin-transform-regenerator": "^7.24.6",
- "@babel/plugin-transform-reserved-words": "^7.24.6",
- "@babel/plugin-transform-shorthand-properties": "^7.24.6",
- "@babel/plugin-transform-spread": "^7.24.6",
- "@babel/plugin-transform-sticky-regex": "^7.24.6",
- "@babel/plugin-transform-template-literals": "^7.24.6",
- "@babel/plugin-transform-typeof-symbol": "^7.24.6",
- "@babel/plugin-transform-unicode-escapes": "^7.24.6",
- "@babel/plugin-transform-unicode-property-regex": "^7.24.6",
- "@babel/plugin-transform-unicode-regex": "^7.24.6",
- "@babel/plugin-transform-unicode-sets-regex": "^7.24.6",
+ "@babel/plugin-transform-arrow-functions": "^7.24.7",
+ "@babel/plugin-transform-async-generator-functions": "^7.25.4",
+ "@babel/plugin-transform-async-to-generator": "^7.24.7",
+ "@babel/plugin-transform-block-scoped-functions": "^7.24.7",
+ "@babel/plugin-transform-block-scoping": "^7.25.0",
+ "@babel/plugin-transform-class-properties": "^7.25.4",
+ "@babel/plugin-transform-class-static-block": "^7.24.7",
+ "@babel/plugin-transform-classes": "^7.25.4",
+ "@babel/plugin-transform-computed-properties": "^7.24.7",
+ "@babel/plugin-transform-destructuring": "^7.24.8",
+ "@babel/plugin-transform-dotall-regex": "^7.24.7",
+ "@babel/plugin-transform-duplicate-keys": "^7.24.7",
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0",
+ "@babel/plugin-transform-dynamic-import": "^7.24.7",
+ "@babel/plugin-transform-exponentiation-operator": "^7.24.7",
+ "@babel/plugin-transform-export-namespace-from": "^7.24.7",
+ "@babel/plugin-transform-for-of": "^7.24.7",
+ "@babel/plugin-transform-function-name": "^7.25.1",
+ "@babel/plugin-transform-json-strings": "^7.24.7",
+ "@babel/plugin-transform-literals": "^7.25.2",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.24.7",
+ "@babel/plugin-transform-member-expression-literals": "^7.24.7",
+ "@babel/plugin-transform-modules-amd": "^7.24.7",
+ "@babel/plugin-transform-modules-commonjs": "^7.24.8",
+ "@babel/plugin-transform-modules-systemjs": "^7.25.0",
+ "@babel/plugin-transform-modules-umd": "^7.24.7",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7",
+ "@babel/plugin-transform-new-target": "^7.24.7",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7",
+ "@babel/plugin-transform-numeric-separator": "^7.24.7",
+ "@babel/plugin-transform-object-rest-spread": "^7.24.7",
+ "@babel/plugin-transform-object-super": "^7.24.7",
+ "@babel/plugin-transform-optional-catch-binding": "^7.24.7",
+ "@babel/plugin-transform-optional-chaining": "^7.24.8",
+ "@babel/plugin-transform-parameters": "^7.24.7",
+ "@babel/plugin-transform-private-methods": "^7.25.4",
+ "@babel/plugin-transform-private-property-in-object": "^7.24.7",
+ "@babel/plugin-transform-property-literals": "^7.24.7",
+ "@babel/plugin-transform-regenerator": "^7.24.7",
+ "@babel/plugin-transform-reserved-words": "^7.24.7",
+ "@babel/plugin-transform-shorthand-properties": "^7.24.7",
+ "@babel/plugin-transform-spread": "^7.24.7",
+ "@babel/plugin-transform-sticky-regex": "^7.24.7",
+ "@babel/plugin-transform-template-literals": "^7.24.7",
+ "@babel/plugin-transform-typeof-symbol": "^7.24.8",
+ "@babel/plugin-transform-unicode-escapes": "^7.24.7",
+ "@babel/plugin-transform-unicode-property-regex": "^7.24.7",
+ "@babel/plugin-transform-unicode-regex": "^7.24.7",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.25.4",
"@babel/preset-modules": "0.1.6-no-external-plugins",
"babel-plugin-polyfill-corejs2": "^0.4.10",
- "babel-plugin-polyfill-corejs3": "^0.10.4",
+ "babel-plugin-polyfill-corejs3": "^0.10.6",
"babel-plugin-polyfill-regenerator": "^0.6.1",
- "core-js-compat": "^3.31.0",
+ "core-js-compat": "^3.37.1",
"semver": "^6.3.1"
},
"engines": {
@@ -2128,31 +2120,28 @@
}
},
"node_modules/@babel/template": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.6.tgz",
- "integrity": "sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==",
+ "version": "7.25.0",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz",
+ "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==",
"dependencies": {
- "@babel/code-frame": "^7.24.6",
- "@babel/parser": "^7.24.6",
- "@babel/types": "^7.24.6"
+ "@babel/code-frame": "^7.24.7",
+ "@babel/parser": "^7.25.0",
+ "@babel/types": "^7.25.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.6.tgz",
- "integrity": "sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==",
- "dependencies": {
- "@babel/code-frame": "^7.24.6",
- "@babel/generator": "^7.24.6",
- "@babel/helper-environment-visitor": "^7.24.6",
- "@babel/helper-function-name": "^7.24.6",
- "@babel/helper-hoist-variables": "^7.24.6",
- "@babel/helper-split-export-declaration": "^7.24.6",
- "@babel/parser": "^7.24.6",
- "@babel/types": "^7.24.6",
+ "version": "7.25.6",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz",
+ "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==",
+ "dependencies": {
+ "@babel/code-frame": "^7.24.7",
+ "@babel/generator": "^7.25.6",
+ "@babel/parser": "^7.25.6",
+ "@babel/template": "^7.25.0",
+ "@babel/types": "^7.25.6",
"debug": "^4.3.1",
"globals": "^11.1.0"
},
@@ -2161,12 +2150,12 @@
}
},
"node_modules/@babel/types": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.6.tgz",
- "integrity": "sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==",
+ "version": "7.25.6",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz",
+ "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==",
"dependencies": {
- "@babel/helper-string-parser": "^7.24.6",
- "@babel/helper-validator-identifier": "^7.24.6",
+ "@babel/helper-string-parser": "^7.24.8",
+ "@babel/helper-validator-identifier": "^7.24.7",
"to-fast-properties": "^2.0.0"
},
"engines": {
@@ -2989,9 +2978,9 @@
}
},
"node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.25",
@@ -3359,9 +3348,9 @@
}
},
"node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.2.tgz",
- "integrity": "sha512-ahxSgCkAEk+P/AVO0vYr7DxOD3CwAQrT0Go9BJyGQ9Ef0QxVOfjDZMiF4Y2s3mLyPrjonchIMH/tbWHucJMykQ==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz",
+ "integrity": "sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==",
"cpu": [
"arm"
],
@@ -3372,9 +3361,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.2.tgz",
- "integrity": "sha512-lAarIdxZWbFSHFSDao9+I/F5jDaKyCqAPMq5HqnfpBw8dKDiCaaqM0lq5h1pQTLeIqueeay4PieGR5jGZMWprw==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz",
+ "integrity": "sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==",
"cpu": [
"arm64"
],
@@ -3385,9 +3374,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.2.tgz",
- "integrity": "sha512-SWsr8zEUk82KSqquIMgZEg2GE5mCSfr9sE/thDROkX6pb3QQWPp8Vw8zOq2GyxZ2t0XoSIUlvHDkrf5Gmf7x3Q==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz",
+ "integrity": "sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==",
"cpu": [
"arm64"
],
@@ -3398,9 +3387,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.2.tgz",
- "integrity": "sha512-o/HAIrQq0jIxJAhgtIvV5FWviYK4WB0WwV91SLUnsliw1lSAoLsmgEEgRWzDguAFeUEUUoIWXiJrPqU7vGiVkA==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz",
+ "integrity": "sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==",
"cpu": [
"x64"
],
@@ -3411,9 +3400,22 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.2.tgz",
- "integrity": "sha512-nwlJ65UY9eGq91cBi6VyDfArUJSKOYt5dJQBq8xyLhvS23qO+4Nr/RreibFHjP6t+5ap2ohZrUJcHv5zk5ju/g==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz",
+ "integrity": "sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz",
+ "integrity": "sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==",
"cpu": [
"arm"
],
@@ -3424,9 +3426,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.2.tgz",
- "integrity": "sha512-Pg5TxxO2IVlMj79+c/9G0LREC9SY3HM+pfAwX7zj5/cAuwrbfj2Wv9JbMHIdPCfQpYsI4g9mE+2Bw/3aeSs2rQ==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz",
+ "integrity": "sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==",
"cpu": [
"arm64"
],
@@ -3437,9 +3439,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.2.tgz",
- "integrity": "sha512-cAOTjGNm84gc6tS02D1EXtG7tDRsVSDTBVXOLbj31DkwfZwgTPYZ6aafSU7rD/4R2a34JOwlF9fQayuTSkoclA==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz",
+ "integrity": "sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==",
"cpu": [
"arm64"
],
@@ -3450,9 +3452,9 @@
]
},
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.2.tgz",
- "integrity": "sha512-4RyT6v1kXb7C0fn6zV33rvaX05P0zHoNzaXI/5oFHklfKm602j+N4mn2YvoezQViRLPnxP8M1NaY4s/5kXO5cw==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz",
+ "integrity": "sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==",
"cpu": [
"ppc64"
],
@@ -3463,9 +3465,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.2.tgz",
- "integrity": "sha512-KNUH6jC/vRGAKSorySTyc/yRYlCwN/5pnMjXylfBniwtJx5O7X17KG/0efj8XM3TZU7raYRXJFFReOzNmL1n1w==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz",
+ "integrity": "sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==",
"cpu": [
"riscv64"
],
@@ -3476,9 +3478,9 @@
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.2.tgz",
- "integrity": "sha512-xPV4y73IBEXToNPa3h5lbgXOi/v0NcvKxU0xejiFw6DtIYQqOTMhZ2DN18/HrrP0PmiL3rGtRG9gz1QE8vFKXQ==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz",
+ "integrity": "sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==",
"cpu": [
"s390x"
],
@@ -3489,9 +3491,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.2.tgz",
- "integrity": "sha512-QBhtr07iFGmF9egrPOWyO5wciwgtzKkYPNLVCFZTmr4TWmY0oY2Dm/bmhHjKRwZoGiaKdNcKhFtUMBKvlchH+Q==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz",
+ "integrity": "sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==",
"cpu": [
"x64"
],
@@ -3502,9 +3504,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.2.tgz",
- "integrity": "sha512-8zfsQRQGH23O6qazZSFY5jP5gt4cFvRuKTpuBsC1ZnSWxV8ZKQpPqOZIUtdfMOugCcBvFGRa1pDC/tkf19EgBw==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz",
+ "integrity": "sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==",
"cpu": [
"x64"
],
@@ -3515,9 +3517,9 @@
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.2.tgz",
- "integrity": "sha512-H4s8UjgkPnlChl6JF5empNvFHp77Jx+Wfy2EtmYPe9G22XV+PMuCinZVHurNe8ggtwoaohxARJZbaH/3xjB/FA==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz",
+ "integrity": "sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==",
"cpu": [
"arm64"
],
@@ -3528,9 +3530,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.2.tgz",
- "integrity": "sha512-djqpAjm/i8erWYF0K6UY4kRO3X5+T4TypIqw60Q8MTqSBaQNpNXDhxdjpZ3ikgb+wn99svA7jxcXpiyg9MUsdw==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz",
+ "integrity": "sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==",
"cpu": [
"ia32"
],
@@ -3541,9 +3543,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.2.tgz",
- "integrity": "sha512-teAqzLT0yTYZa8ZP7zhFKEx4cotS8Tkk5XiqNMJhD4CpaWB1BHARE4Qy+RzwnXvSAYv+Q3jAqCVBS+PS+Yee8Q==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz",
+ "integrity": "sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==",
"cpu": [
"x64"
],
@@ -3554,97 +3556,97 @@
]
},
"node_modules/@sentry-internal/browser-utils": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.22.0.tgz",
- "integrity": "sha512-R0u8KPaSivueIwUOhmYxcisKaJq3gx+I0xOcWoluDB3OI1Ds/QOSP/vmTsMg/mjwG/nUJ8RRM8pj0s8vlqCrjg==",
+ "version": "8.28.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.28.0.tgz",
+ "integrity": "sha512-tE9++KEy8SlqibTmYymuxFVAnutsXBqrwQ936WJbjaMfkqXiro7C1El0ybkprskd0rKS7kln20Q6nQlNlMEoTA==",
"dependencies": {
- "@sentry/core": "8.22.0",
- "@sentry/types": "8.22.0",
- "@sentry/utils": "8.22.0"
+ "@sentry/core": "8.28.0",
+ "@sentry/types": "8.28.0",
+ "@sentry/utils": "8.28.0"
},
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry-internal/feedback": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.22.0.tgz",
- "integrity": "sha512-Sy2+v0xBmVnZ5LQ48603CvLy5vVQvAZ+hc9xQSAHexts07NkvApMU1qv26YNwxlAWfDha1wXiW6ryd4YDzaoVA==",
+ "version": "8.28.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.28.0.tgz",
+ "integrity": "sha512-5vYunPCDBLCJ8QNnhepacdYheiN+UtYxpGAIaC/zjBC1nDuBgWs+TfKPo1UlO/1sesfgs9ibpxtShOweucL61g==",
"dependencies": {
- "@sentry/core": "8.22.0",
- "@sentry/types": "8.22.0",
- "@sentry/utils": "8.22.0"
+ "@sentry/core": "8.28.0",
+ "@sentry/types": "8.28.0",
+ "@sentry/utils": "8.28.0"
},
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry-internal/replay": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.22.0.tgz",
- "integrity": "sha512-sF8RyMPJP1fSIyyBDAbtybvKCu0dy8ZAfMwLP7ZqEnWrhZqktVuqM7/++EAFMlD5YaWJXm1IDuOXjgSQjUtSIQ==",
+ "version": "8.28.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.28.0.tgz",
+ "integrity": "sha512-70jvzzOL5O74gahgXKyRkZgiYN93yly5gq+bbj4/6NRQ+EtPd285+ccy0laExdfyK0ugvvwD4v+1MQit52OAsg==",
"dependencies": {
- "@sentry-internal/browser-utils": "8.22.0",
- "@sentry/core": "8.22.0",
- "@sentry/types": "8.22.0",
- "@sentry/utils": "8.22.0"
+ "@sentry-internal/browser-utils": "8.28.0",
+ "@sentry/core": "8.28.0",
+ "@sentry/types": "8.28.0",
+ "@sentry/utils": "8.28.0"
},
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry-internal/replay-canvas": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.22.0.tgz",
- "integrity": "sha512-/gV8qN3JqWw0LXTMuCGB8RDI8Bx1VESNRBdh/7Cmc5+hxYBfcketuix3S8mHWcE/JO+Ed9g1Abzys6GphTB9LA==",
+ "version": "8.28.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.28.0.tgz",
+ "integrity": "sha512-RfpYHDHMUKGeEdx41QtHITjEn6P3tGaDPHvatqdrD3yv4j+wbJ6laX1PrIxCpGFUtjdzkqi/KUcvUd2kzbH/FA==",
"dependencies": {
- "@sentry-internal/replay": "8.22.0",
- "@sentry/core": "8.22.0",
- "@sentry/types": "8.22.0",
- "@sentry/utils": "8.22.0"
+ "@sentry-internal/replay": "8.28.0",
+ "@sentry/core": "8.28.0",
+ "@sentry/types": "8.28.0",
+ "@sentry/utils": "8.28.0"
},
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry/browser": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.22.0.tgz",
- "integrity": "sha512-t3b+/9WWcP9SQTWwrHrB57B33ENgmUjyFlW2+JSlCXkSJBSmAoquPZ/GPjOuPaSr3HIA0mu9uEr4A41d5diASQ==",
+ "version": "8.28.0",
+ "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.28.0.tgz",
+ "integrity": "sha512-i/gjMYzIGQiPFH1pCbdnTwH9xs9mTAqzN+goP3GWX5a58frc7h8vxyA/5z0yMd0aCW6U8mVxnoAT72vGbKbx0g==",
"dependencies": {
- "@sentry-internal/browser-utils": "8.22.0",
- "@sentry-internal/feedback": "8.22.0",
- "@sentry-internal/replay": "8.22.0",
- "@sentry-internal/replay-canvas": "8.22.0",
- "@sentry/core": "8.22.0",
- "@sentry/types": "8.22.0",
- "@sentry/utils": "8.22.0"
+ "@sentry-internal/browser-utils": "8.28.0",
+ "@sentry-internal/feedback": "8.28.0",
+ "@sentry-internal/replay": "8.28.0",
+ "@sentry-internal/replay-canvas": "8.28.0",
+ "@sentry/core": "8.28.0",
+ "@sentry/types": "8.28.0",
+ "@sentry/utils": "8.28.0"
},
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry/core": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.22.0.tgz",
- "integrity": "sha512-fYPnxp7UkY2tckaOtivIySxnJvlbekuxs+Qi6rkUv9JpF+TYKpt7OPNUAbgVIhS0xazAEN6iKTfmnmpUbFRLmQ==",
+ "version": "8.28.0",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.28.0.tgz",
+ "integrity": "sha512-+If9uubvpZpvaQQw4HLiKPhrSS9/KcoA/AcdQkNm+5CVwAoOmDPtyYfkPBgfo2hLZnZQqR1bwkz/PrNoOm+gqA==",
"dependencies": {
- "@sentry/types": "8.22.0",
- "@sentry/utils": "8.22.0"
+ "@sentry/types": "8.28.0",
+ "@sentry/utils": "8.28.0"
},
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry/react": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry/react/-/react-8.22.0.tgz",
- "integrity": "sha512-LcO8SPfjYsx3Zvg1mQwjreVvtriVxde+6njIJyXU9TArB0e8bFexvd4MGXdBExgW9aY449hNaStgKRWMNHeVHQ==",
- "dependencies": {
- "@sentry/browser": "8.22.0",
- "@sentry/core": "8.22.0",
- "@sentry/types": "8.22.0",
- "@sentry/utils": "8.22.0",
+ "version": "8.28.0",
+ "resolved": "https://registry.npmjs.org/@sentry/react/-/react-8.28.0.tgz",
+ "integrity": "sha512-rpeO8ikpAK7/9kVHc1IMtJc7A7IyPzswcFJ0uL1faCt8oZEzlotrQnEe6hgFnv4xvMledTrohnKj/fWVd55Aig==",
+ "dependencies": {
+ "@sentry/browser": "8.28.0",
+ "@sentry/core": "8.28.0",
+ "@sentry/types": "8.28.0",
+ "@sentry/utils": "8.28.0",
"hoist-non-react-statics": "^3.3.2"
},
"engines": {
@@ -3655,19 +3657,19 @@
}
},
"node_modules/@sentry/types": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.22.0.tgz",
- "integrity": "sha512-1MLK3xO+uF2oJaa+M98aLIrQsEHzV7xnVWPfE3MhejYLNQebj4rQnQKTut/xZNIF9W0Q+bRcakLarC3ce2a74g==",
+ "version": "8.28.0",
+ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.28.0.tgz",
+ "integrity": "sha512-hOfqfd92/AzBrEdMgmmV1VfOXJbIfleFTnerRl0mg/+CcNgP/6+Fdonp354TD56ouWNF2WkOM6sEKSXMWp6SEQ==",
"engines": {
"node": ">=14.18"
}
},
"node_modules/@sentry/utils": {
- "version": "8.22.0",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.22.0.tgz",
- "integrity": "sha512-0ITG2+3EtyMtyc/nQG8aB9z9eIQ4L43nM/KuNgYSnM1vPl/zegbaLT0Ek/xkQB1OLIOLkEPQ6x9GWe+248/n3g==",
+ "version": "8.28.0",
+ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.28.0.tgz",
+ "integrity": "sha512-smhk7PJpvDMQ2DB5p2qn9UeoUHdU41IgjMmS2xklZpa8tjzBTxDeWpGvrX2fuH67D9bAJuLC/XyZjJCHLoEW5g==",
"dependencies": {
- "@sentry/types": "8.22.0"
+ "@sentry/types": "8.28.0"
},
"engines": {
"node": ">=14.18"
@@ -3922,13 +3924,12 @@
}
},
"node_modules/@testing-library/jest-dom": {
- "version": "6.4.8",
- "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.8.tgz",
- "integrity": "sha512-JD0G+Zc38f5MBHA4NgxQMR5XtO5Jx9g86jqturNTt2WUfRmLDIY7iKkWHDCCTiDuFMre6nxAD5wHw9W5kI4rGw==",
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz",
+ "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==",
"dev": true,
"dependencies": {
"@adobe/css-tools": "^4.4.0",
- "@babel/runtime": "^7.9.2",
"aria-query": "^5.0.0",
"chalk": "^3.0.0",
"css.escape": "^1.5.1",
@@ -3962,9 +3963,9 @@
"dev": true
},
"node_modules/@testing-library/react": {
- "version": "16.0.0",
- "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.0.tgz",
- "integrity": "sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==",
+ "version": "16.0.1",
+ "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.1.tgz",
+ "integrity": "sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==",
"dev": true,
"dependencies": {
"@babel/runtime": "^7.12.5"
@@ -4185,9 +4186,9 @@
"integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q=="
},
"node_modules/@types/react": {
- "version": "18.3.3",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz",
- "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==",
+ "version": "18.3.5",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.5.tgz",
+ "integrity": "sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==",
"dependencies": {
"@types/prop-types": "*",
"csstype": "^3.0.2"
@@ -4222,9 +4223,9 @@
}
},
"node_modules/@types/react-transition-group": {
- "version": "4.4.10",
- "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz",
- "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==",
+ "version": "4.4.11",
+ "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz",
+ "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==",
"dependencies": {
"@types/react": "*"
}
@@ -4240,16 +4241,16 @@
"integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA=="
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.0.0.tgz",
- "integrity": "sha512-STIZdwEQRXAHvNUS6ILDf5z3u95Gc8jzywunxSNqX00OooIemaaNIA0vEgynJlycL5AjabYLLrIyHd4iazyvtg==",
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.4.0.tgz",
+ "integrity": "sha512-rg8LGdv7ri3oAlenMACk9e+AR4wUV0yrrG+XKsGKOK0EVgeEDqurkXMPILG2836fW4ibokTB5v4b6Z9+GYQDEw==",
"dev": true,
"dependencies": {
"@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.0.0",
- "@typescript-eslint/type-utils": "8.0.0",
- "@typescript-eslint/utils": "8.0.0",
- "@typescript-eslint/visitor-keys": "8.0.0",
+ "@typescript-eslint/scope-manager": "8.4.0",
+ "@typescript-eslint/type-utils": "8.4.0",
+ "@typescript-eslint/utils": "8.4.0",
+ "@typescript-eslint/visitor-keys": "8.4.0",
"graphemer": "^1.4.0",
"ignore": "^5.3.1",
"natural-compare": "^1.4.0",
@@ -4272,6 +4273,53 @@
}
}
},
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.4.0.tgz",
+ "integrity": "sha512-n2jFxLeY0JmKfUqy3P70rs6vdoPjHK8P/w+zJcV3fk0b0BwRXC/zxRTEnAsgYT7MwdQDt/ZEbtdzdVC+hcpF0A==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "8.4.0",
+ "@typescript-eslint/visitor-keys": "8.4.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.4.0.tgz",
+ "integrity": "sha512-T1RB3KQdskh9t3v/qv7niK6P8yvn7ja1mS7QK7XfRVL6wtZ8/mFs/FHf4fKvTA0rKnqnYxl/uHFNbnEt0phgbw==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.4.0.tgz",
+ "integrity": "sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "8.4.0",
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
"node_modules/@typescript-eslint/parser": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.0.0.tgz",
@@ -4318,13 +4366,13 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.0.0.tgz",
- "integrity": "sha512-mJAFP2mZLTBwAn5WI4PMakpywfWFH5nQZezUQdSKV23Pqo6o9iShQg1hP2+0hJJXP2LnZkWPphdIq4juYYwCeg==",
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.4.0.tgz",
+ "integrity": "sha512-pu2PAmNrl9KX6TtirVOrbLPLwDmASpZhK/XU7WvoKoCUkdtq9zF7qQ7gna0GBZFN0hci0vHaSusiL2WpsQk37A==",
"dev": true,
"dependencies": {
- "@typescript-eslint/typescript-estree": "8.0.0",
- "@typescript-eslint/utils": "8.0.0",
+ "@typescript-eslint/typescript-estree": "8.4.0",
+ "@typescript-eslint/utils": "8.4.0",
"debug": "^4.3.4",
"ts-api-utils": "^1.3.0"
},
@@ -4341,6 +4389,64 @@
}
}
},
+ "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.4.0.tgz",
+ "integrity": "sha512-T1RB3KQdskh9t3v/qv7niK6P8yvn7ja1mS7QK7XfRVL6wtZ8/mFs/FHf4fKvTA0rKnqnYxl/uHFNbnEt0phgbw==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.4.0.tgz",
+ "integrity": "sha512-kJ2OIP4dQw5gdI4uXsaxUZHRwWAGpREJ9Zq6D5L0BweyOrWsL6Sz0YcAZGWhvKnH7fm1J5YFE1JrQL0c9dd53A==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "8.4.0",
+ "@typescript-eslint/visitor-keys": "8.4.0",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.3.2",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.4.0.tgz",
+ "integrity": "sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "8.4.0",
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
"node_modules/@typescript-eslint/types": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.0.tgz",
@@ -4383,15 +4489,15 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.0.0.tgz",
- "integrity": "sha512-k/oS/A/3QeGLRvOWCg6/9rATJL5rec7/5s1YmdS0ZU6LHveJyGFwBvLhSRBv6i9xaj7etmosp+l+ViN1I9Aj/Q==",
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.4.0.tgz",
+ "integrity": "sha512-swULW8n1IKLjRAgciCkTCafyTHHfwVQFt8DovmaF69sKbOxTSFMmIZaSHjqO9i/RV0wIblaawhzvtva8Nmm7lQ==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "8.0.0",
- "@typescript-eslint/types": "8.0.0",
- "@typescript-eslint/typescript-estree": "8.0.0"
+ "@typescript-eslint/scope-manager": "8.4.0",
+ "@typescript-eslint/types": "8.4.0",
+ "@typescript-eslint/typescript-estree": "8.4.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -4404,6 +4510,81 @@
"eslint": "^8.57.0 || ^9.0.0"
}
},
+ "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.4.0.tgz",
+ "integrity": "sha512-n2jFxLeY0JmKfUqy3P70rs6vdoPjHK8P/w+zJcV3fk0b0BwRXC/zxRTEnAsgYT7MwdQDt/ZEbtdzdVC+hcpF0A==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "8.4.0",
+ "@typescript-eslint/visitor-keys": "8.4.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.4.0.tgz",
+ "integrity": "sha512-T1RB3KQdskh9t3v/qv7niK6P8yvn7ja1mS7QK7XfRVL6wtZ8/mFs/FHf4fKvTA0rKnqnYxl/uHFNbnEt0phgbw==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.4.0.tgz",
+ "integrity": "sha512-kJ2OIP4dQw5gdI4uXsaxUZHRwWAGpREJ9Zq6D5L0BweyOrWsL6Sz0YcAZGWhvKnH7fm1J5YFE1JrQL0c9dd53A==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "8.4.0",
+ "@typescript-eslint/visitor-keys": "8.4.0",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.3.2",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.4.0.tgz",
+ "integrity": "sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "8.4.0",
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
"node_modules/@typescript-eslint/visitor-keys": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.0.tgz",
@@ -4573,17 +4754,17 @@
}
},
"node_modules/@vitejs/plugin-legacy": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-5.4.1.tgz",
- "integrity": "sha512-kee0l7dVevCNs1l3u2PnihVunvQ0WTJL2UJ/siQGD3Iht546mR9NO16tCv32uCP6lcGO1QDLqlPqInJtV1FE7A==",
+ "version": "5.4.2",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-5.4.2.tgz",
+ "integrity": "sha512-hlyyQL+wEIyOWdwsUKX+0g3kBU4AbHmVzHarLvVKiGGGqLIYjttMvvjk6zGY8RD9dab6QuFNhDoxg0YFhQ26xA==",
"dev": true,
"dependencies": {
- "@babel/core": "^7.24.6",
- "@babel/preset-env": "^7.24.6",
- "browserslist": "^4.23.0",
+ "@babel/core": "^7.25.2",
+ "@babel/preset-env": "^7.25.3",
+ "browserslist": "^4.23.3",
"browserslist-to-esbuild": "^2.1.1",
- "core-js": "^3.37.1",
- "magic-string": "^0.30.10",
+ "core-js": "^3.38.0",
+ "magic-string": "^0.30.11",
"regenerator-runtime": "^0.14.1",
"systemjs": "^6.15.1"
},
@@ -5168,12 +5349,12 @@
}
},
"node_modules/babel-plugin-polyfill-corejs3": {
- "version": "0.10.4",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz",
- "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==",
+ "version": "0.10.6",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz",
+ "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==",
"dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.6.1",
- "core-js-compat": "^3.36.1"
+ "@babel/helper-define-polyfill-provider": "^0.6.2",
+ "core-js-compat": "^3.38.0"
},
"peerDependencies": {
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
@@ -5257,9 +5438,9 @@
}
},
"node_modules/browserslist": {
- "version": "4.23.0",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
- "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
+ "version": "4.23.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz",
+ "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==",
"funding": [
{
"type": "opencollective",
@@ -5275,10 +5456,10 @@
}
],
"dependencies": {
- "caniuse-lite": "^1.0.30001587",
- "electron-to-chromium": "^1.4.668",
- "node-releases": "^2.0.14",
- "update-browserslist-db": "^1.0.13"
+ "caniuse-lite": "^1.0.30001646",
+ "electron-to-chromium": "^1.5.4",
+ "node-releases": "^2.0.18",
+ "update-browserslist-db": "^1.1.0"
},
"bin": {
"browserslist": "cli.js"
@@ -5401,9 +5582,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001609",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001609.tgz",
- "integrity": "sha512-JFPQs34lHKx1B5t1EpQpWH4c+29zIyn/haGsbpfq3suuV9v56enjFt23zqijxGTMwy1p/4H2tjnQMY+p1WoAyA==",
+ "version": "1.0.30001658",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001658.tgz",
+ "integrity": "sha512-N2YVqWbJELVdrnsW5p+apoQyYt51aBMSsBZki1XZEfeBCexcM/sf4xiAHcXQBkuOwJBXtWF7aW1sYX6tKebPHw==",
"funding": [
{
"type": "opencollective",
@@ -5598,9 +5779,9 @@
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="
},
"node_modules/core-js": {
- "version": "3.37.1",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz",
- "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==",
+ "version": "3.38.1",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz",
+ "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==",
"hasInstallScript": true,
"funding": {
"type": "opencollective",
@@ -5608,11 +5789,11 @@
}
},
"node_modules/core-js-compat": {
- "version": "3.36.1",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz",
- "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==",
+ "version": "3.38.1",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz",
+ "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==",
"dependencies": {
- "browserslist": "^4.23.0"
+ "browserslist": "^4.23.3"
},
"funding": {
"type": "opencollective",
@@ -6129,9 +6310,9 @@
}
},
"node_modules/downshift": {
- "version": "9.0.7",
- "resolved": "https://registry.npmjs.org/downshift/-/downshift-9.0.7.tgz",
- "integrity": "sha512-B6JY4sJGEl9xBEJEvC/C+QYYYtPWN5RL+TlROJQfue9+ZFgrD/p1ZgGw73I0WSTNH9/h5q3LIKQA4FLd/N10vg==",
+ "version": "9.0.8",
+ "resolved": "https://registry.npmjs.org/downshift/-/downshift-9.0.8.tgz",
+ "integrity": "sha512-59BWD7+hSUQIM1DeNPLirNNnZIO9qMdIK5GQ/Uo8q34gT4B78RBlb9dhzgnh0HfQTJj4T/JKYD8KoLAlMWnTsA==",
"dependencies": {
"@babel/runtime": "^7.24.5",
"compute-scroll-into-view": "^3.1.0",
@@ -6150,9 +6331,9 @@
"dev": true
},
"node_modules/electron-to-chromium": {
- "version": "1.4.736",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz",
- "integrity": "sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q=="
+ "version": "1.5.16",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.16.tgz",
+ "integrity": "sha512-2gQpi2WYobXmz2q23FrOBYTLcI1O/P4heW3eqX+ldmPVDQELRqhiebV380EhlGG12NtnX1qbK/FHpN0ba+7bLA=="
},
"node_modules/emoji-regex": {
"version": "9.2.2",
@@ -6384,9 +6565,9 @@
}
},
"node_modules/escalade": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
- "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"engines": {
"node": ">=6"
}
@@ -6479,9 +6660,9 @@
}
},
"node_modules/eslint-plugin-react": {
- "version": "7.35.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz",
- "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==",
+ "version": "7.35.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.2.tgz",
+ "integrity": "sha512-Rbj2R9zwP2GYNcIak4xoAMV57hrBh3hTaR0k7hVjwCQgryE/pw5px4b13EYjduOI0hfXyZhwBxaGpOTbWSGzKQ==",
"dev": true,
"dependencies": {
"array-includes": "^3.1.8",
@@ -6523,9 +6704,9 @@
}
},
"node_modules/eslint-plugin-react-refresh": {
- "version": "0.4.9",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.9.tgz",
- "integrity": "sha512-QK49YrBAo5CLNLseZ7sZgvgTy21E6NEw22eZqc4teZfH8pxV3yXc9XXOYfUI6JNpw7mfHNkAeWtBxrTyykB6HA==",
+ "version": "0.4.11",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.11.tgz",
+ "integrity": "sha512-wrAKxMbVr8qhXTtIKfXqAn5SAtRZt0aXxe5P23Fh4pUAdC6XEsybGLB8P0PI4j1yYqOgUEUlzKAGDfo7rJOjcw==",
"dev": true,
"peerDependencies": {
"eslint": ">=7"
@@ -7733,9 +7914,9 @@
}
},
"node_modules/i18next": {
- "version": "23.12.2",
- "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.12.2.tgz",
- "integrity": "sha512-XIeh5V+bi8SJSWGL3jqbTEBW5oD6rbP5L+E7dVQh1MNTxxYef0x15rhJVcRb7oiuq4jLtgy2SD8eFlf6P2cmqg==",
+ "version": "23.14.0",
+ "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.14.0.tgz",
+ "integrity": "sha512-Y5GL4OdA8IU2geRrt2+Uc1iIhsjICdHZzT9tNwQ3TVqdNzgxHToGCKf/TPRP80vTCAP6svg2WbbJL+Gx5MFQVA==",
"funding": [
{
"type": "individual",
@@ -7755,9 +7936,9 @@
}
},
"node_modules/i18next-http-backend": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.2.tgz",
- "integrity": "sha512-+K8HbDfrvc1/2X8jpb7RLhI9ZxBDpx3xogYkQwGKlWAUXLSEGXzgdt3EcUjLlBCdMwdQY+K+EUF6oh8oB6rwHw==",
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.6.1.tgz",
+ "integrity": "sha512-rCilMAnlEQNeKOZY1+x8wLM5IpYOj10guGvEpeC59tNjj6MMreLIjIW8D1RclhD3ifLwn6d/Y9HEM1RUE6DSog==",
"dependencies": {
"cross-fetch": "4.0.0"
}
@@ -8423,9 +8604,9 @@
}
},
"node_modules/jsdom": {
- "version": "24.1.1",
- "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.1.tgz",
- "integrity": "sha512-5O1wWV99Jhq4DV7rCLIoZ/UIhyQeDR7wHVyZAHAshbrvZsLs+Xzz7gtwnlJTJDjleiTKh54F4dXrX70vJQTyJQ==",
+ "version": "25.0.0",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.0.tgz",
+ "integrity": "sha512-OhoFVT59T7aEq75TVw9xxEfkXgacpqAhQaYgP9y/fDqWQCMB/b1H66RfmPm/MaeaAIU9nDwMOVTlPN51+ao6CQ==",
"dev": true,
"dependencies": {
"cssstyle": "^4.0.1",
@@ -8912,12 +9093,12 @@
}
},
"node_modules/magic-string": {
- "version": "0.30.10",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz",
- "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==",
+ "version": "0.30.11",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz",
+ "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==",
"dev": true,
"dependencies": {
- "@jridgewell/sourcemap-codec": "^1.4.15"
+ "@jridgewell/sourcemap-codec": "^1.5.0"
}
},
"node_modules/magicast": {
@@ -9177,9 +9358,9 @@
}
},
"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=="
},
"node_modules/normalize-package-data": {
"version": "2.5.0",
@@ -9818,9 +9999,9 @@
}
},
"node_modules/qs": {
- "version": "6.12.3",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.3.tgz",
- "integrity": "sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==",
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
"dependencies": {
"side-channel": "^1.0.6"
},
@@ -10470,9 +10651,9 @@
"integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="
},
"node_modules/rollup": {
- "version": "4.14.2",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.2.tgz",
- "integrity": "sha512-WkeoTWvuBoFjFAhsEOHKRoZ3r9GfTyhh7Vff1zwebEFLEFjT1lG3784xEgKiTa7E+e70vsC81roVL2MP4tgEEQ==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz",
+ "integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==",
"dev": true,
"dependencies": {
"@types/estree": "1.0.5"
@@ -10485,21 +10666,22 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.14.2",
- "@rollup/rollup-android-arm64": "4.14.2",
- "@rollup/rollup-darwin-arm64": "4.14.2",
- "@rollup/rollup-darwin-x64": "4.14.2",
- "@rollup/rollup-linux-arm-gnueabihf": "4.14.2",
- "@rollup/rollup-linux-arm64-gnu": "4.14.2",
- "@rollup/rollup-linux-arm64-musl": "4.14.2",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.14.2",
- "@rollup/rollup-linux-riscv64-gnu": "4.14.2",
- "@rollup/rollup-linux-s390x-gnu": "4.14.2",
- "@rollup/rollup-linux-x64-gnu": "4.14.2",
- "@rollup/rollup-linux-x64-musl": "4.14.2",
- "@rollup/rollup-win32-arm64-msvc": "4.14.2",
- "@rollup/rollup-win32-ia32-msvc": "4.14.2",
- "@rollup/rollup-win32-x64-msvc": "4.14.2",
+ "@rollup/rollup-android-arm-eabi": "4.21.2",
+ "@rollup/rollup-android-arm64": "4.21.2",
+ "@rollup/rollup-darwin-arm64": "4.21.2",
+ "@rollup/rollup-darwin-x64": "4.21.2",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.21.2",
+ "@rollup/rollup-linux-arm-musleabihf": "4.21.2",
+ "@rollup/rollup-linux-arm64-gnu": "4.21.2",
+ "@rollup/rollup-linux-arm64-musl": "4.21.2",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2",
+ "@rollup/rollup-linux-riscv64-gnu": "4.21.2",
+ "@rollup/rollup-linux-s390x-gnu": "4.21.2",
+ "@rollup/rollup-linux-x64-gnu": "4.21.2",
+ "@rollup/rollup-linux-x64-musl": "4.21.2",
+ "@rollup/rollup-win32-arm64-msvc": "4.21.2",
+ "@rollup/rollup-win32-ia32-msvc": "4.21.2",
+ "@rollup/rollup-win32-x64-msvc": "4.21.2",
"fsevents": "~2.3.2"
}
},
@@ -11120,9 +11302,9 @@
"integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA=="
},
"node_modules/styled-components": {
- "version": "6.1.12",
- "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.12.tgz",
- "integrity": "sha512-n/O4PzRPhbYI0k1vKKayfti3C/IGcPf+DqcrOB7O/ab9x4u/zjqraneT5N45+sIe87cxrCApXM8Bna7NYxwoTA==",
+ "version": "6.1.13",
+ "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.13.tgz",
+ "integrity": "sha512-M0+N2xSnAtwcVAQeFEsGWFFxXDftHUD7XrKla06QbpUMmbmtFBMMTcKWvFXtWxuD5qQkB8iU5gk6QASlx2ZRMw==",
"dependencies": {
"@emotion/is-prop-valid": "1.2.2",
"@emotion/unitless": "0.8.1",
@@ -11561,9 +11743,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.0",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz",
+ "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==",
"funding": [
{
"type": "opencollective",
@@ -11579,8 +11761,8 @@
}
],
"dependencies": {
- "escalade": "^3.1.1",
- "picocolors": "^1.0.0"
+ "escalade": "^3.1.2",
+ "picocolors": "^1.0.1"
},
"bin": {
"update-browserslist-db": "cli.js"
@@ -11738,14 +11920,14 @@
"integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw=="
},
"node_modules/vite": {
- "version": "5.3.5",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz",
- "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==",
+ "version": "5.4.3",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.3.tgz",
+ "integrity": "sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==",
"dev": true,
"dependencies": {
"esbuild": "^0.21.3",
- "postcss": "^8.4.39",
- "rollup": "^4.13.0"
+ "postcss": "^8.4.43",
+ "rollup": "^4.20.0"
},
"bin": {
"vite": "bin/vite.js"
@@ -11764,6 +11946,7 @@
"less": "*",
"lightningcss": "^1.21.0",
"sass": "*",
+ "sass-embedded": "*",
"stylus": "*",
"sugarss": "*",
"terser": "^5.4.0"
@@ -11781,6 +11964,9 @@
"sass": {
"optional": true
},
+ "sass-embedded": {
+ "optional": true
+ },
"stylus": {
"optional": true
},
@@ -11914,9 +12100,9 @@
}
},
"node_modules/vite/node_modules/postcss": {
- "version": "8.4.39",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz",
- "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==",
+ "version": "8.4.45",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz",
+ "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==",
"dev": true,
"funding": [
{
diff --git a/package.json b/package.json
index 4a8a4a5e85..c3e4c51437 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "gsa",
- "version": "23.2.2-dev1",
+ "version": "23.3.1-dev1",
"description": "Greenbone Security Assistant",
"keywords": [
"openvas",
@@ -35,7 +35,7 @@
"@greenbone/opensight-ui-components": "^0.3.0",
"@mantine/core": "^6.0.0",
"@reduxjs/toolkit": "^2.2.7",
- "@sentry/react": "^8.22.0",
+ "@sentry/react": "^8.28.0",
"@visx/axis": "^3.10.1",
"@visx/gradient": "^3.3.0",
"@visx/shape": "^3.5.0",
@@ -49,13 +49,13 @@
"d3-interpolate": "^3.0.1",
"d3-scale": "^4.0.2",
"d3-shape": "^3.2.0",
- "downshift": "^9.0.7",
+ "downshift": "^9.0.8",
"fast-deep-equal": "^3.1.3",
"fast-xml-parser": "^4.4.1",
"history": "^4.10.1",
"hoist-non-react-statics": "^3.3.2",
- "i18next": "^23.12.2",
- "i18next-http-backend": "^2.5.2",
+ "i18next": "^23.14.0",
+ "i18next-http-backend": "^2.6.1",
"ical.js": "^2.0.0",
"lucide-react": "^0.439.0",
"memoize-one": "^6.0.0",
@@ -63,7 +63,7 @@
"moment-timezone": "^0.5.45",
"prop-types": "^15.8.1",
"qhistory": "^1.1.0",
- "qs": "^6.12.3",
+ "qs": "^6.13.0",
"react": "^18.3.1",
"react-beautiful-dnd": "^13.1.1",
"react-dom": "^18.3.1",
@@ -73,21 +73,21 @@
"redux": "^5.0.1",
"redux-logger": "^3.0.6",
"resize-observer-polyfill": "^1.5.1",
- "styled-components": "^6.1.12",
+ "styled-components": "^6.1.13",
"uuid": "^10.0.0",
"whatwg-fetch": "^3.6.20"
},
"devDependencies": {
- "@babel/cli": "^7.24.8",
+ "@babel/cli": "^7.25.6",
"@pandatix/js-cvss": "^0.4.4",
- "@testing-library/jest-dom": "^6.4.8",
- "@testing-library/react": "^16.0.0",
+ "@testing-library/jest-dom": "^6.5.0",
+ "@testing-library/react": "^16.0.1",
"@testing-library/user-event": "^14.5.2",
- "@types/react": "^18.3.3",
+ "@types/react": "^18.3.5",
"@types/react-dom": "^18.3.0",
- "@typescript-eslint/eslint-plugin": "^8.0.0",
+ "@typescript-eslint/eslint-plugin": "^8.4.0",
"@typescript-eslint/parser": "^8.0.0",
- "@vitejs/plugin-legacy": "^5.4.1",
+ "@vitejs/plugin-legacy": "^5.4.2",
"@vitejs/plugin-react": "^4.3.1",
"@vitest/coverage-v8": "^2.0.5",
"@vitest/ui": "^2.0.5",
@@ -95,18 +95,18 @@
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-header": "^3.1.1",
- "eslint-plugin-react": "^7.35.0",
+ "eslint-plugin-react": "^7.35.2",
"eslint-plugin-react-hooks": "^4.6.2",
- "eslint-plugin-react-refresh": "^0.4.9",
+ "eslint-plugin-react-refresh": "^0.4.11",
"eslint-plugin-vitest": "^0.5.4",
"eslint-plugin-vitest-globals": "^1.5.0",
"husky": "^2.7.0",
"jest-styled-components": "^7.2.0",
- "jsdom": "^24.1.1",
+ "jsdom": "^25.0.0",
"lint-staged": "^13.1.0",
"prettier": "^3.3.3",
"typescript": "^5.5.4",
- "vite": "^5.3.5",
+ "vite": "^5.4.3",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-eslint2": "^4.4.0",
"vite-plugin-svgr": "^4.2.0",
diff --git a/public/locales/gsa-de.json b/public/locales/gsa-de.json
index 6c63b9d1e7..24abf6a859 100644
--- a/public/locales/gsa-de.json
+++ b/public/locales/gsa-de.json
@@ -160,6 +160,9 @@
"Audit made visible for:\n{{user}}\n{{role}}\n{{group}}": "Audit sichtbar gemacht für:\n{{user}}\n{{role}}\n{{group}}",
"Audit: {{name}}": "Audit: {{name}}",
"Audits": "Audits",
+ "Audit Reports by Compliance (Total: {{count}})": "Audit-Berichte nach Compliance (Gesamt: {{count}})",
+ "Audit Reports": "Audit-Berichte",
+ "Audit Report": "Audit-Bericht",
"Audits using this Policy": "Audits, die diese Richtlinie verwenden",
"Auth": "Auth.",
"Auth Algorithm": "Auth-Algorithmus",
@@ -245,6 +248,7 @@
"Certificate in use will expire at {{date}}": "Aktuelles Zertifikat wird am {{date}} ablaufen",
"Change Password": "Passwort ändern",
"Changed": "Verändert",
+ "Chart: Audit Reports by Compliance": "Diagramm: Audit-Berichte nach Compliance",
"Chart: CERT-Bund Advisories by CVSS": "Diagramm: CERT-Bund-Advisories nach CVSS",
"Chart: CERT-Bund Advisories by Creation Time": "Diagramm: CERT-Bund-Advisories nach Erstellungszeit",
"Chart: CERT-Bund Advisories by Severity Class": "Diagramm: CERT-Bund-Advisories nach Schweregradklasse",
@@ -325,6 +329,8 @@
"Complete": "Vollständig",
"Complexity": "Komplexität",
"Compliance Audits": "Compliance Audits",
+ "Compliance Audit Reports": "Compliance-Audit-Berichte",
+ "Compliance Percent": "Compliance-Prozent",
"Compliance Policies": "Compliance Richtlinien",
"Compliance Status": "Compliance Status",
"Compose": "Zusammenstellen",
@@ -849,6 +855,7 @@
"Include log messages in your filter settings.": "Log-Nachrichten in die Filtereinstellungen einbeziehen.",
"Include report": "Bericht einfügen",
"Included": "Beinhaltet",
+ "Incomplete": "Unvollständig",
"Info": "Info",
"Information": "Informationen",
"Inheriting user": "Erbender Benutzer",
@@ -1554,6 +1561,7 @@
"TLS Certificates by Modification Time (Total: {{count}})": "TLS-Zertifikate nach Änderungszeit (Gesamt: {{count}})",
"TLS Certificates by Status (Total: {{count}})": "TLS-Zertifikate nach Status (Gesamt: {{count}})",
"TLS Certificates for this Host": "TLS-Zertifikate für diesen Host",
+ "Table: Audit Reports by Compliance": "Tabelle: Audit-Berichte nach Compliance",
"Table: CERT-Bund Advisories by CVSS": "Tabelle: CERT-Bund-Advisories nach CVSS",
"Table: CERT-Bund Advisories by Creation Time": "Tabelle: CERT-Bund-Advisories nach Erstellungszeit",
"Table: CERT-Bund Advisories by Severity Class": "Tabelle: CERT-Bund-Advisories nach Schweregradklasse",
@@ -1920,6 +1928,7 @@
"task": "Aufgabe",
"to": "für",
"undefined": "undefiniert",
+ "Undefined": "Undefiniert",
"until {{- enddate}}": "bis {{- enddate}}",
"verinice Connector": "verinice-Konnektor",
"verinice.PRO Connector": "verinice.PRO-Konnektor",
diff --git a/src/gmp/capabilities/capabilities.js b/src/gmp/capabilities/capabilities.js
index f8baa0e991..297f9e8fc9 100644
--- a/src/gmp/capabilities/capabilities.js
+++ b/src/gmp/capabilities/capabilities.js
@@ -9,8 +9,8 @@ import {pluralizeType} from 'gmp/utils/entitytype';
import {parseBoolean} from 'gmp/parser';
const types = {
- audit: 'task',
- audits: 'task',
+ auditreport: 'audit_report',
+ auditreports: 'audit_reports',
host: 'asset',
hosts: 'asset',
os: 'asset',
@@ -42,12 +42,19 @@ const types = {
tlscertificates: 'tls_certificate',
};
+const subtypes = {
+ audit: 'task',
+ audits: 'task',
+ audit_report: 'report',
+ audit_reports: 'reports',
+};
+
const convertType = type => {
const ctype = types[type];
if (isDefined(ctype)) {
- return ctype;
+ type = ctype;
}
- return type;
+ return subtypes[type] || type;
};
class Capabilities {
diff --git a/src/gmp/commands/__tests__/auditreport.js b/src/gmp/commands/__tests__/auditreport.js
new file mode 100644
index 0000000000..d6eef9ec28
--- /dev/null
+++ b/src/gmp/commands/__tests__/auditreport.js
@@ -0,0 +1,33 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {describe, test, expect} from '@gsa/testing';
+import {createHttp, createEntityResponse} from 'gmp/commands/testing';
+import {AuditReportCommand} from 'gmp/commands/auditreports';
+
+describe('AuditReportCommand tests', () => {
+ test('should request single audit report', () => {
+ const response = createEntityResponse('report', {_id: 'foo'});
+ const fakeHttp = createHttp(response);
+
+ expect.hasAssertions();
+
+ const cmd = new AuditReportCommand(fakeHttp);
+ return cmd.get({id: 'foo'}).then(resp => {
+ expect(fakeHttp.request).toHaveBeenCalledWith('get', {
+ args: {
+ cmd: 'get_report',
+ report_id: 'foo',
+ ignore_pagination: 1,
+ details: 1,
+ lean: 1,
+ },
+ });
+
+ const {data} = resp;
+ expect(data.id).toEqual('foo');
+ });
+ });
+});
diff --git a/src/gmp/commands/__tests__/auditreports.js b/src/gmp/commands/__tests__/auditreports.js
new file mode 100644
index 0000000000..1169cfd917
--- /dev/null
+++ b/src/gmp/commands/__tests__/auditreports.js
@@ -0,0 +1,92 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {describe, test, expect} from '@gsa/testing';
+import {ALL_FILTER} from 'gmp/models/filter';
+
+import {
+ createHttp,
+ createEntitiesResponse,
+ createAggregatesResponse,
+} from '../testing';
+import {AuditReportsCommand} from 'gmp/commands/auditreports';
+
+describe('AuditReportsCommand tests', () => {
+ test('should return all audit reports', () => {
+ const response = createEntitiesResponse('report', [
+ {
+ _id: '1',
+ },
+ {
+ _id: '2',
+ },
+ ]);
+
+ const fakeHttp = createHttp(response);
+
+ expect.hasAssertions();
+
+ const cmd = new AuditReportsCommand(fakeHttp);
+ return cmd.getAll().then(resp => {
+ expect(fakeHttp.request).toHaveBeenCalledWith('get', {
+ args: {
+ cmd: 'get_reports',
+ details: 0,
+ filter: ALL_FILTER.toFilterString(),
+ usage_type: 'audit',
+ },
+ });
+ const {data} = resp;
+ expect(data.length).toEqual(2);
+ });
+ });
+
+ test('should return results', () => {
+ const response = createEntitiesResponse('report', [
+ {
+ _id: '1',
+ },
+ {
+ _id: '2',
+ },
+ ]);
+
+ const fakeHttp = createHttp(response);
+
+ expect.hasAssertions();
+
+ const cmd = new AuditReportsCommand(fakeHttp);
+ return cmd.get().then(resp => {
+ expect(fakeHttp.request).toHaveBeenCalledWith('get', {
+ args: {
+ cmd: 'get_reports',
+ details: 0,
+ usage_type: 'audit',
+ },
+ });
+ const {data} = resp;
+ expect(data.length).toEqual(2);
+ });
+ });
+
+ test('should aggregate compliance counts', () => {
+ const response = createAggregatesResponse();
+ const fakeHttp = createHttp(response);
+
+ expect.hasAssertions();
+
+ const cmd = new AuditReportsCommand(fakeHttp);
+ return cmd.getComplianceAggregates().then(resp => {
+ expect(fakeHttp.request).toHaveBeenCalledWith('get', {
+ args: {
+ cmd: 'get_aggregate',
+ aggregate_type: 'report',
+ group_column: 'compliant',
+ usage_type: 'audit',
+ },
+ });
+ });
+ });
+});
diff --git a/src/gmp/commands/__tests__/reports.js b/src/gmp/commands/__tests__/reports.js
index 07d7c03968..97cc6d922b 100644
--- a/src/gmp/commands/__tests__/reports.js
+++ b/src/gmp/commands/__tests__/reports.js
@@ -32,6 +32,7 @@ describe('ReportsCommand tests', () => {
cmd: 'get_reports',
details: 0,
filter: ALL_FILTER.toFilterString(),
+ usage_type: 'scan',
},
});
const {data} = resp;
@@ -59,6 +60,7 @@ describe('ReportsCommand tests', () => {
args: {
cmd: 'get_reports',
details: 0,
+ usage_type: 'scan',
},
});
const {data} = resp;
diff --git a/src/gmp/commands/auditreports.js b/src/gmp/commands/auditreports.js
new file mode 100644
index 0000000000..dcb6ccbebd
--- /dev/null
+++ b/src/gmp/commands/auditreports.js
@@ -0,0 +1,139 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {isDefined} from 'gmp/utils/identity';
+
+import registerCommand from 'gmp/command';
+
+import AuditReport from 'gmp/models/auditreport';
+
+import {ALL_FILTER} from 'gmp/models/filter';
+
+import DefaultTransform from 'gmp/http/transform/default';
+
+import {convertBoolean} from './convert';
+import EntitiesCommand from './entities';
+import EntityCommand from './entity';
+
+export class AuditReportsCommand extends EntitiesCommand {
+ constructor(http) {
+ super(http, 'report', AuditReport);
+ }
+
+ getEntitiesResponse(root) {
+ return root.get_reports.get_reports_response;
+ }
+
+ getComplianceAggregates({filter} = {}) {
+ return this.getAggregates({
+ aggregate_type: 'report',
+ group_column: 'compliant',
+ usage_type: 'audit',
+ filter,
+ });
+ }
+
+ get(params, options) {
+ return super.get(
+ {
+ details: 0,
+ ...params,
+ usage_type: 'audit',
+ },
+ options,
+ );
+ }
+}
+
+export class AuditReportCommand extends EntityCommand {
+ constructor(http) {
+ super(http, 'report', AuditReport);
+ }
+
+ download({id}, {reportFormatId, deltaReportId, filter}) {
+ return this.httpGet(
+ {
+ cmd: 'get_report',
+ delta_report_id: deltaReportId,
+ details: 1,
+ report_id: id,
+ report_format_id: reportFormatId,
+ filter: isDefined(filter) ? filter.all() : ALL_FILTER,
+ },
+ {transform: DefaultTransform, responseType: 'arraybuffer'},
+ );
+ }
+
+ addAssets({id}, {filter = ''}) {
+ return this.httpPost({
+ cmd: 'create_asset',
+ report_id: id,
+ filter,
+ });
+ }
+
+ removeAssets({id}, {filter = ''}) {
+ return this.httpPost({
+ cmd: 'delete_asset',
+ report_id: id,
+ filter,
+ });
+ }
+
+ alert({alert_id, report_id, filter}) {
+ return this.httpPost({
+ cmd: 'report_alert',
+ alert_id,
+ report_id,
+ filter,
+ });
+ }
+
+ getDelta(
+ {id},
+ {id: delta_report_id},
+ {filter, details = true, ...options} = {},
+ ) {
+ return this.httpGet(
+ {
+ id,
+ delta_report_id,
+ filter,
+ ignore_pagination: 1,
+ details: convertBoolean(details),
+ },
+ options,
+ ).then(this.transformResponse);
+ }
+
+ get(
+ {id},
+ {
+ filter,
+ details = true,
+ ignorePagination = true,
+ lean = true,
+ ...options
+ } = {},
+ ) {
+ return this.httpGet(
+ {
+ id,
+ filter,
+ lean: convertBoolean(lean),
+ ignore_pagination: convertBoolean(ignorePagination),
+ details: convertBoolean(details),
+ },
+ options,
+ ).then(this.transformResponse);
+ }
+
+ getElementFromRoot(root) {
+ return root.get_report.get_reports_response.report;
+ }
+}
+
+registerCommand('auditreport', AuditReportCommand);
+registerCommand('auditreports', AuditReportsCommand);
diff --git a/src/gmp/commands/reports.js b/src/gmp/commands/reports.js
index a1027e9160..b46fe58a23 100644
--- a/src/gmp/commands/reports.js
+++ b/src/gmp/commands/reports.js
@@ -52,6 +52,7 @@ export class ReportsCommand extends EntitiesCommand {
{
details: 0, // ensure to request no details by default
...params,
+ usage_type: 'scan',
},
options,
);
diff --git a/src/gmp/commands/users.js b/src/gmp/commands/users.js
index 45c4d20ee6..d4549a997d 100644
--- a/src/gmp/commands/users.js
+++ b/src/gmp/commands/users.js
@@ -38,6 +38,7 @@ export const ROWS_PER_PAGE_SETTING_ID = '5f5a8712-8017-11e1-8556-406186ea4fc5';
export const DEFAULT_FILTER_SETTINGS = {
alert: 'b833a6f2-dcdc-4535-bfb0-a5154b5b5092',
asset: '0f040d06-abf9-43a2-8f94-9de178b0e978',
+ auditreport: '45414da7-55f0-44c1-abbb-6b7d1126fbdf',
certbund: 'e4cf514a-17e2-4ab9-9c90-336f15e24750',
cpe: '3414a107-ae46-4dea-872d-5c4479a48e8f',
credential: '186a5ac8-fe5a-4fb1-aa22-44031fb339f3',
@@ -286,6 +287,7 @@ export class UserCommand extends EntityCommand {
data.defaultTarget,
[saveDefaultFilterSettingId('alert')]: data.alertsFilter,
[saveDefaultFilterSettingId('asset')]: data.assetsFilter,
+ [saveDefaultFilterSettingId('auditreport')]: data.auditReportsFilter,
[saveDefaultFilterSettingId('scanconfig')]: data.configsFilter,
[saveDefaultFilterSettingId('credential')]: data.credentialsFilter,
[saveDefaultFilterSettingId('filter')]: data.filtersFilter,
diff --git a/src/gmp/gmp.js b/src/gmp/gmp.js
index 463afccb7f..b27c9e21cd 100644
--- a/src/gmp/gmp.js
+++ b/src/gmp/gmp.js
@@ -10,6 +10,7 @@ import logger from 'gmp/log';
import 'gmp/commands/alerts';
import 'gmp/commands/audits';
+import 'gmp/commands/auditreports';
import 'gmp/commands/auth';
import 'gmp/commands/certbund';
import 'gmp/commands/credentials';
diff --git a/src/gmp/models/auditreport.js b/src/gmp/models/auditreport.js
new file mode 100644
index 0000000000..62438d2071
--- /dev/null
+++ b/src/gmp/models/auditreport.js
@@ -0,0 +1,65 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {_l} from 'gmp/locale/lang';
+
+import {isDefined} from 'gmp/utils/identity';
+
+import {parseDate} from 'gmp/parser';
+
+import Model, {parseModelFromElement} from 'gmp/model';
+
+import AuditReportReport from './report/auditreport';
+
+export const COMPLIANCE_STATES = {
+ yes: _l('Yes'),
+ no: _l('No'),
+ incomplete: _l('Incomplete'),
+ undefined: _l('Undefined'),
+};
+/* eslint-disable quote-props */
+
+export const getTranslatableReportCompliance = compliance =>
+ `${COMPLIANCE_STATES[compliance]}`;
+
+class AuditReport extends Model {
+ static entityType = 'auditreport';
+
+ static parseElement(element) {
+ const copy = super.parseElement(element);
+
+ const {
+ report,
+ report_format,
+ _type: type,
+ _content_type: content_type,
+ task,
+ scan_start,
+ scan_end,
+ timestamp,
+ } = element;
+
+ if (isDefined(report)) {
+ copy.report = AuditReportReport.fromElement(report);
+ }
+
+ copy.reportFormat = parseModelFromElement(report_format, 'reportformat');
+ copy.task = parseModelFromElement(task, 'task');
+
+ copy.reportType = type;
+ copy.contentType = content_type;
+
+ copy.scan_start = parseDate(scan_start);
+ copy.timestamp = parseDate(timestamp);
+
+ if (isDefined(scan_end)) {
+ copy.scan_end = parseDate(scan_end);
+ }
+
+ return copy;
+ }
+}
+
+export default AuditReport;
diff --git a/src/gmp/models/filter.js b/src/gmp/models/filter.js
index 630f12939d..c6842bccac 100644
--- a/src/gmp/models/filter.js
+++ b/src/gmp/models/filter.js
@@ -767,6 +767,8 @@ class Filter extends Model {
export const ALL_FILTER = new Filter().all();
export const ALERTS_FILTER_FILTER = Filter.fromString('type=alert');
+export const AUDIT_REPORTS_FILTER_FILTER =
+ Filter.fromString('type=audit_report');
export const CERTBUND_FILTER_FILTER = Filter.fromString('type=info');
export const CPES_FILTER_FILTER = Filter.fromString('type=info');
export const CREDENTIALS_FILTER_FILTER = Filter.fromString('type=credential');
diff --git a/src/gmp/models/filter/keywords.js b/src/gmp/models/filter/keywords.js
index bbc4e8d305..ac10c62828 100644
--- a/src/gmp/models/filter/keywords.js
+++ b/src/gmp/models/filter/keywords.js
@@ -5,12 +5,14 @@
export const EXTRA_KEYWORDS = [
'apply_overrides',
+ 'compliance_levels',
'delta_states',
'first',
'levels',
'min_qod',
'notes',
'overrides',
+ 'report_compliance_levels',
'result_hosts_only',
'rows',
'solution_type',
diff --git a/src/gmp/models/report/auditreport.js b/src/gmp/models/report/auditreport.js
new file mode 100644
index 0000000000..18e69b4558
--- /dev/null
+++ b/src/gmp/models/report/auditreport.js
@@ -0,0 +1,140 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {isDefined} from 'gmp/utils/identity';
+import {isEmpty} from 'gmp/utils/string';
+
+import {parseDate} from 'gmp/parser';
+
+import {parseFilter} from 'gmp/collection/parser';
+
+import Model from 'gmp/model';
+
+import ReportTask from './task';
+
+import {
+ parse_errors,
+ parseHosts,
+ parseOperatingSystems,
+ parseResults,
+ parseTlsCertificates,
+} from './parser';
+
+class AuditReportReport extends Model {
+ static entityType = 'auditreport';
+
+ parseProperties(element) {
+ return AuditReportReport.parseElement(element);
+ }
+
+ static parseElement(element) {
+ const copy = super.parseElement(element);
+
+ const {
+ delta,
+ compliance,
+ compliance_count,
+ scan_start,
+ scan_end,
+ task,
+ scan,
+ timestamp,
+ } = element;
+
+ const filter = parseFilter(element);
+
+ copy.filter = filter;
+
+ copy.reportType = element._type;
+
+ delete copy.filters;
+
+ if (isDefined(compliance)) {
+ copy.compliance = {
+ filtered: compliance.filtered,
+ full: compliance.full,
+ };
+ }
+
+ if (isDefined(compliance_count)) {
+ copy.complianceCounts = {
+ filtered: parseInt(compliance_count.filtered),
+ full: parseInt(compliance_count.full),
+ incomplete: {
+ filtered: parseInt(compliance_count.incomplete.filtered),
+ full: parseInt(compliance_count.incomplete.full),
+ },
+ no: {
+ filtered: parseInt(compliance_count.no.filtered),
+ full: parseInt(compliance_count.no.full),
+ },
+ undefined: {
+ filtered: parseInt(compliance_count.undefined.filtered),
+ full: parseInt(compliance_count.undefined.full),
+ },
+ yes: {
+ filtered: parseInt(compliance_count.yes.filtered),
+ full: parseInt(compliance_count.yes.full),
+ },
+ };
+ }
+
+ delete copy.compliance_count;
+
+ copy.task = ReportTask.fromElement(task);
+
+ copy.results = parseResults(element, filter);
+
+ copy.hosts = parseHosts(element, filter);
+
+ copy.tlsCertificates = parseTlsCertificates(element, filter);
+
+ delete copy.host;
+
+ copy.operatingSystems = parseOperatingSystems(element, filter);
+
+ copy.errors = parse_errors(element, filter);
+
+ copy.scan_start = parseDate(scan_start);
+
+ if (isDefined(scan_end)) {
+ copy.scan_end = parseDate(scan_end);
+ }
+
+ if (isDefined(timestamp)) {
+ copy.timestamp = parseDate(timestamp);
+ }
+
+ if (isDefined(scan) && isDefined(scan.task) && isDefined(scan.task.slave)) {
+ if (isEmpty(scan.task.slave._id)) {
+ delete copy.scan.task.slave;
+ } else {
+ copy.slave = {
+ ...scan.task.slave,
+ };
+ }
+ }
+
+ if (isDefined(delta) && isDefined(delta.report)) {
+ copy.delta_report = {
+ id: delta.report._id,
+ scan_run_status: delta.report.scan_run_status,
+ scan_end: parseDate(delta.report.scan_end),
+ scan_start: parseDate(delta.report.scan_start),
+ timestamp: parseDate(delta.report.timestamp),
+ };
+
+ delete copy.delta;
+ }
+
+ return copy;
+ }
+
+ isDeltaReport() {
+ return this.reportType === 'delta';
+ }
+}
+
+export default AuditReportReport;
diff --git a/src/gmp/models/report/host.js b/src/gmp/models/report/host.js
index a892d6d567..86a2b7dbc2 100644
--- a/src/gmp/models/report/host.js
+++ b/src/gmp/models/report/host.js
@@ -37,6 +37,12 @@ class Host {
warning: 0,
total: 0,
};
+ this.complianceCounts = {
+ yes: 0,
+ no: 0,
+ incomplete: 0,
+ total: 0,
+ };
}
static fromElement(element) {
@@ -50,7 +56,19 @@ class Host {
static parseElement(element = {}) {
const copy = {...element};
- const {asset = {}, port_count = {}, result_count} = element;
+ const {
+ asset = {},
+ port_count = {},
+ result_count,
+ compliance_count,
+ host_compliance,
+ } = element;
+
+ copy.hostCompliance = isDefined(host_compliance)
+ ? host_compliance
+ : 'undefined';
+
+ delete copy.host_compliance;
if (isEmpty(asset._asset_id)) {
delete copy.asset;
@@ -81,10 +99,29 @@ class Host {
};
}
+ if (isDefined(compliance_count)) {
+ copy.complianceCounts = {
+ yes: parse_page_count(compliance_count.yes),
+ no: parse_page_count(compliance_count.no),
+ incomplete: parse_page_count(compliance_count.incomplete),
+ undefined: parse_page_count(compliance_count.undefined),
+ total: parse_page_count(compliance_count),
+ };
+ } else {
+ copy.complianceCounts = {
+ yes: 0,
+ no: 0,
+ incomplete: 0,
+ undefined: 0,
+ total: 0,
+ };
+ }
+
copy.start = parseDate(element.start);
copy.end = parseDate(element.end);
delete copy.result_count;
+ delete copy.compliance_count;
copy.authSuccess = {};
copy.details = {};
diff --git a/src/gmp/models/report/os.js b/src/gmp/models/report/os.js
index e90ed54b94..ebc6188e3d 100644
--- a/src/gmp/models/report/os.js
+++ b/src/gmp/models/report/os.js
@@ -11,6 +11,7 @@ class OperatingSystem {
constructor() {
this.hosts = {
hostsByIp: {},
+ complianceByIp: {},
count: 0,
};
}
@@ -22,6 +23,31 @@ class OperatingSystem {
}
}
+ addHostCompliance(host, compliance) {
+ if (!(host.ip in this.hosts.complianceByIp)) {
+ this.hosts.complianceByIp[host.ip] = compliance;
+ }
+ const complianceByIpValues = Object.values(this.hosts.complianceByIp);
+
+ const isNoInCompliance = complianceByIpValues.some(value => value === 'no');
+ const isIncompleteInCompliance = complianceByIpValues.some(
+ value => value === 'incomplete',
+ );
+ const isYesInCompliance = complianceByIpValues.some(
+ value => value === 'yes',
+ );
+
+ if (isNoInCompliance) {
+ this.compliance = 'no';
+ } else if (isIncompleteInCompliance) {
+ this.compliance = 'incomplete';
+ } else if (isYesInCompliance) {
+ this.compliance = 'yes';
+ } else {
+ this.compliance = 'undefined';
+ }
+ }
+
setSeverity(severity) {
if (!isDefined(this.severity) || this.severity < severity) {
this.severity = severity;
diff --git a/src/gmp/models/report/parser.js b/src/gmp/models/report/parser.js
index 5895286acb..7cf6ae8ffd 100644
--- a/src/gmp/models/report/parser.js
+++ b/src/gmp/models/report/parser.js
@@ -305,7 +305,7 @@ export const parseOperatingSystems = (report, filter) => {
const severities = parseHostSeverities(results);
forEach(hosts, host => {
- const {detail: details, ip} = host;
+ const {detail: details, ip, host_compliance} = host;
let best_os_cpe;
let best_os_txt;
@@ -334,6 +334,7 @@ export const parseOperatingSystems = (report, filter) => {
os.addHost(host);
os.setSeverity(severity);
+ os.addHostCompliance(host, host_compliance);
}
}
});
@@ -397,7 +398,7 @@ export const parseHosts = (report, filter) => {
const parse_report_report_counts = elem => {
const es = isDefined(elem.results) ? elem.results : {};
- const ec = elem.result_count;
+ const ec = elem.result_count ? elem.result_count : elem.compliance_count;
const length = isDefined(es.result) ? es.result.length : 0;
@@ -412,9 +413,13 @@ const parse_report_report_counts = elem => {
};
export const parseResults = (report, filter) => {
- const {results, result_count} = report;
+ const {results, result_count, compliance_count} = report;
- if (!isDefined(results) && !isDefined(result_count)) {
+ if (
+ !isDefined(results) &&
+ !isDefined(result_count) &&
+ !isDefined(compliance_count)
+ ) {
return undefined;
// instead of returning empty_collection_list(filter) we return an undefined
// in order to query if results have been loaded and make a difference to
diff --git a/src/gmp/models/result.js b/src/gmp/models/result.js
index 480420797f..862aeca100 100644
--- a/src/gmp/models/result.js
+++ b/src/gmp/models/result.js
@@ -41,6 +41,7 @@ class Result extends Model {
const copy = super.parseElement(element);
const {
+ compliance,
description,
detection,
host = {},
@@ -87,6 +88,10 @@ class Result extends Model {
copy.description = description;
}
+ if (isDefined(compliance)) {
+ copy.compliance = compliance;
+ }
+
if (isDefined(severity)) {
copy.severity = parseSeverity(severity);
}
diff --git a/src/gmp/utils/entitytype.js b/src/gmp/utils/entitytype.js
index 6938a59eb1..815cd00d42 100644
--- a/src/gmp/utils/entitytype.js
+++ b/src/gmp/utils/entitytype.js
@@ -34,6 +34,7 @@ export const pluralizeType = type => {
return type + 's';
};
const TYPES = {
+ audit_report: 'auditreport',
config: 'scanconfig',
cert_bund_adv: 'certbund',
dfn_cert_adv: 'dfncert',
@@ -61,6 +62,8 @@ export const normalizeType = type => {
const ENTITY_TYPES = {
alert: _l('Alert'),
asset: _l('Asset'),
+ audit: _l('Audit'),
+ auditreport: _l('Audit Report'),
certbund: _l('CERT-Bund Advisory'),
cpe: _l('CPE'),
credential: _l('Credential'),
@@ -75,6 +78,7 @@ const ENTITY_TYPES = {
note: _l('Note'),
nvt: _l('NVT'),
permission: _l('Permission'),
+ policy: _l('Policy'),
portlist: _l('Port List'),
portrange: _l('Port Range'),
report: _l('Report'),
@@ -108,6 +112,7 @@ export const typeName = type => {
};
const CMD_TYPES = {
+ auditreport: 'audit_report',
scanconfig: 'config',
certbund: 'cert_bund_adv',
dfncert: 'dfn_cert_adv',
diff --git a/src/version.js b/src/version.js
index a7081ca6ed..813e3788dd 100644
--- a/src/version.js
+++ b/src/version.js
@@ -14,7 +14,7 @@ const getMajorMinorVersion = () => {
return `${major}.${minor}`;
};
-export const VERSION = '23.2.2-dev1';
+export const VERSION = '23.3.1-dev1';
export const RELEASE_VERSION = getMajorMinorVersion();
diff --git a/src/web/components/bar/compliancebar.jsx b/src/web/components/bar/compliancebar.jsx
new file mode 100644
index 0000000000..9f17e89fc9
--- /dev/null
+++ b/src/web/components/bar/compliancebar.jsx
@@ -0,0 +1,44 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import React from 'react';
+
+import {isDefined} from 'gmp/utils/identity';
+
+import PropTypes from 'web/utils/proptypes';
+import Theme from 'web/utils/theme';
+
+import ProgressBar from './progressbar';
+import {getTranslatableReportCompliance} from 'gmp/models/auditreport';
+
+const ComplianceBar = ({compliance, toolTip}) => {
+ const title = getTranslatableReportCompliance(compliance);
+
+ let background;
+ if (compliance === 'no') {
+ background = Theme.complianceNo;
+ } else if (compliance === 'incomplete') {
+ background = Theme.complianceIncomplete;
+ } else if (compliance === 'yes') {
+ background = Theme.complianceYes;
+ } else {
+ background = Theme.complianceUndefined;
+ }
+
+ const toolTipText = isDefined(toolTip) ? toolTip : title;
+
+ return (
+
+ {title}
+
+ );
+};
+
+ComplianceBar.propTypes = {
+ compliance: PropTypes.string,
+ toolTip: PropTypes.string,
+};
+
+export default ComplianceBar;
\ No newline at end of file
diff --git a/src/web/components/bar/compliancestatusbar.jsx b/src/web/components/bar/compliancestatusbar.jsx
index a3fbe98afe..16917b57f2 100644
--- a/src/web/components/bar/compliancestatusbar.jsx
+++ b/src/web/components/bar/compliancestatusbar.jsx
@@ -5,7 +5,7 @@
import React from 'react';
-import _ from 'gmp/locale';
+import useTranslation from 'web/hooks/useTranslation';
import PropTypes from 'web/utils/proptypes';
import Theme from 'web/utils/theme';
@@ -15,6 +15,7 @@ import ProgressBar from 'web/components/bar/progressbar';
const ComplianceStatusBar = ({complianceStatus}) => {
let text;
let boxBackground;
+ const [_] = useTranslation();
if (complianceStatus < 0 || complianceStatus > 100) {
text = _('N/A');
boxBackground = Theme.darkGrey;
diff --git a/src/web/components/dashboard/display/createDisplay.jsx b/src/web/components/dashboard/display/createDisplay.jsx
index b6b43b1b29..520777b8ae 100644
--- a/src/web/components/dashboard/display/createDisplay.jsx
+++ b/src/web/components/dashboard/display/createDisplay.jsx
@@ -16,13 +16,20 @@ const createDisplay = ({
displayId,
displayName,
filtersFilter,
+ filterTerm,
loaderComponent: Loader,
...other
}) => {
const DisplayComponent = ({filter, ...props}) => (
{loaderProps => (
-
+
{isDefined(Chart)
? displayProps =>
: undefined}
diff --git a/src/web/components/dashboard/display/utils.jsx b/src/web/components/dashboard/display/utils.jsx
index 60a8e98838..24a76501bf 100644
--- a/src/web/components/dashboard/display/utils.jsx
+++ b/src/web/components/dashboard/display/utils.jsx
@@ -10,6 +10,8 @@ import {scaleOrdinal, scaleLinear} from 'd3-scale';
import {parseInt} from 'gmp/parser';
+import {COMPLIANCE_STATES} from 'gmp/models/auditreport';
+
import {
ERROR,
DEBUG,
@@ -149,4 +151,8 @@ export const secInfoTypeColorScale = scaleOrdinal()
'#80c674', // Nvts
]);
+export const complianceColorScale = scaleOrdinal()
+ .domain(Object.keys(COMPLIANCE_STATES))
+ .range(['#4cb045', '#D80000', 'orange', 'silver']);
+
// vim: set ts=2 sw=2 tw=80:
diff --git a/src/web/components/dialog/content.jsx b/src/web/components/dialog/content.jsx
index fa55449cec..88f2948afc 100644
--- a/src/web/components/dialog/content.jsx
+++ b/src/web/components/dialog/content.jsx
@@ -3,6 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
+
import styled from 'styled-components';
const DialogContent = styled.div`
diff --git a/src/web/components/icon/downloadicon.jsx b/src/web/components/icon/downloadicon.jsx
index a5854c9ac4..b56f058abb 100644
--- a/src/web/components/icon/downloadicon.jsx
+++ b/src/web/components/icon/downloadicon.jsx
@@ -3,6 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
+
import withSvgIcon from './withSvgIcon';
import {Download as Icon} from 'lucide-react';
diff --git a/src/web/components/icon/exporticon.jsx b/src/web/components/icon/exporticon.jsx
index ae7a4e892a..0ab1f72436 100644
--- a/src/web/components/icon/exporticon.jsx
+++ b/src/web/components/icon/exporticon.jsx
@@ -3,6 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
+
import React from 'react';
import _ from 'gmp/locale';
diff --git a/src/web/components/label/compliancestate.jsx b/src/web/components/label/compliancestate.jsx
new file mode 100644
index 0000000000..065d371f13
--- /dev/null
+++ b/src/web/components/label/compliancestate.jsx
@@ -0,0 +1,55 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import styled from 'styled-components';
+import PropTypes from 'web/utils/proptypes';
+import useTranslation from 'web/hooks/useTranslation';
+import Theme from 'web/utils/theme';
+
+const Label = styled.div`
+ text-align: center;
+ font-weight: normal;
+ font-style: normal;
+ color: white;
+ padding: 1px;
+ display: inline-block;
+ width: 70px;
+ height: 1.5em;
+ font-size: 0.8em;
+ background-color: ${props => props.$backgroundColor};
+ border-color: ${props => props.$borderColor};
+`;
+
+const ComplianceLabel = ({text, color, ...props}) => {
+ const [_] = useTranslation();
+ return (
+
+ {_(text)}
+
+ )
+};
+
+ComplianceLabel.propTypes = {
+ text: PropTypes.string,
+ color: PropTypes.string,
+};
+
+const YesLabel = props => ;
+const NoLabel = props => ;
+const IncompleteLabel = props => ;
+const UndefinedLabel = props => ;
+
+export const ComplianceStateLabels = {
+ Yes: YesLabel,
+ No: NoLabel,
+ Incomplete: IncompleteLabel,
+ Undefined: UndefinedLabel,
+};
+
+export default ComplianceStateLabels;
\ No newline at end of file
diff --git a/src/web/components/menu/menu.jsx b/src/web/components/menu/menu.jsx
index 64b9d5d755..5e6a5ebca3 100644
--- a/src/web/components/menu/menu.jsx
+++ b/src/web/components/menu/menu.jsx
@@ -23,6 +23,7 @@ import {
FileCheck,
CircleHelp,
} from 'lucide-react';
+import {isDefined} from 'gmp/utils/identity';
const Menu = () => {
const [_] = useTranslation();
@@ -144,6 +145,12 @@ const Menu = () => {
to: '/audits',
activeCondition: useIsActive('/audits'),
},
+ {
+ label: 'Compliance Audit Reports',
+ to: '/auditreports',
+ activeCondition: useIsActive('/auditreports'),
+ featureEnabled: 'COMPLIANCE_REPORTS',
+ },
],
secInfo: [
{
@@ -236,12 +243,15 @@ const Menu = () => {
key: key,
icon: icon,
subNav: config
- .map(({label, to, activeCondition}) => ({
+ .map(({label, to, activeCondition, featureEnabled}) => ({
label: _(label),
to: to,
active: activeCondition,
+ visible:
+ !isDefined(featureEnabled) ||
+ capabilities.featureEnabled(featureEnabled),
}))
- .filter(Boolean),
+ .filter(({visible}) => visible !== false),
});
const menuPoints = [
diff --git a/src/web/components/powerfilter/__tests__/compliancelevelsgroup.jsx b/src/web/components/powerfilter/__tests__/compliancelevelsgroup.jsx
new file mode 100644
index 0000000000..3454b78e68
--- /dev/null
+++ b/src/web/components/powerfilter/__tests__/compliancelevelsgroup.jsx
@@ -0,0 +1,239 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {describe, test, expect, testing} from '@gsa/testing';
+import {render, fireEvent} from 'web/utils/testing';
+
+import ComplianceLevelsFilterGroup from 'web/components/powerfilter/compliancelevelsgroup';
+
+import Filter from 'gmp/models/filter';
+
+describe('ComplianceLevelsFilterGroup audit reports tests', () => {
+ test('should call change handler', () => {
+ const filter = Filter.fromString('report_compliance_levels=');
+ const handleChange = testing.fn();
+ const handleRemove = testing.fn();
+ const {element} = render(
+ ,
+ );
+
+ const checkbox = element.querySelectorAll('input');
+ fireEvent.click(checkbox[0]);
+
+ expect(handleChange).toHaveBeenCalled();
+ expect(handleChange).toHaveBeenCalledWith('y', 'report_compliance_levels');
+ });
+
+ test('should check checkbox', () => {
+ const filter = Filter.fromString('report_compliance_levels=yn');
+ const handleChange = testing.fn();
+ const handleRemove = testing.fn();
+ const {element} = render(
+ ,
+ );
+
+ const checkbox = element.querySelectorAll('input');
+
+ expect(checkbox[0].checked).toEqual(true);
+ expect(checkbox[1].checked).toEqual(true);
+ });
+
+ test('should uncheck checkbox', () => {
+ const filter1 = Filter.fromString('report_compliance_levels=yni');
+ const filter2 = Filter.fromString('report_compliance_levels=yn');
+ const handleChange = testing.fn();
+ const handleRemove = testing.fn();
+ const {element, rerender} = render(
+ ,
+ );
+
+ const checkbox = element.querySelectorAll('input');
+
+ expect(checkbox[0].checked).toEqual(true);
+ expect(checkbox[1].checked).toEqual(true);
+ expect(checkbox[1].checked).toEqual(true);
+
+ rerender(
+ ,
+ );
+
+ expect(checkbox[0].checked).toEqual(true);
+ expect(checkbox[1].checked).toEqual(true);
+ expect(checkbox[2].checked).toEqual(false);
+ });
+
+ test('should be unchecked by default', () => {
+ const filter = Filter.fromString();
+ const handleChange = testing.fn();
+ const handleRemove = testing.fn();
+ const {element} = render(
+ ,
+ );
+
+ const checkbox = element.querySelectorAll('input');
+
+ expect(checkbox[0].checked).toEqual(false);
+ expect(checkbox[1].checked).toEqual(false);
+ expect(checkbox[2].checked).toEqual(false);
+ expect(checkbox[3].checked).toEqual(false);
+ });
+
+ test('should call remove handler', () => {
+ const filter = Filter.fromString('report_compliance_levels=y');
+ const handleChange = testing.fn();
+ const handleRemove = testing.fn();
+ const {element} = render(
+ ,
+ );
+
+ const checkbox = element.querySelectorAll('input');
+ expect(checkbox[0].checked).toEqual(true);
+
+ fireEvent.click(checkbox[0]);
+
+ expect(handleRemove).toHaveBeenCalled();
+ });
+});
+
+describe('ComplianceLevelsFilterGroup audit results tests', () => {
+ test('should call change handler', () => {
+ const filter = Filter.fromString('compliance_levels=');
+ const handleChange = testing.fn();
+ const handleRemove = testing.fn();
+ const {element} = render(
+ ,
+ );
+
+ const checkbox = element.querySelectorAll('input');
+ fireEvent.click(checkbox[0]);
+
+ expect(handleChange).toHaveBeenCalled();
+ expect(handleChange).toHaveBeenCalledWith('y', 'compliance_levels');
+ });
+
+ test('should check checkbox', () => {
+ const filter = Filter.fromString('compliance_levels=yn');
+ const handleChange = testing.fn();
+ const handleRemove = testing.fn();
+ const {element} = render(
+ ,
+ );
+
+ const checkbox = element.querySelectorAll('input');
+
+ expect(checkbox[0].checked).toEqual(true);
+ expect(checkbox[1].checked).toEqual(true);
+ });
+
+ test('should uncheck checkbox', () => {
+ const filter1 = Filter.fromString('compliance_levels=yni');
+ const filter2 = Filter.fromString('compliance_levels=yn');
+ const handleChange = testing.fn();
+ const handleRemove = testing.fn();
+ const {element, rerender} = render(
+ ,
+ );
+
+ const checkbox = element.querySelectorAll('input');
+
+ expect(checkbox[0].checked).toEqual(true);
+ expect(checkbox[1].checked).toEqual(true);
+ expect(checkbox[1].checked).toEqual(true);
+
+ rerender(
+ ,
+ );
+
+ expect(checkbox[0].checked).toEqual(true);
+ expect(checkbox[1].checked).toEqual(true);
+ expect(checkbox[2].checked).toEqual(false);
+ });
+
+ test('should be unchecked by default', () => {
+ const filter = Filter.fromString();
+ const handleChange = testing.fn();
+ const handleRemove = testing.fn();
+ const {element} = render(
+ ,
+ );
+
+ const checkbox = element.querySelectorAll('input');
+
+ expect(checkbox[0].checked).toEqual(false);
+ expect(checkbox[1].checked).toEqual(false);
+ expect(checkbox[2].checked).toEqual(false);
+ expect(checkbox[3].checked).toEqual(false);
+ });
+
+ test('should call remove handler', () => {
+ const filter = Filter.fromString('compliance_levels=y');
+ const handleChange = testing.fn();
+ const handleRemove = testing.fn();
+ const {element} = render(
+ ,
+ );
+
+ const checkbox = element.querySelectorAll('input');
+ expect(checkbox[0].checked).toEqual(true);
+
+ fireEvent.click(checkbox[0]);
+
+ expect(handleRemove).toHaveBeenCalled();
+ });
+});
diff --git a/src/web/components/powerfilter/compliancelevelsgroup.jsx b/src/web/components/powerfilter/compliancelevelsgroup.jsx
new file mode 100644
index 0000000000..272b4882d6
--- /dev/null
+++ b/src/web/components/powerfilter/compliancelevelsgroup.jsx
@@ -0,0 +1,105 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+
+import React from 'react';
+
+import useTranslation from 'web/hooks/useTranslation';
+
+import {isDefined} from 'gmp/utils/identity';
+
+import PropTypes from 'web/utils/proptypes';
+
+import Checkbox from 'web/components/form/checkbox';
+import FormGroup from 'web/components/form/formgroup';
+
+import IconDivider from 'web/components/layout/icondivider';
+
+import ComplianceStateLabels from 'web/components/label/compliancestate';
+
+const ComplianceLevelsFilterGroup = ({
+ filter,
+ onChange,
+ onRemove,
+ isResult = false,
+}) => {
+ const [_] = useTranslation();
+
+ const handleComplianceChange = (value, level) => {
+ const filterName = isResult
+ ? 'compliance_levels'
+ : 'report_compliance_levels';
+
+ let compliance = filter.get(filterName);
+
+ if (!compliance) {
+ compliance = '';
+ }
+
+ if (value && !compliance.includes(level)) {
+ compliance += level;
+ onChange(compliance, filterName);
+ } else if (!value && compliance.includes(level)) {
+ compliance = compliance.replace(level, '');
+
+ if (compliance.trim().length === 0) {
+ onRemove();
+ } else {
+ onChange(compliance, filterName);
+ }
+ }
+ };
+
+ let complianceLevels = filter.get(
+ isResult ? 'compliance_levels' : 'report_compliance_levels',
+ );
+
+ if (!isDefined(complianceLevels)) {
+ complianceLevels = '';
+ }
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+ComplianceLevelsFilterGroup.propTypes = {
+ filter: PropTypes.filter.isRequired,
+ isResult: PropTypes.bool,
+ onChange: PropTypes.func.isRequired,
+ onRemove: PropTypes.func.isRequired,
+};
+
+export default ComplianceLevelsFilterGroup;
\ No newline at end of file
diff --git a/src/web/components/powerfilter/filterstringgroup.jsx b/src/web/components/powerfilter/filterstringgroup.jsx
index cd5d11a636..1d2b432c22 100644
--- a/src/web/components/powerfilter/filterstringgroup.jsx
+++ b/src/web/components/powerfilter/filterstringgroup.jsx
@@ -3,6 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
+
import React from 'react';
import {isString} from 'gmp/utils/identity';
diff --git a/src/web/components/powerfilter/sortbygroup.jsx b/src/web/components/powerfilter/sortbygroup.jsx
index 1e93a87050..33196118ac 100644
--- a/src/web/components/powerfilter/sortbygroup.jsx
+++ b/src/web/components/powerfilter/sortbygroup.jsx
@@ -3,6 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
+
import React from 'react';
import {isDefined} from 'gmp/utils/identity';
diff --git a/src/web/components/powerfilter/ticketstatusgroup.jsx b/src/web/components/powerfilter/ticketstatusgroup.jsx
index 28bdaff24f..e24d8e2ba9 100644
--- a/src/web/components/powerfilter/ticketstatusgroup.jsx
+++ b/src/web/components/powerfilter/ticketstatusgroup.jsx
@@ -3,6 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
+
import React from 'react';
import {isDefined} from 'gmp/utils/identity';
diff --git a/src/web/components/structure/footer.jsx b/src/web/components/structure/footer.jsx
index 64bd1aa158..e3c77463bc 100644
--- a/src/web/components/structure/footer.jsx
+++ b/src/web/components/structure/footer.jsx
@@ -3,6 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
+
import React from 'react';
import styled from 'styled-components';
diff --git a/src/web/entities/container.jsx b/src/web/entities/container.jsx
index 0386e7d4d9..74ed3b87c1 100644
--- a/src/web/entities/container.jsx
+++ b/src/web/entities/container.jsx
@@ -3,6 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
+
import React from 'react';
import {withRouter} from 'react-router-dom';
diff --git a/src/web/pages/alerts/scpmethodpart.jsx b/src/web/pages/alerts/scpmethodpart.jsx
index 1ca328b9b3..92b4063de7 100644
--- a/src/web/pages/alerts/scpmethodpart.jsx
+++ b/src/web/pages/alerts/scpmethodpart.jsx
@@ -137,7 +137,7 @@ const ScpMethodPart = ({
{capabilities.mayOp('get_report_configs') && (
<>
- Report Config
+ Report Config {' '}
{
console.warn = consoleError;
});
+
+describe('Audit Row tests - compliance reports enabled', () => {
+ // deactivate console.error for tests
+ // to make it possible to test a row without a table
+ console.error = () => {};
+ const featureList = [
+ {name: 'COMPLIANCE_REPORTS', _enabled: 1},
+ ];
+ const caps = new Capabilities(['everything'], featureList);
+
+ test('should render', () => {
+ const audit = Audit.fromElement({
+ _id: '314',
+ owner: {name: 'username'},
+ name: 'foo',
+ comment: 'bar',
+ status: AUDIT_STATUS.done,
+ alterable: '0',
+ last_report: lastReport,
+ permissions: {permission: [{name: 'everything'}]},
+ target: {_id: '5678', name: 'target'},
+ usage_type: 'audit',
+ });
+
+ const handleAuditClone = testing.fn();
+ const handleAuditDelete = testing.fn();
+ const handleAuditDownload = testing.fn();
+ const handleAuditEdit = testing.fn();
+ const handleAuditResume = testing.fn();
+ const handleAuditStart = testing.fn();
+ const handleAuditStop = testing.fn();
+ const handleReportDownload = testing.fn();
+ const handleToggleDetailsClick = testing.fn();
+
+ const {render, store} = rendererWith({
+ gmp,
+ capabilities: caps,
+ store: true,
+ router: true,
+ });
+
+ store.dispatch(setTimezone('CET'));
+ store.dispatch(setUsername('username'));
+
+ const {baseElement, getAllByTestId} = render(
+
,
+ );
+
+ expect(baseElement).toBeVisible();
+
+ // Name
+ expect(baseElement).toHaveTextContent('foo');
+ expect(baseElement).toHaveTextContent('(bar)');
+
+ // Status
+ const bars = getAllByTestId('progressbar-box');
+
+ expect(bars[0]).toHaveAttribute('title', AUDIT_STATUS.done);
+ expect(bars[0]).toHaveTextContent(AUDIT_STATUS.done);
+
+ const detailsLinks = getAllByTestId('details-link');
+
+ expect(detailsLinks[0]).toHaveTextContent('Done');
+ expect(detailsLinks[0]).toHaveAttribute('href', '/auditreport/1234');
+
+ // Report
+ expect(detailsLinks[1]).toHaveTextContent('Wed, Jul 10, 2019 2:51 PM CEST');
+ expect(detailsLinks[1]).toHaveAttribute('href', '/auditreport/1234');
+
+ // Compliance Status
+ expect(bars[1]).toHaveAttribute('title', '50%');
+ expect(bars[1]).toHaveTextContent('50%');
+
+ // Actions
+ const icons = getAllByTestId('svg-icon');
+
+ expect(icons[0]).toHaveAttribute('title', 'Start');
+ expect(icons[1]).toHaveAttribute('title', 'Audit is not stopped');
+ expect(icons[2]).toHaveAttribute('title', 'Move Audit to trashcan');
+ expect(icons[3]).toHaveAttribute('title', 'Edit Audit');
+ expect(icons[4]).toHaveAttribute('title', 'Clone Audit');
+ expect(icons[5]).toHaveAttribute('title', 'Export Audit');
+ expect(icons[6]).toHaveAttribute(
+ 'title',
+ 'Download Greenbone Compliance Report',
+ );
+ });
+});
\ No newline at end of file
diff --git a/src/web/pages/audits/__tests__/table.jsx b/src/web/pages/audits/__tests__/table.jsx
index 6565ef2c42..8894e25431 100644
--- a/src/web/pages/audits/__tests__/table.jsx
+++ b/src/web/pages/audits/__tests__/table.jsx
@@ -134,7 +134,7 @@ describe('Audits table tests', () => {
expect(header[0]).toHaveTextContent('Name');
expect(header[1]).toHaveTextContent('Status');
expect(header[2]).toHaveTextContent('Report');
- expect(header[3]).toHaveTextContent('Compliance Status');
+ expect(header[3]).toHaveTextContent('Compliance Percent');
expect(header[4]).toHaveTextContent('Actions');
});
diff --git a/src/web/pages/audits/row.jsx b/src/web/pages/audits/row.jsx
index 7eca63a339..d8f46e3b77 100644
--- a/src/web/pages/audits/row.jsx
+++ b/src/web/pages/audits/row.jsx
@@ -37,6 +37,22 @@ import {GREENBONE_SENSOR_SCANNER_TYPE} from 'gmp/models/scanner';
import ComplianceStatusBar from 'web/components/bar/compliancestatusbar';
import {renderReport} from 'web/pages/tasks/row';
+import DateTime from 'web/components/date/datetime';
+import DetailsLink from 'web/components/link/detailslink';
+import useCapabilities from 'web/hooks/useCapabilities';
+
+const renderAuditReport = (report, links) => {
+ if (!isDefined(report)) {
+ return null;
+ }
+ return (
+
+
+
+
+
+ );
+};
const getComplianceStatus = report => {
if (!isDefined(report)) {
@@ -69,8 +85,8 @@ const Row = ({
...props
}) => {
const {scanner, observers} = entity;
-
const obs = [];
+ const caps = useCapabilities();
if (isDefined(observers)) {
if (isDefined(observers.user)) {
@@ -129,9 +145,17 @@ const Row = ({
{entity.comment && ({entity.comment}) }
-
+
+
+
+ {caps.featureEnabled('COMPLIANCE_REPORTS')
+ ? renderAuditReport(entity.last_report, links)
+ : renderReport(entity.last_report, links)
+ }
- {renderReport(entity.last_report, links)}
{isDefined(entity.last_report) && (
-
+
{actionsColumn}
@@ -79,7 +79,7 @@ export default createEntitiesTable({
footer: createEntitiesFooter({
span: 5,
trash: true,
- tags: false,
+ tags: true,
download: 'audits.xml',
}),
});
diff --git a/src/web/pages/filters/component.jsx b/src/web/pages/filters/component.jsx
index 3b473ab82e..1330c349c4 100644
--- a/src/web/pages/filters/component.jsx
+++ b/src/web/pages/filters/component.jsx
@@ -75,8 +75,13 @@ class FilterComponent extends React.Component {
openFilterDialog(filter) {
const {capabilities} = this.props;
-
- let types = FILTER_OPTIONS.filter(option =>
+ const filterOptions = [
+ ...(capabilities.featureEnabled('COMPLIANCE_REPORTS')
+ ? [['audit_report', _l('Audit Report')]]
+ : []),
+ ...FILTER_OPTIONS
+ ];
+ let types = filterOptions.filter(option =>
filter_types(capabilities, option[0]),
);
diff --git a/src/web/pages/ldap/dialog.jsx b/src/web/pages/ldap/dialog.jsx
index 2b32569464..29465b9bdb 100644
--- a/src/web/pages/ldap/dialog.jsx
+++ b/src/web/pages/ldap/dialog.jsx
@@ -3,6 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
+
import React from 'react';
import PropTypes from 'web/utils/proptypes';
diff --git a/src/web/pages/notes/dialog.jsx b/src/web/pages/notes/dialog.jsx
index eb69502e43..fb934126c0 100644
--- a/src/web/pages/notes/dialog.jsx
+++ b/src/web/pages/notes/dialog.jsx
@@ -3,6 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
+
import React from 'react';
import {isDefined} from 'gmp/utils/identity';
diff --git a/src/web/pages/overrides/dialog.jsx b/src/web/pages/overrides/dialog.jsx
index 331930350e..f798e6d6c6 100644
--- a/src/web/pages/overrides/dialog.jsx
+++ b/src/web/pages/overrides/dialog.jsx
@@ -3,6 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
+
import React from 'react';
import {isDefined} from 'gmp/utils/identity';
diff --git a/src/web/pages/policies/__tests__/listpage.jsx b/src/web/pages/policies/__tests__/listpage.jsx
index 8ff71faa3b..d891383fd6 100644
--- a/src/web/pages/policies/__tests__/listpage.jsx
+++ b/src/web/pages/policies/__tests__/listpage.jsx
@@ -117,7 +117,7 @@ describe('PoliciesPage tests', () => {
await wait();
- expect(element).toBeInTheDocument();
+ expect(baseElement).toBeVisible();
});
test('should call commands for bulk actions', async () => {
diff --git a/src/web/pages/policies/dialog.jsx b/src/web/pages/policies/dialog.jsx
index bc1cae4f9b..c83045be85 100644
--- a/src/web/pages/policies/dialog.jsx
+++ b/src/web/pages/policies/dialog.jsx
@@ -3,6 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
+
import React from 'react';
import PropTypes from 'web/utils/proptypes';
diff --git a/src/web/pages/policies/table.jsx b/src/web/pages/policies/table.jsx
index d1611fafea..92baddf16b 100644
--- a/src/web/pages/policies/table.jsx
+++ b/src/web/pages/policies/table.jsx
@@ -29,7 +29,7 @@ const PoliciesTable = createEntitiesTable({
download: 'policies.xml',
span: 2,
trash: true,
- tags: false,
+ tags: true,
}),
});
diff --git a/src/web/pages/radius/dialog.jsx b/src/web/pages/radius/dialog.jsx
index 0bac9a2635..c10b279336 100644
--- a/src/web/pages/radius/dialog.jsx
+++ b/src/web/pages/radius/dialog.jsx
@@ -3,6 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
+
import React from 'react';
import PropTypes from 'web/utils/proptypes';
diff --git a/src/web/pages/reports/__mocks__/mockauditdeltareport.jsx b/src/web/pages/reports/__mocks__/mockauditdeltareport.jsx
new file mode 100644
index 0000000000..2e9507c304
--- /dev/null
+++ b/src/web/pages/reports/__mocks__/mockauditdeltareport.jsx
@@ -0,0 +1,388 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import AuditReport from 'gmp/models/auditreport';
+
+// Task
+const task1 = {
+ _id: '314',
+ name: 'foo',
+ comment: 'bar',
+ target: {_id: '159'},
+};
+
+// Results
+const result1 = {
+ _id: '101',
+ name: 'Result 1',
+ owner: {name: 'admin'},
+ comment: 'Comment 1',
+ creation_time: '2019-06-03T11:06:31Z',
+ modification_time: '2019-06-03T11:06:31Z',
+ host: {__text: '123.456.78.910'},
+ port: '80/tcp',
+ nvt: {
+ _oid: '201',
+ type: 'nvt',
+ name: 'nvt1',
+ tags: 'solution_type=Mitigation',
+ refs: {ref: [{_type: 'cve', _id: 'CVE-2019-1234'}]},
+ },
+ threat: 'High',
+ severity: 10.0,
+ qod: {value: 80},
+ detection: {
+ result: {
+ details: {
+ detail: [{name: 'product', value: 'cpe:/a: 123'}],
+ },
+ },
+ },
+ compliance: 'yes',
+ delta: 'same',
+};
+
+const result2 = {
+ _id: '102',
+ name: 'Result 2',
+ owner: {name: 'admin'},
+ comment: 'Comment 2',
+ creation_time: '2019-06-03T11:06:31Z',
+ modification_time: '2019-06-03T11:06:31Z',
+ host: {__text: '109.876.54.321'},
+ port: '80/tcp',
+ nvt: {
+ _oid: '202',
+ type: 'nvt',
+ name: 'nvt2',
+ tags: 'solution_type=VendorFix',
+ refs: {ref: [{_type: 'cve', _id: 'CVE-2019-5678'}]},
+ },
+ threat: 'Medium',
+ severity: 5.0,
+ qod: {value: 70},
+ detection: {
+ result: {
+ details: {
+ detail: [{name: 'product', value: 'cpe:/a: 456'}],
+ },
+ },
+ },
+ compliance: 'incomplete',
+ delta: 'same',
+};
+
+const result3 = {
+ _id: '103',
+ name: 'Result 3',
+ owner: {name: 'admin'},
+ comment: 'Comment 3',
+ creation_time: '2019-06-03T11:06:31Z',
+ modification_time: '2019-06-03T11:06:31Z',
+ host: {__text: '109.876.54.321'},
+ port: '80/tcp',
+ nvt: {
+ _oid: '201',
+ type: 'nvt',
+ name: 'nvt1',
+ tags: 'solution_type=Mitigation',
+ refs: {ref: [{_type: 'cve', _id: 'CVE-2019-1234'}]},
+ solution: {
+ _type: 'Mitigation',
+ },
+ },
+ threat: 'Medium',
+ severity: 5.0,
+ qod: {value: 80},
+ compliance: 'no',
+ delta: 'same',
+};
+
+// Hosts
+export const host1 = {
+ ip: '123.456.78.910',
+ asset: {_asset_id: '123'},
+ start: '2019-06-03T11:00:22Z',
+ end: '2019-06-03T11:15:14Z',
+ port_count: {page: 10},
+ compliance_count: {
+ page: 50,
+ incomplete: {page: 14},
+ no: {page: 30},
+ undefined: {page: 5},
+ yes: {page: 7},
+ },
+ host_compliance: 'no',
+ detail: [
+ {name: 'best_os_cpe', value: 'cpe:/foo/bar'},
+ {name: 'best_os_txt', value: 'Foo OS'},
+ {name: 'App', value: 'cpe:/a: 123'},
+ {name: 'App', value: 'cpe:/a: 789'},
+ {name: 'App', value: 'cpe:/a: 101'},
+ {name: 'cpe:/a: 123', value: 'ab'},
+ {name: 'cpe:/a: 123', value: 'cd'},
+ {name: 'traceroute', value: '1.1.1.1,2.2.2.2,3.3.3.3'},
+ {name: 'hostname', value: 'foo.bar'},
+ {name: 'Auth-SSH-Success'},
+ {name: 'SSLInfo', value: '1234::123456'},
+ {
+ name: 'SSLDetails:123456',
+ value:
+ 'issuer:CN=foo|serial:abcd|notBefore:20190130T201714|notAfter:20190801T201714',
+ },
+ {
+ name: 'Closed CVE',
+ value: 'CVE-2000-1234',
+ source: {
+ type: 'openvas',
+ name: '201',
+ description: 'This is a description',
+ },
+ extra: '10.0',
+ },
+ ],
+};
+
+export const host2 = {
+ ip: '109.876.54.321',
+ start: '2019-06-03T11:15:14Z',
+ end: '2019-06-03T11:31:23Z',
+ port_count: {page: 15},
+ compliance_count: {
+ page: 40,
+ incomplete: {page: 5},
+ no: {page: 0},
+ undefined: {page: 6},
+ yes: {page: 17},
+ },
+ host_compliance: 'incomplete',
+ detail: [
+ {name: 'best_os_cpe', value: 'cpe:/lorem/ipsum'},
+ {name: 'best_os_txt', value: 'Lorem OS'},
+ {name: 'App', value: 'cpe:/a: 123'},
+ {name: 'App', value: 'cpe:/a: 456'},
+ {name: 'traceroute', value: '1.1.1.1,2.2.2.2'},
+ {name: 'hostname', value: 'lorem.ipsum'},
+ {name: 'Auth-SSH-Failure'},
+ {name: 'SSLInfo', value: '5678::654321'},
+ {
+ name: 'SSLDetails:654321',
+ value:
+ 'issuer:CN=bar|serial:dcba|notBefore:20190330T201714|notAfter:20191001T201714',
+ },
+ {
+ name: 'Closed CVE',
+ value: 'CVE-2000-5678',
+ source: {
+ type: 'openvas',
+ name: '202',
+ description: 'This is another description',
+ },
+ extra: '5.0',
+ },
+ ],
+};
+
+// Hosts
+export const host3 = {
+ ip: '123.456.78.810',
+ asset: {_asset_id: '123'},
+ start: '2019-06-03T11:00:22Z',
+ end: '2019-06-03T11:15:14Z',
+ port_count: {page: 10},
+ compliance_count: {
+ page: 20,
+ incomplete: {page: 0},
+ no: {page: 0},
+ undefined: {page: 0},
+ yes: {page: 20},
+ },
+ host_compliance: 'yes',
+ detail: [
+ {name: 'best_os_cpe', value: 'cpe:/foo/bar'},
+ {name: 'best_os_txt', value: 'Foo OS'},
+ {name: 'App', value: 'cpe:/a: 123'},
+ {name: 'App', value: 'cpe:/a: 789'},
+ {name: 'App', value: 'cpe:/a: 101'},
+ {name: 'cpe:/a: 123', value: 'ab'},
+ {name: 'cpe:/a: 123', value: 'cd'},
+ {name: 'traceroute', value: '1.1.1.1,2.2.2.2,3.3.3.3'},
+ {name: 'hostname', value: 'foo.bar'},
+ {name: 'Auth-SSH-Success'},
+ {name: 'SSLInfo', value: '1234::123456'},
+ {
+ name: 'SSLDetails:123456',
+ value:
+ 'issuer:CN=foo|serial:abcd|notBefore:20190130T201714|notAfter:20190801T201714',
+ },
+ {
+ name: 'Closed CVE',
+ value: 'CVE-2000-1234',
+ source: {
+ type: 'openvas',
+ name: '201',
+ description: 'This is a description',
+ },
+ extra: '10.0',
+ },
+ ],
+};
+
+// Ports
+const port1 = {
+ host: '1.1.1.1',
+ __text: '123/tcp',
+ severity: 10.0,
+ threat: 'High',
+};
+const port2 = {
+ host: '2.2.2.2',
+ __text: '456/tcp',
+ severity: 5.0,
+ threat: 'Medium',
+};
+
+// Errors
+const error1 = {
+ host: {
+ __text: '123.456.78.910',
+ asset: {_asset_id: '123'},
+ },
+ port: '123/tcp',
+ description: 'This is an error.',
+ nvt: {
+ _oid: '314',
+ name: 'NVT1',
+ },
+};
+
+const error2 = {
+ host: {
+ __text: '109.876.54.321',
+ asset: {_asset_id: '109'},
+ },
+ port: '456/tcp',
+ description: 'This is another error.',
+ nvt: {
+ _oid: '159',
+ name: 'NVT2',
+ },
+};
+
+// TLS certificates
+const tlsCertificate1 = {
+ name: '57610B6A3C73866870678E638C7825743145B24',
+ certificate: {
+ __text: '66870678E638C7825743145B247554E0D92C94',
+ _format: 'DER',
+ },
+ data: 'MIIDSzCCAjOgAwIBAgIJALScVB/zqOLZMA0GCSqGSIb3DQ',
+ sha256_fingerprint: '57610B6A3C73866870678E638C78',
+ md5_fingerprint: 'fa:a9:9d:f2:28:cc:2c:c0:80:16',
+ activation_time: '2019-08-10T12:51:27Z',
+ expiration_time: '2019-09-10T12:51:27Z',
+ valid: true,
+ subject_dn: 'CN=LoremIpsumSubject1 C=Dolor',
+ issuer_dn: 'CN=LoremIpsumIssuer1 C=Dolor',
+ serial: '00B49C541FF5A8E1D9',
+ host: {ip: '192.168.9.90', hostname: 'foo.bar'},
+ ports: {port: ['4021', '4023']},
+};
+
+const tlsCertificate2 = {
+ name: 'C137E9D559CC95ED130011FE4012DE56CAE2F8',
+ certificate: {
+ __text: 'MIICGTCCAYICCQDDh8Msu4YfXDANBgkqhkiG9w0B',
+ _format: 'DER',
+ },
+ sha256_fingerprint: 'C137E9D559CC95ED130011FE4012',
+ md5_fingerprint: '63:70:d6:65:17:32:01:66:9e:7d:c4',
+ activation_time: 'unlimited',
+ expiration_time: 'undefined',
+ valid: false,
+ subject_dn: 'CN=LoremIpsumSubject2 C=Dolor',
+ issuer_dn: 'CN=LoremIpsumIssuer2 C=Dolor',
+ serial: '00C387C32CBB861F5C',
+ host: {ip: '191.164.9.93', hostname: ''},
+ ports: {port: ['8445', '5061']},
+};
+
+export const getMockAuditDeltaReport = () => {
+ const report = {
+ _type: 'delta',
+ _id: '1234',
+ delta: {
+ report: {
+ _id: '5678',
+ scan_run_status: 'Done',
+ scan_start: '2019-05-20T12:00:15Z',
+ scan_end: '2019-05-20T12:30:46Z',
+ },
+ },
+ scan_run_status: 'Done',
+ scan_start: '2019-06-03T11:00:22Z',
+ scan_end: '2019-06-03T11:31:23Z',
+ timestamp: '2019-06-03T11:00:22Z',
+ timezone: 'UTC',
+ timezone_abbrev: 'UTC',
+ task: task1,
+ closed_cves: {count: 0},
+ vulns: {count: 0},
+ apps: {count: 4},
+ os: {count: 2},
+ ssl_certs: {count: 2},
+ compliance: {filtered: 'no', full: 'no'},
+ compliance_count: {
+ full: 3,
+ filtered: 2,
+ incomplete: {
+ full: 5,
+ filtered: 1,
+ },
+ yes: {
+ full: 2,
+ filtered: 3,
+ },
+ no: {
+ full: 1,
+ filtered: 2,
+ },
+ undefined: {
+ full: 2,
+ filtered: 0,
+ },
+ },
+ results: {result: [result1, result2, result3]},
+ hosts: {count: 3},
+ host: [host1, host2, host3],
+ tls_certificates: {
+ tls_certificate: [tlsCertificate1, tlsCertificate2],
+ },
+ ports: {
+ count: 2,
+ port: [port1, port2],
+ },
+ errors: {
+ count: 2,
+ error: [error1, error2],
+ },
+ };
+
+ const entity = AuditReport.fromElement({
+ report: report,
+ creation_time: '2019-06-02T12:00:22Z',
+ modification_time: '2019-06-03T11:00:22Z',
+ name: '2019-06-03T11:00:22Z',
+ owner: {name: 'admin'},
+ _id: '1234',
+ });
+
+ return {
+ entity,
+ report: entity.report,
+ results: entity.report.results,
+ task: entity.report.task,
+ };
+};
diff --git a/src/web/pages/reports/__mocks__/mockauditreport.jsx b/src/web/pages/reports/__mocks__/mockauditreport.jsx
new file mode 100644
index 0000000000..a723ab74bd
--- /dev/null
+++ b/src/web/pages/reports/__mocks__/mockauditreport.jsx
@@ -0,0 +1,370 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import AuditReport from 'gmp/models/auditreport';
+
+// Task
+const task1 = {
+ _id: '314',
+ name: 'foo',
+ comment: 'bar',
+ target: {_id: '159'},
+};
+
+// Results
+const result1 = {
+ _id: '101',
+ name: 'Result 1',
+ owner: {name: 'admin'},
+ comment: 'Comment 1',
+ creation_time: '2019-06-03T11:06:31Z',
+ modification_time: '2019-06-03T11:06:31Z',
+ host: {__text: '123.456.78.910'},
+ port: '80/tcp',
+ nvt: {
+ _oid: '201',
+ type: 'nvt',
+ name: 'nvt1',
+ tags: 'solution_type=Mitigation',
+ refs: {ref: [{_type: 'cve', _id: 'CVE-2019-1234'}]},
+ },
+ threat: 'High',
+ severity: 10.0,
+ qod: {value: 80},
+ detection: {
+ result: {
+ details: {
+ detail: [{name: 'product', value: 'cpe:/a: 123'}],
+ },
+ },
+ },
+ compliance: 'yes',
+};
+
+const result2 = {
+ _id: '102',
+ name: 'Result 2',
+ owner: {name: 'admin'},
+ comment: 'Comment 2',
+ creation_time: '2019-06-03T11:06:31Z',
+ modification_time: '2019-06-03T11:06:31Z',
+ host: {__text: '109.876.54.321'},
+ port: '80/tcp',
+ nvt: {
+ _oid: '202',
+ type: 'nvt',
+ name: 'nvt2',
+ tags: 'solution_type=VendorFix',
+ refs: {ref: [{_type: 'cve', _id: 'CVE-2019-5678'}]},
+ },
+ threat: 'Medium',
+ severity: 5.0,
+ qod: {value: 70},
+ detection: {
+ result: {
+ details: {
+ detail: [{name: 'product', value: 'cpe:/a: 456'}],
+ },
+ },
+ },
+ compliance: 'incomplete',
+};
+
+const result3 = {
+ _id: '103',
+ name: 'Result 3',
+ owner: {name: 'admin'},
+ comment: 'Comment 3',
+ creation_time: '2019-06-03T11:06:31Z',
+ modification_time: '2019-06-03T11:06:31Z',
+ host: {__text: '109.876.54.321'},
+ port: '80/tcp',
+ nvt: {
+ _oid: '201',
+ type: 'nvt',
+ name: 'nvt1',
+ tags: 'solution_type=Mitigation',
+ refs: {ref: [{_type: 'cve', _id: 'CVE-2019-1234'}]},
+ solution: {
+ _type: 'Mitigation',
+ },
+ },
+ threat: 'Medium',
+ severity: 5.0,
+ qod: {value: 80},
+ compliance: 'no',
+};
+
+// Hosts
+export const host1 = {
+ ip: '123.456.78.910',
+ asset: {_asset_id: '123'},
+ start: '2019-06-03T11:00:22Z',
+ end: '2019-06-03T11:15:14Z',
+ port_count: {page: 10},
+ compliance_count: {
+ page: 50,
+ incomplete: {page: 14},
+ no: {page: 30},
+ undefined: {page: 5},
+ yes: {page: 7},
+ },
+ host_compliance: 'no',
+ detail: [
+ {name: 'best_os_cpe', value: 'cpe:/foo/bar'},
+ {name: 'best_os_txt', value: 'Foo OS'},
+ {name: 'App', value: 'cpe:/a: 123'},
+ {name: 'App', value: 'cpe:/a: 789'},
+ {name: 'App', value: 'cpe:/a: 101'},
+ {name: 'cpe:/a: 123', value: 'ab'},
+ {name: 'cpe:/a: 123', value: 'cd'},
+ {name: 'traceroute', value: '1.1.1.1,2.2.2.2,3.3.3.3'},
+ {name: 'hostname', value: 'foo.bar'},
+ {name: 'Auth-SSH-Success'},
+ {name: 'SSLInfo', value: '1234::123456'},
+ {
+ name: 'SSLDetails:123456',
+ value:
+ 'issuer:CN=foo|serial:abcd|notBefore:20190130T201714|notAfter:20190801T201714',
+ },
+ {
+ name: 'Closed CVE',
+ value: 'CVE-2000-1234',
+ source: {
+ type: 'openvas',
+ name: '201',
+ description: 'This is a description',
+ },
+ extra: '10.0',
+ },
+ ],
+};
+
+export const host2 = {
+ ip: '109.876.54.321',
+ start: '2019-06-03T11:15:14Z',
+ end: '2019-06-03T11:31:23Z',
+ port_count: {page: 15},
+ compliance_count: {
+ page: 40,
+ incomplete: {page: 5},
+ no: {page: 0},
+ undefined: {page: 6},
+ yes: {page: 17},
+ },
+ host_compliance: 'incomplete',
+ detail: [
+ {name: 'best_os_cpe', value: 'cpe:/lorem/ipsum'},
+ {name: 'best_os_txt', value: 'Lorem OS'},
+ {name: 'App', value: 'cpe:/a: 123'},
+ {name: 'App', value: 'cpe:/a: 456'},
+ {name: 'traceroute', value: '1.1.1.1,2.2.2.2'},
+ {name: 'hostname', value: 'lorem.ipsum'},
+ {name: 'Auth-SSH-Failure'},
+ {name: 'SSLInfo', value: '5678::654321'},
+ {
+ name: 'SSLDetails:654321',
+ value:
+ 'issuer:CN=bar|serial:dcba|notBefore:20190330T201714|notAfter:20191001T201714',
+ },
+ {
+ name: 'Closed CVE',
+ value: 'CVE-2000-5678',
+ source: {
+ type: 'openvas',
+ name: '202',
+ description: 'This is another description',
+ },
+ extra: '5.0',
+ },
+ ],
+};
+
+// Hosts
+export const host3 = {
+ ip: '123.456.78.810',
+ asset: {_asset_id: '123'},
+ start: '2019-06-03T11:00:22Z',
+ end: '2019-06-03T11:15:14Z',
+ port_count: {page: 10},
+ compliance_count: {
+ page: 20,
+ incomplete: {page: 0},
+ no: {page: 0},
+ undefined: {page: 0},
+ yes: {page: 20},
+ },
+ host_compliance: 'yes',
+ detail: [
+ {name: 'best_os_cpe', value: 'cpe:/foo/bar'},
+ {name: 'best_os_txt', value: 'Foo OS'},
+ {name: 'App', value: 'cpe:/a: 123'},
+ {name: 'App', value: 'cpe:/a: 789'},
+ {name: 'App', value: 'cpe:/a: 101'},
+ {name: 'cpe:/a: 123', value: 'ab'},
+ {name: 'cpe:/a: 123', value: 'cd'},
+ {name: 'traceroute', value: '1.1.1.1,2.2.2.2,3.3.3.3'},
+ {name: 'hostname', value: 'foo.bar'},
+ {name: 'Auth-SSH-Success'},
+ {name: 'SSLInfo', value: '1234::123456'},
+ {
+ name: 'SSLDetails:123456',
+ value:
+ 'issuer:CN=foo|serial:abcd|notBefore:20190130T201714|notAfter:20190801T201714',
+ },
+ {
+ name: 'Closed CVE',
+ value: 'CVE-2000-1234',
+ source: {
+ type: 'openvas',
+ name: '201',
+ description: 'This is a description',
+ },
+ extra: '10.0',
+ },
+ ],
+};
+
+// Ports
+const port1 = {
+ host: '1.1.1.1',
+ __text: '123/tcp',
+ severity: 10.0,
+ threat: 'High',
+};
+const port2 = {
+ host: '2.2.2.2',
+ __text: '456/tcp',
+ severity: 5.0,
+ threat: 'Medium',
+};
+
+// Errors
+const error1 = {
+ host: {
+ __text: '123.456.78.910',
+ asset: {_asset_id: '123'},
+ },
+ port: '123/tcp',
+ description: 'This is an error.',
+ nvt: {
+ _oid: '314',
+ name: 'NVT1',
+ },
+};
+
+const error2 = {
+ host: {
+ __text: '109.876.54.321',
+ asset: {_asset_id: '109'},
+ },
+ port: '456/tcp',
+ description: 'This is another error.',
+ nvt: {
+ _oid: '159',
+ name: 'NVT2',
+ },
+};
+
+// TLS certificates
+const tlsCertificate1 = {
+ name: '57610B6A3C73866870678E638C7825743145B24',
+ certificate: {
+ __text: '66870678E638C7825743145B247554E0D92C94',
+ _format: 'DER',
+ },
+ data: 'MIIDSzCCAjOgAwIBAgIJALScVB/zqOLZMA0GCSqGSIb3DQ',
+ sha256_fingerprint: '57610B6A3C73866870678E638C78',
+ md5_fingerprint: 'fa:a9:9d:f2:28:cc:2c:c0:80:16',
+ activation_time: '2019-08-10T12:51:27Z',
+ expiration_time: '2019-09-10T12:51:27Z',
+ valid: true,
+ subject_dn: 'CN=LoremIpsumSubject1 C=Dolor',
+ issuer_dn: 'CN=LoremIpsumIssuer1 C=Dolor',
+ serial: '00B49C541FF5A8E1D9',
+ host: {ip: '192.168.9.90', hostname: 'foo.bar'},
+ ports: {port: ['4021', '4023']},
+};
+
+const tlsCertificate2 = {
+ name: 'C137E9D559CC95ED130011FE4012DE56CAE2F8',
+ certificate: {
+ __text: 'MIICGTCCAYICCQDDh8Msu4YfXDANBgkqhkiG9w0B',
+ _format: 'DER',
+ },
+ sha256_fingerprint: 'C137E9D559CC95ED130011FE4012',
+ md5_fingerprint: '63:70:d6:65:17:32:01:66:9e:7d:c4',
+ activation_time: 'unlimited',
+ expiration_time: 'undefined',
+ valid: false,
+ subject_dn: 'CN=LoremIpsumSubject2 C=Dolor',
+ issuer_dn: 'CN=LoremIpsumIssuer2 C=Dolor',
+ serial: '00C387C32CBB861F5C',
+ host: {ip: '191.164.9.93', hostname: ''},
+ ports: {port: ['8445', '5061']},
+};
+
+export const getMockAuditReport = () => {
+ const report = {
+ _id: '1234',
+ scan_run_status: 'Done',
+ scan_start: '2019-06-03T11:00:22Z',
+ scan_end: '2019-06-03T11:31:23Z',
+ timestamp: '2019-06-03T11:00:22Z',
+ timezone: 'UTC',
+ timezone_abbrev: 'UTC',
+ task: task1,
+ closed_cves: {count: 0},
+ vulns: {count: 0},
+ apps: {count: 4},
+ os: {count: 2},
+ ssl_certs: {count: 2},
+ compliance: {filtered: 'no', full: 'no'},
+ compliance_count: {
+ __text: 3,
+ full: 3,
+ filtered: 2,
+ yes: {full: 5, filtered: 3},
+ no: {full: 3, filtered: 2},
+ incomplete: {full: 2, filtered: 1},
+ undefined: {full: 0, filtered: 0},
+ },
+ results: {result: [result1, result2, result3]},
+ hosts: {count: 3},
+ host: [host1, host2, host3],
+ tls_certificates: {
+ tls_certificate: [tlsCertificate1, tlsCertificate2],
+ },
+ ports: {
+ count: 2,
+ port: [port1, port2],
+ },
+ errors: {
+ count: 2,
+ error: [error1, error2],
+ },
+ };
+
+ const entity = AuditReport.fromElement({
+ report: report,
+ creation_time: '2019-06-02T12:00:22Z',
+ modification_time: '2019-06-03T11:00:22Z',
+ name: '2019-06-03T11:00:22Z',
+ owner: {name: 'admin'},
+ _id: '1234',
+ task: task1,
+ });
+
+ return {
+ entity,
+ report: entity.report,
+ results: entity.report.results,
+ hosts: entity.report.hosts,
+ operatingsystems: entity.report.operatingSystems,
+ tlsCertificates: entity.report.tlsCertificates,
+ errors: entity.report.errors,
+ task: entity.report.task,
+ };
+};
diff --git a/src/web/pages/reports/__tests__/auditdeltadetailspage.jsx b/src/web/pages/reports/__tests__/auditdeltadetailspage.jsx
new file mode 100644
index 0000000000..fbd2849f14
--- /dev/null
+++ b/src/web/pages/reports/__tests__/auditdeltadetailspage.jsx
@@ -0,0 +1,377 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {describe, test, expect, testing} from '@gsa/testing';
+import React from 'react';
+
+import Capabilities from 'gmp/capabilities/capabilities';
+
+import Filter from 'gmp/models/filter';
+
+import {setTimezone, setUsername} from 'web/store/usersettings/actions';
+
+import {rendererWith} from 'web/utils/testing';
+
+import {getMockAuditDeltaReport} from 'web/pages/reports/__mocks__/mockauditdeltareport';
+
+import DeltaDetailsContent from 'web/pages/reports/deltadetailscontent';
+
+const filter = Filter.fromString(
+ 'apply_overrides=0 compliance_levels=ynui rows=10 min_qod=70 first=1 sort=compliant',
+);
+
+const filterWithName = Filter.fromElement({
+ term: 'apply_overrides=0 compliance_levels=ynui rows=10 min_qod=70 first=1 sort=compliant',
+ name: 'foo',
+ id: '123',
+});
+
+const caps = new Capabilities(['everything']);
+
+const manualUrl = 'test/';
+
+const currentSettings = testing.fn().mockResolvedValue({
+ foo: 'bar',
+});
+
+const getReportComposerDefaults = testing.fn().mockResolvedValue({
+ foo: 'bar',
+});
+
+describe('Audit Detla Report Details Content tests', () => {
+ test('should render Audit Delta Report Details Content', () => {
+ const onActivateTab = testing.fn();
+ const onAddToAssetsClick = testing.fn();
+ const onError = testing.fn();
+ const onFilterAddLogLevelClick = testing.fn();
+ const onFilterDecreaseMinQoDClick = testing.fn();
+ const onFilterChanged = testing.fn();
+ const onFilterCreated = testing.fn();
+ const onFilterEditClick = testing.fn();
+ const onFilterRemoveSeverityClick = testing.fn();
+ const onFilterResetClick = testing.fn();
+ const onFilterRemoveClick = testing.fn();
+ const onInteraction = testing.fn();
+ const onRemoveFromAssetsClick = testing.fn();
+ const onReportDownloadClick = testing.fn();
+ const showError = testing.fn();
+ const showErrorMessage = testing.fn();
+ const showSuccessMessage = testing.fn();
+ const onSortChange = testing.fn();
+ const onTagSuccess = testing.fn();
+ const onTargetEditClick = testing.fn();
+ const onTlsCertificateDownloadClick = testing.fn();
+
+ const sorting = {
+ errors: {sortField: 'error', sortReverse: true},
+ hosts: {sortField: 'compliant', sortReverse: true},
+ os: {sortField: 'compliant', sortReverse: true},
+ results: {sortField: 'compliant', sortReverse: true},
+ tlscerts: {sortField: 'dn', sortReverse: true},
+ };
+
+ const {entity} = getMockAuditDeltaReport();
+
+ const filters = [filterWithName];
+
+ const gmp = {
+ settings: {manualUrl, reportResultsThreshold: 10},
+ user: {currentSettings, getReportComposerDefaults},
+ };
+
+ const {render, store} = rendererWith({
+ gmp,
+ capabilities: caps,
+ router: true,
+ store: true,
+ });
+
+ store.dispatch(setTimezone('CET'));
+ store.dispatch(setUsername('admin'));
+
+ const {baseElement, getAllByTestId} = render(
+ ,
+ );
+
+ const icons = baseElement.querySelectorAll('svg');
+ const inputs = baseElement.querySelectorAll('input');
+ const links = baseElement.querySelectorAll('a');
+ const tableData = baseElement.querySelectorAll('td');
+ const selects = getAllByTestId('select-selected-value');
+ const bars = getAllByTestId('progressbar-box');
+
+ // Toolbar Icons
+ expect(icons.length).toEqual(14)
+
+ // Powerfilter
+ expect(inputs[0]).toHaveAttribute('name', 'userFilterString');
+ expect(selects[0]).toHaveAttribute('title', 'Loaded filter');
+ expect(selects[0]).toHaveTextContent('foo');
+
+ // Header
+ expect(baseElement).toHaveTextContent(
+ 'Report:Mon, Jun 3, 2019 1:00 PM CEST',
+ );
+ expect(bars[0]).toHaveAttribute('title', 'Done');
+ expect(bars[0]).toHaveTextContent('Done');
+ expect(baseElement).toHaveTextContent(
+ 'Created:Sun, Jun 2, 2019 2:00 PM CEST',
+ );
+ expect(baseElement).toHaveTextContent(
+ 'Modified:Mon, Jun 3, 2019 1:00 PM CEST',
+ );
+ expect(baseElement).toHaveTextContent('Owner:admin');
+
+ // Tabs
+ expect(baseElement).toHaveTextContent('Information');
+ expect(baseElement).toHaveTextContent('Results(2)');
+ expect(baseElement).toHaveTextContent('User Tags(0)');
+
+ // Summary
+ expect(tableData[0]).toHaveTextContent('Task Name');
+ expect(links[6]).toHaveAttribute('href', '/task/314');
+ expect(tableData[1]).toHaveTextContent('foo');
+
+ expect(tableData[2]).toHaveTextContent('Comment');
+ expect(tableData[3]).toHaveTextContent('bar');
+
+ expect(tableData[4]).toHaveTextContent('Report 1');
+ expect(links[7]).toHaveAttribute('href', '/report/1234');
+ expect(tableData[5]).toHaveTextContent('1234');
+
+ expect(tableData[6]).toHaveTextContent('Scan Time Report 1');
+ expect(tableData[7]).toHaveTextContent(
+ 'Mon, Jun 3, 2019 1:00 PM CEST - Mon, Jun 3, 2019 1:31 PM CEST',
+ );
+
+ expect(tableData[8]).toHaveTextContent('Scan Duration Report 1');
+ expect(tableData[9]).toHaveTextContent('0:31 h');
+
+ expect(tableData[10]).toHaveTextContent('Scan Status Report 1');
+ expect(bars[1]).toHaveTextContent('Done');
+
+ expect(tableData[12]).toHaveTextContent('Report 2');
+ expect(links[8]).toHaveAttribute('href', '/report/5678');
+ expect(tableData[13]).toHaveTextContent('5678');
+
+ expect(tableData[14]).toHaveTextContent('Scan Time Report 2');
+ expect(tableData[15]).toHaveTextContent(
+ 'Mon, May 20, 2019 2:00 PM CEST - Mon, May 20, 2019 2:30 PM CEST',
+ );
+
+ expect(tableData[16]).toHaveTextContent('Scan Duration Report 2');
+ expect(tableData[17]).toHaveTextContent('0:30 h');
+
+ expect(tableData[18]).toHaveTextContent('Scan Status Report 2');
+ expect(bars[2]).toHaveTextContent('Done');
+
+ expect(tableData[20]).toHaveTextContent('Hosts scanned');
+ expect(tableData[21]).toHaveTextContent('3');
+
+ expect(tableData[22]).toHaveTextContent('Filter');
+ expect(tableData[23]).toHaveTextContent(
+ 'apply_overrides=0 compliance_levels=ynui min_qod=70',
+ );
+
+ expect(tableData[24]).toHaveTextContent('Timezone');
+ expect(tableData[25]).toHaveTextContent('UTC (UTC)');
+ });
+
+ test('should render results tab', () => {
+ const onActivateTab = testing.fn();
+ const onAddToAssetsClick = testing.fn();
+ const onError = testing.fn();
+ const onFilterAddLogLevelClick = testing.fn();
+ const onFilterDecreaseMinQoDClick = testing.fn();
+ const onFilterChanged = testing.fn();
+ const onFilterCreated = testing.fn();
+ const onFilterEditClick = testing.fn();
+ const onFilterRemoveSeverityClick = testing.fn();
+ const onFilterResetClick = testing.fn();
+ const onFilterRemoveClick = testing.fn();
+ const onInteraction = testing.fn();
+ const onRemoveFromAssetsClick = testing.fn();
+ const onReportDownloadClick = testing.fn();
+ const showError = testing.fn();
+ const showErrorMessage = testing.fn();
+ const showSuccessMessage = testing.fn();
+ const onSortChange = testing.fn();
+ const onTagSuccess = testing.fn();
+ const onTargetEditClick = testing.fn();
+ const onTlsCertificateDownloadClick = testing.fn();
+
+ const sorting = {
+ apps: {sortField: 'severity', sortReverse: true},
+ closedcves: {sortField: 'severity', sortReverse: true},
+ cves: {sortField: 'severity', sortReverse: true},
+ errors: {sortField: 'error', sortReverse: true},
+ hosts: {sortField: 'severity', sortReverse: true},
+ os: {sortField: 'severity', sortReverse: true},
+ ports: {sortField: 'severity', sortReverse: true},
+ results: {sortField: 'severity', sortReverse: true},
+ tlscerts: {sortField: 'dn', sortReverse: true},
+ };
+
+ const {entity} = getMockAuditDeltaReport();
+
+ const filters = [filterWithName];
+
+ const gmp = {
+ settings: {manualUrl, reportResultsThreshold: 10},
+ user: {currentSettings, getReportComposerDefaults},
+ };
+
+ const {render, store} = rendererWith({
+ gmp,
+ capabilities: caps,
+ router: true,
+ store: true,
+ });
+
+ store.dispatch(setTimezone('CET'));
+ store.dispatch(setUsername('admin'));
+
+ const {baseElement, getAllByTestId} = render(
+ ,
+ );
+
+ const icons = baseElement.querySelectorAll('svg');
+ const inputs = baseElement.querySelectorAll('input');
+ const header = baseElement.querySelectorAll('th');
+ const rows = baseElement.querySelectorAll('tr');
+ const selects = getAllByTestId('select-selected-value');
+ const bars = getAllByTestId('progressbar-box');
+
+ // Toolbar Icons
+ expect(icons.length).toEqual(24)
+
+ // Powerfilter
+ expect(inputs[0]).toHaveAttribute('name', 'userFilterString');
+ expect(selects[0]).toHaveAttribute('title', 'Loaded filter');
+ expect(selects[0]).toHaveTextContent('--');
+
+ // Header
+ expect(baseElement).toHaveTextContent(
+ 'Report:Mon, Jun 3, 2019 1:00 PM CEST',
+ );
+ expect(bars[0]).toHaveAttribute('title', 'Done');
+ expect(bars[0]).toHaveTextContent('Done');
+ expect(baseElement).toHaveTextContent(
+ 'Created:Sun, Jun 2, 2019 2:00 PM CEST',
+ );
+ expect(baseElement).toHaveTextContent(
+ 'Modified:Mon, Jun 3, 2019 1:00 PM CEST',
+ );
+ expect(baseElement).toHaveTextContent('Owner:admin');
+
+ // Tabs
+ expect(baseElement).toHaveTextContent('Information');
+ expect(baseElement).toHaveTextContent('Results(2)');
+ expect(baseElement).toHaveTextContent('User Tags(0)');
+
+ // Results
+
+ // Headings
+ expect(header[0]).toHaveTextContent('Delta');
+ expect(header[1]).toHaveTextContent('Vulnerability');
+ expect(header[3]).toHaveTextContent('Compliant');
+ expect(header[4]).toHaveTextContent('QoD');
+ expect(header[5]).toHaveTextContent('Host');
+ expect(header[6]).toHaveTextContent('Location');
+ expect(header[7]).toHaveTextContent('Created');
+ expect(header[8]).toHaveTextContent('IP');
+ expect(header[9]).toHaveTextContent('Name');
+
+ // Row 1
+ expect(rows[2]).toHaveTextContent('[ = ]');
+ expect(rows[2]).toHaveTextContent('Result 1');
+ expect(bars[1]).toHaveAttribute('title', 'Yes');
+ expect(bars[1]).toHaveTextContent('Yes');
+ expect(rows[2]).toHaveTextContent('80 %');
+ expect(rows[2]).toHaveTextContent('123.456.78.910');
+ expect(rows[2]).toHaveTextContent('80/tcp');
+ expect(rows[2]).toHaveTextContent('Mon, Jun 3, 2019 1:06 PM CEST');
+
+ // Row 2
+ expect(rows[3]).toHaveTextContent('[ = ]');
+ expect(rows[3]).toHaveTextContent('Result 2');
+ expect(bars[2]).toHaveAttribute('title', 'Incomplete');
+ expect(bars[2]).toHaveTextContent('Incomplete');
+ expect(rows[3]).toHaveTextContent('70 %');
+ expect(rows[3]).toHaveTextContent('109.876.54.321');
+ expect(rows[3]).toHaveTextContent('80/tcp');
+ expect(rows[3]).toHaveTextContent('Mon, Jun 3, 2019 1:06 PM CEST');
+
+ // Filter
+ expect(baseElement).toHaveTextContent(
+ '(Applied filter: apply_overrides=0 compliance_levels=ynui rows=10 min_qod=70 first=1 sort=compliant)',
+ );
+ });
+});
diff --git a/src/web/pages/reports/__tests__/auditdetailscontent.jsx b/src/web/pages/reports/__tests__/auditdetailscontent.jsx
new file mode 100644
index 0000000000..fa8ccd693f
--- /dev/null
+++ b/src/web/pages/reports/__tests__/auditdetailscontent.jsx
@@ -0,0 +1,394 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {describe, test, expect, testing} from '@gsa/testing';
+import React from 'react';
+
+import Capabilities from 'gmp/capabilities/capabilities';
+
+import Filter from 'gmp/models/filter';
+
+import {setTimezone, setUsername} from 'web/store/usersettings/actions';
+
+import {rendererWith} from 'web/utils/testing';
+
+import {getMockAuditReport} from 'web/pages/reports/__mocks__/mockauditreport';
+
+import DetailsContent from 'web/pages/reports/auditdetailscontent';
+
+const filter = Filter.fromString(
+ 'apply_overrides=0 compliance_levels=ynui rows=10 min_qod=70 first=1 sort=compliant',
+);
+
+const filterWithName = Filter.fromElement({
+ term: 'apply_overrides=0 compliance_levels=ynui rows=10 min_qod=70 first=1 sort=compliant',
+ name: 'foo',
+ id: '123',
+});
+
+const resetFilter = Filter.fromString(
+ 'first=1 compliance_levels=ynui sort=compliant',
+);
+
+const caps = new Capabilities(['everything']);
+
+const manualUrl = 'test/';
+
+const currentSettings = testing.fn().mockResolvedValue({
+ foo: 'bar',
+});
+
+const getReportComposerDefaults = testing.fn().mockResolvedValue({
+ foo: 'bar',
+});
+
+describe('Audit Report Details Content tests', () => {
+ test('should render Audit Report Details Content', () => {
+ const onActivateTab = testing.fn();
+ const onAddToAssetsClick = testing.fn();
+ const onError = testing.fn();
+ const onFilterAddLogLevelClick = testing.fn();
+ const onFilterDecreaseMinQoDClick = testing.fn();
+ const onFilterChanged = testing.fn();
+ const onFilterCreated = testing.fn();
+ const onFilterEditClick = testing.fn();
+ const onFilterRemoveSeverityClick = testing.fn();
+ const onFilterResetClick = testing.fn();
+ const onFilterRemoveClick = testing.fn();
+ const onInteraction = testing.fn();
+ const onRemoveFromAssetsClick = testing.fn();
+ const onReportDownloadClick = testing.fn();
+ const showError = testing.fn();
+ const showErrorMessage = testing.fn();
+ const showSuccessMessage = testing.fn();
+ const onSortChange = testing.fn();
+ const onTagSuccess = testing.fn();
+ const onTargetEditClick = testing.fn();
+ const onTlsCertificateDownloadClick = testing.fn();
+
+ const sorting = {
+ errors: {sortField: 'error', sortReverse: true},
+ hosts: {sortField: 'compliant', sortReverse: true},
+ os: {sortField: 'compliant', sortReverse: true},
+ results: {sortField: 'compliant', sortReverse: true},
+ tlscerts: {sortField: 'dn', sortReverse: true},
+ };
+
+ const {entity} = getMockAuditReport();
+
+ const filters = [filterWithName];
+
+ const gmp = {
+ settings: {manualUrl, reportResultsThreshold: 10},
+ user: {currentSettings, getReportComposerDefaults},
+ };
+
+ const {render, store} = rendererWith({
+ gmp,
+ capabilities: caps,
+ router: true,
+ store: true,
+ });
+
+ store.dispatch(setTimezone('CET'));
+ store.dispatch(setUsername('admin'));
+
+ const {baseElement, getAllByTestId} = render(
+ ,
+ );
+
+ const icons = baseElement.querySelectorAll('svg');
+ const inputs = baseElement.querySelectorAll('input');
+ const links = baseElement.querySelectorAll('a');
+ const tableData = baseElement.querySelectorAll('td');
+ const selects = getAllByTestId('select-selected-value');
+ const bars = getAllByTestId('progressbar-box');
+
+ // Toolbar Icons
+ expect(icons.length).toEqual(16)
+
+ // Powerfilter
+ expect(inputs[0]).toHaveAttribute('name', 'userFilterString');
+ expect(selects[0]).toHaveAttribute('title', 'Loaded filter');
+ expect(selects[0]).toHaveTextContent('Loading...');
+
+ // Header
+ expect(baseElement).toHaveTextContent(
+ 'Report:Mon, Jun 3, 2019 1:00 PM CEST',
+ );
+ expect(bars[0]).toHaveAttribute('title', 'Done');
+ expect(bars[0]).toHaveTextContent('Done');
+ expect(baseElement).toHaveTextContent(
+ 'Created:Sun, Jun 2, 2019 2:00 PM CEST',
+ );
+ expect(baseElement).toHaveTextContent(
+ 'Modified:Mon, Jun 3, 2019 1:00 PM CEST',
+ );
+ expect(baseElement).toHaveTextContent('Owner:admin');
+
+ // Tabs
+ expect(baseElement).toHaveTextContent('Information');
+ expect(baseElement).toHaveTextContent('Results(2 of 3)');
+ expect(baseElement).toHaveTextContent('Hosts(2 of 2)');
+ expect(baseElement).toHaveTextContent('Operating Systems(2 of 2)');
+ expect(baseElement).toHaveTextContent('TLS Certificates(2 of 2)');
+ expect(baseElement).toHaveTextContent('Error Messages(2 of 2)');
+ expect(baseElement).toHaveTextContent('User Tags(0)');
+
+ // Summary
+ expect(tableData[0]).toHaveTextContent('Task Name');
+ expect(links[7]).toHaveAttribute('href', '/task/314');
+ expect(tableData[1]).toHaveTextContent('foo');
+
+ expect(tableData[2]).toHaveTextContent('Comment');
+ expect(tableData[3]).toHaveTextContent('bar');
+
+ expect(tableData[4]).toHaveTextContent('Scan Time');
+ expect(tableData[5]).toHaveTextContent(
+ 'Mon, Jun 3, 2019 1:00 PM CEST - Mon, Jun 3, 2019 1:31 PM CEST',
+ );
+
+ expect(tableData[6]).toHaveTextContent('Scan Duration');
+ expect(tableData[7]).toHaveTextContent('0:31 h');
+
+ expect(tableData[8]).toHaveTextContent('Scan Status');
+ expect(bars[1]).toHaveAttribute('title', 'Done');
+ expect(bars[1]).toHaveTextContent('Done');
+
+ expect(tableData[10]).toHaveTextContent('Hosts scanned');
+ expect(tableData[11]).toHaveTextContent('3');
+
+ expect(tableData[12]).toHaveTextContent('Filter');
+ expect(tableData[13]).toHaveTextContent(
+ 'apply_overrides=0 compliance_levels=ynui min_qod=70',
+ );
+
+ expect(tableData[14]).toHaveTextContent('Timezone');
+ expect(tableData[15]).toHaveTextContent('UTC (UTC)');
+ });
+
+ test('should render audit threshold panel', () => {
+ const onActivateTab = testing.fn();
+ const onAddToAssetsClick = testing.fn();
+ const onError = testing.fn();
+ const onFilterAddLogLevelClick = testing.fn();
+ const onFilterDecreaseMinQoDClick = testing.fn();
+ const onFilterChanged = testing.fn();
+ const onFilterCreated = testing.fn();
+ const onFilterEditClick = testing.fn();
+ const onFilterRemoveSeverityClick = testing.fn();
+ const onFilterResetClick = testing.fn();
+ const onFilterRemoveClick = testing.fn();
+ const onInteraction = testing.fn();
+ const onRemoveFromAssetsClick = testing.fn();
+ const onReportDownloadClick = testing.fn();
+ const showError = testing.fn();
+ const showErrorMessage = testing.fn();
+ const showSuccessMessage = testing.fn();
+ const onSortChange = testing.fn();
+ const onTagSuccess = testing.fn();
+ const onTargetEditClick = testing.fn();
+ const onTlsCertificateDownloadClick = testing.fn();
+
+ const sorting = {
+ errors: {sortField: 'error', sortReverse: true},
+ hosts: {sortField: 'compliant', sortReverse: true},
+ os: {sortField: 'compliant', sortReverse: true},
+ results: {sortField: 'compliant', sortReverse: true},
+ tlscerts: {sortField: 'dn', sortReverse: true},
+ };
+
+ const {entity} = getMockAuditReport();
+
+ const filters = [filterWithName];
+
+ const gmp = {
+ settings: {manualUrl, reportResultsThreshold: 1},
+ user: {currentSettings, getReportComposerDefaults},
+ };
+
+ const {render, store} = rendererWith({
+ gmp,
+ capabilities: caps,
+ router: true,
+ store: true,
+ });
+
+ store.dispatch(setTimezone('CET'));
+ store.dispatch(setUsername('admin'));
+
+ const {baseElement, getAllByTestId} = render(
+ ,
+ );
+
+ const icons = baseElement.querySelectorAll('svg');
+ const inputs = baseElement.querySelectorAll('input');
+ const selects = getAllByTestId('select-selected-value');
+ const bars = getAllByTestId('progressbar-box');
+
+ // Toolbar Icons
+ expect(icons.length).toEqual(20)
+
+ // Powerfilter
+ expect(inputs[0]).toHaveAttribute('name', 'userFilterString');
+ expect(selects[0]).toHaveAttribute('title', 'Loaded filter');
+ expect(selects[0]).toHaveTextContent('Loading...');
+
+ // Header
+ expect(baseElement).toHaveTextContent(
+ 'Report:Mon, Jun 3, 2019 1:00 PM CEST',
+ );
+ expect(bars[0]).toHaveAttribute('title', 'Done');
+ expect(bars[0]).toHaveTextContent('Done');
+ expect(baseElement).toHaveTextContent(
+ 'Created:Sun, Jun 2, 2019 2:00 PM CEST',
+ );
+ expect(baseElement).toHaveTextContent(
+ 'Modified:Mon, Jun 3, 2019 1:00 PM CEST',
+ );
+ expect(baseElement).toHaveTextContent('Owner:admin');
+
+ // Tabs
+ expect(baseElement).toHaveTextContent('Information');
+ expect(baseElement).toHaveTextContent('Results(2 of 3)');
+ expect(baseElement).toHaveTextContent('Hosts(2 of 2)');
+ expect(baseElement).toHaveTextContent('Operating Systems(2 of 2)');
+ expect(baseElement).toHaveTextContent('TLS Certificates(2 of 2)');
+ expect(baseElement).toHaveTextContent('Error Messages(2 of 2)');
+ expect(baseElement).toHaveTextContent('User Tags(0)');
+
+ // Should include
+ expect(baseElement).toHaveTextContent(
+ "The Hosts cannot be displayed in order to maintain the performance within the browser's capabilities.",
+ );
+ expect(baseElement).toHaveTextContent(
+ 'Please decrease the number of results below the threshold of 1 by applying a more refined filter.',
+ );
+
+ expect(baseElement).toHaveTextContent(
+ 'Results with compliance "Yes" are currently included.',
+ );
+
+ expect(baseElement).toHaveTextContent(
+ 'Filter out results with compliance "Yes".',
+ );
+
+ expect(baseElement).toHaveTextContent(
+ 'Results with compliance "Undefined" are currently included.',
+ );
+
+ expect(baseElement).toHaveTextContent(
+ 'Filter out results with compliance "Undefined".',
+ );
+
+ expect(baseElement).toHaveTextContent(
+ 'Results with compliance "Incomplete" are currently included.',
+ );
+ expect(baseElement).toHaveTextContent(
+ 'Filter out results with compliance "Incomplete".',
+ );
+
+ expect(baseElement).toHaveTextContent(
+ 'Your filter settings may be too unrefined.',
+ );
+
+ expect(baseElement).toHaveTextContent(
+ 'Adjust and update your filter settings.',
+ );
+ expect(baseElement).toHaveTextContent(
+ '(Applied filter: apply_overrides=0 compliance_levels=ynui min_qod=70)',
+ );
+
+ // // Should not Include
+ expect(baseElement).not.toHaveTextContent('IP-Adress');
+ expect(baseElement).not.toHaveTextContent('Hostname');
+ expect(baseElement).not.toHaveTextContent('Apps');
+ expect(baseElement).not.toHaveTextContent('Distance');
+ });
+});
diff --git a/src/web/pages/reports/__tests__/auditfilterdialog.jsx b/src/web/pages/reports/__tests__/auditfilterdialog.jsx
new file mode 100644
index 0000000000..f9d29e5809
--- /dev/null
+++ b/src/web/pages/reports/__tests__/auditfilterdialog.jsx
@@ -0,0 +1,66 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {describe, test, expect, testing} from '@gsa/testing';
+import React from 'react';
+
+import Capabilities from 'gmp/capabilities/capabilities';
+
+import Filter from 'gmp/models/filter';
+
+import {rendererWith} from 'web/utils/testing';
+
+import AuditReportFilter from 'web/pages/reports/auditfilterdialog';
+
+const caps = new Capabilities(['everything']);
+
+const manualUrl = 'test/';
+
+describe('Filter Dialog for Audit report', () => {
+ test('should render filter with compliance level group', () => {
+ const onFilterChanged = testing.fn();
+ const onFilterCreated = testing.fn();
+ const onCloseClick = testing.fn();
+
+ const filter = Filter.fromString(
+ 'apply_overrides=0 levels=hmlg rows=100 min_qod=70 first=1 sort=compliant',
+ );
+
+ const gmp = {
+ settings: {manualUrl, reportResultsThreshold: 10},
+ };
+
+ const {render} = rendererWith({
+ gmp,
+ capabilities: caps,
+ });
+
+ const {getAllByTestId} = render(
+ ,
+ );
+
+ const formgroups = getAllByTestId('formgroup-title');
+ const content = getAllByTestId('formgroup-content');
+ const radioTitles = getAllByTestId('radio-title');
+
+ expect(formgroups[0]).toHaveTextContent('Filter');
+ expect(formgroups[1]).toHaveTextContent('Compliance');
+ expect(content[1]).toHaveTextContent('YesNoIncompleteUndefined');
+ expect(formgroups[2]).toHaveTextContent('QoD');
+ expect(formgroups[3]).toHaveTextContent('From Task (name)');
+ expect(formgroups[4]).toHaveTextContent('First result');
+ expect(formgroups[5]).toHaveTextContent('Results per page');
+ expect(formgroups[6]).toHaveTextContent('Sort by');
+ expect(radioTitles[0]).toHaveTextContent('Ascending');
+ expect(radioTitles[1]).toHaveTextContent('Descending');
+ });
+});
diff --git a/src/web/pages/reports/__tests__/auditreportrow.jsx b/src/web/pages/reports/__tests__/auditreportrow.jsx
new file mode 100644
index 0000000000..ff49d98ac5
--- /dev/null
+++ b/src/web/pages/reports/__tests__/auditreportrow.jsx
@@ -0,0 +1,54 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {describe, test, expect, testing} from '@gsa/testing';
+import React from 'react';
+import {rendererWith} from 'web/utils/testing';
+import AuditRow from '../auditreportrow';
+import {setTimezone} from 'web/store/usersettings/actions';
+
+import {getMockAuditReport} from 'web/pages/reports/__mocks__/mockauditreport';
+
+describe('Audit report row', () => {
+ test('should render row for Audit report', () => {
+ const {entity} = getMockAuditReport();
+ const onReportDeleteClick = testing.fn();
+ const onReportDeltaSelect = testing.fn();
+
+ const {render, store} = rendererWith({
+ capabilities: true,
+ store: true,
+ router: true,
+ });
+
+ store.dispatch(setTimezone('CET'));
+
+ const {baseElement, getAllByTestId} = render(
+ ,
+ );
+
+ const bars = getAllByTestId('progressbar-box');
+ const links = baseElement.querySelectorAll('a');
+ const rows = baseElement.querySelectorAll('tr');
+
+ expect(links[0]).toHaveAttribute('href', '/auditreport/1234');
+ expect(rows[0]).toHaveTextContent('Mon, Jun 3, 2019 1:00 PM');
+ expect(bars[0]).toHaveAttribute('title', 'Done');
+ expect(bars[0]).toHaveTextContent('Done');
+ expect(rows[0]).toHaveTextContent('foo');
+ expect(links[1]).toHaveAttribute('href', '/task/314');
+ expect(bars[1]).toHaveAttribute('title', 'No');
+ expect(bars[1]).toHaveTextContent('No');
+ expect(rows[0]).toHaveTextContent('321'); // yes: 3, no: 2, incomplete: 1
+ });
+});
diff --git a/src/web/pages/reports/__tests__/auditreportslistpage.jsx b/src/web/pages/reports/__tests__/auditreportslistpage.jsx
new file mode 100644
index 0000000000..0539914828
--- /dev/null
+++ b/src/web/pages/reports/__tests__/auditreportslistpage.jsx
@@ -0,0 +1,267 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {describe, test, expect, testing} from '@gsa/testing';
+import React from 'react';
+import {act} from 'react-dom/test-utils';
+
+import CollectionCounts from 'gmp/collection/collectioncounts';
+
+import Filter from 'gmp/models/filter';
+
+import {setTimezone, setUsername} from 'web/store/usersettings/actions';
+import {entitiesActions} from 'web/store/entities/auditreports';
+import {loadingActions} from 'web/store/usersettings/defaults/actions';
+import {defaultFilterLoadingActions} from 'web/store/usersettings/defaultfilters/actions';
+
+import {rendererWith, waitFor, fireEvent} from 'web/utils/testing';
+import {getMockAuditReport} from 'web/pages/reports/__mocks__/mockauditreport';
+import AuditReportsPage from '../auditreportslistpage';
+
+window.URL.createObjectURL = testing.fn();
+
+const {entity} = getMockAuditReport();
+
+const reloadInterval = 1;
+const manualUrl = 'test/';
+
+const currentSettings = testing.fn().mockResolvedValue({
+ foo: 'bar',
+});
+
+const getFilters = testing.fn().mockReturnValue(
+ Promise.resolve({
+ data: [],
+ meta: {
+ filter: Filter.fromString(),
+ counts: new CollectionCounts(),
+ },
+ }),
+);
+
+const getDashboardSetting = testing.fn().mockResolvedValue({
+ data: [],
+ meta: {
+ filter: Filter.fromString(),
+ counts: new CollectionCounts(),
+ },
+});
+
+const getUserSetting = testing.fn().mockResolvedValue({
+ filter: null,
+});
+
+const getComplianceAggregates = testing.fn().mockResolvedValue({
+ data: [],
+ meta: {
+ filter: Filter.fromString(),
+ counts: new CollectionCounts(),
+ },
+});
+
+const getReports = testing.fn().mockResolvedValue({
+ data: [entity],
+ meta: {
+ filter: Filter.fromString(),
+ counts: new CollectionCounts(),
+ },
+});
+
+const getAll = testing.fn().mockResolvedValue({
+ data: [],
+ meta: {
+ filter: Filter.fromString(),
+ counts: new CollectionCounts(),
+ },
+});
+
+const getReportFormats = testing.fn().mockResolvedValue({
+ data: [],
+ meta: {
+ filter: Filter.fromString(),
+ counts: new CollectionCounts(),
+ },
+});
+
+describe('AuditReportsPage tests', () => {
+ test('should render full AuditReports Page', async () => {
+ const gmp = {
+ auditreports: {
+ get: getReports,
+ getComplianceAggregates: getComplianceAggregates,
+ },
+ filters: {
+ get: getFilters,
+ },
+ reportformats: {
+ get: getReportFormats,
+ },
+ dashboard: {
+ getSetting: getDashboardSetting,
+ },
+ reloadInterval,
+ settings: {manualUrl},
+ user: {currentSettings, getSetting: getUserSetting},
+ };
+
+ const {render, store} = rendererWith({
+ gmp,
+ capabilities: true,
+ store: true,
+ router: true,
+ });
+
+ store.dispatch(setTimezone('CET'));
+ store.dispatch(setUsername('admin'));
+
+ const defaultSettingfilter = Filter.fromString('foo=bar');
+ store.dispatch(loadingActions.success({rowsperpage: {value: '2'}}));
+ store.dispatch(
+ defaultFilterLoadingActions.success('auditreport', defaultSettingfilter),
+ );
+
+ const counts = new CollectionCounts({
+ first: 1,
+ all: 1,
+ filtered: 1,
+ length: 1,
+ rows: 10,
+ });
+ const filter = Filter.fromString('first=1 rows=10');
+ const loadedFilter = Filter.fromString('first=1 rows=10');
+ store.dispatch(
+ entitiesActions.success([entity], filter, loadedFilter, counts),
+ );
+
+ const {baseElement, getAllByTestId} = render( );
+
+ await waitFor(() => baseElement.querySelectorAll('table'));
+
+ const display = getAllByTestId('grid-item');
+ const icons = getAllByTestId('svg-icon');
+ const inputs = baseElement.querySelectorAll('input');
+ const header = baseElement.querySelectorAll('th');
+ const row = baseElement.querySelectorAll('tr');
+ const selects = getAllByTestId('select-selected-value');
+
+ // Toolbar Icons
+ expect(icons[0]).toHaveAttribute('title', 'Help: Audit Reports');
+
+ // Powerfilter
+ expect(inputs[0]).toHaveAttribute('name', 'userFilterString');
+ expect(icons[1]).toHaveAttribute('title', 'Update Filter');
+ expect(icons[2]).toHaveAttribute('title', 'Remove Filter');
+ expect(icons[3]).toHaveAttribute('title', 'Reset to Default Filter');
+ expect(icons[4]).toHaveAttribute('title', 'Help: Powerfilter');
+ expect(icons[5]).toHaveAttribute('title', 'Edit Filter');
+ expect(selects[0]).toHaveAttribute('title', 'Loaded filter');
+ expect(selects[0]).toHaveTextContent('--');
+
+ // // Dashboard
+ expect(icons[7]).toHaveAttribute('title', 'Add new Dashboard Display');
+ expect(icons[8]).toHaveAttribute('title', 'Reset to Defaults');
+ expect(display[0]).toHaveTextContent(
+ 'Audit Reports by Compliance (Total: 0)',
+ );
+ expect(display[1]).toHaveTextContent(
+ 'Audit Reports by Compliance (Total: 0)',
+ );
+
+ // Table
+ expect(header[0]).toHaveTextContent('Date');
+ expect(header[1]).toHaveTextContent('Status');
+ expect(header[2]).toHaveTextContent('Task');
+ expect(header[3]).toHaveTextContent('Compliant');
+ expect(header[4]).toHaveTextContent('Yes');
+ expect(header[5]).toHaveTextContent('No');
+ expect(header[6]).toHaveTextContent('Incomplete');
+ expect(header[7]).toHaveTextContent('Actions');
+
+ expect(row[1]).toHaveTextContent('Mon, Jun 3, 2019 1:00 PM');
+ expect(row[1]).toHaveTextContent('Done');
+ expect(row[1]).toHaveTextContent('foo');
+ expect(row[1]).toHaveTextContent('No');
+ expect(row[1]).toHaveTextContent('321'); // yes: 3, no: 2, incomplete: 1
+ });
+
+ test('should call commands for bulk actions', async () => {
+ const deleteByFilter = testing.fn().mockResolvedValue({
+ foo: 'bar',
+ });
+
+ const exportByFilter = testing.fn().mockResolvedValue({
+ foo: 'bar',
+ });
+
+ const gmp = {
+ auditreports: {
+ get: getReports,
+ getComplianceAggregates: getComplianceAggregates,
+ deleteByFilter,
+ exportByFilter,
+ },
+ filters: {
+ get: getFilters,
+ },
+ reportformats: {
+ get: getReportFormats,
+ },
+ dashboard: {
+ getSetting: getDashboardSetting,
+ },
+ tags: {
+ getAll: getAll,
+ },
+ reloadInterval,
+ settings: {manualUrl},
+ user: {currentSettings, getSetting: getUserSetting},
+ };
+
+ const {render, store} = rendererWith({
+ gmp,
+ capabilities: true,
+ store: true,
+ router: true,
+ });
+
+ store.dispatch(setTimezone('CET'));
+ store.dispatch(setUsername('admin'));
+
+ const defaultSettingfilter = Filter.fromString('foo=bar');
+ store.dispatch(loadingActions.success({rowsperpage: {value: '2'}}));
+ store.dispatch(
+ defaultFilterLoadingActions.success('auditreport', defaultSettingfilter),
+ );
+
+ const counts = new CollectionCounts({
+ first: 1,
+ all: 1,
+ filtered: 1,
+ length: 1,
+ rows: 10,
+ });
+ const filter = Filter.fromString('first=1 rows=10');
+ const loadedFilter = Filter.fromString('first=1 rows=10');
+ store.dispatch(
+ entitiesActions.success([entity], filter, loadedFilter, counts),
+ );
+
+ const {baseElement, getAllByTestId} = render( );
+
+ await waitFor(() => baseElement.querySelectorAll('table'));
+
+ const icons = getAllByTestId('svg-icon');
+
+ await act(async () => {
+ expect(icons[19]).toHaveAttribute('title', 'Add tag to page contents');
+ fireEvent.click(icons[19]);
+ expect(getAll).toHaveBeenCalled();
+
+ expect(icons[20]).toHaveAttribute('title', 'Delete page contents');
+ fireEvent.click(icons[20]);
+ expect(deleteByFilter).toHaveBeenCalled();
+ });
+ });
+});
diff --git a/src/web/pages/reports/__tests__/detailsfilterdialog.jsx b/src/web/pages/reports/__tests__/detailsfilterdialog.jsx
new file mode 100644
index 0000000000..4c26cc56bb
--- /dev/null
+++ b/src/web/pages/reports/__tests__/detailsfilterdialog.jsx
@@ -0,0 +1,119 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {describe, test, expect, testing} from '@gsa/testing';
+import React from 'react';
+
+import Capabilities from 'gmp/capabilities/capabilities';
+
+import Filter from 'gmp/models/filter';
+
+import {rendererWith} from 'web/utils/testing';
+
+import FilterDialog from 'web/pages/reports/detailsfilterdialog';
+
+const caps = new Capabilities(['everything']);
+
+const manualUrl = 'test/';
+
+describe('Details Filter Dialog for Audit report', () => {
+ test('should render compliance levels filter group', () => {
+ const onFilterChanged = testing.fn();
+ const onFilterCreated = testing.fn();
+ const onCloseClick = testing.fn();
+
+ const filter = Filter.fromString(
+ 'apply_overrides=0 levels=hmlg rows=100 min_qod=70 first=1 sort=compliant',
+ );
+
+ const gmp = {
+ settings: {manualUrl, reportResultsThreshold: 10},
+ };
+
+ const {render} = rendererWith({
+ gmp,
+ capabilities: caps,
+ });
+
+ const {getAllByTestId} = render(
+ ,
+ );
+
+ const formgroups = getAllByTestId('formgroup-title');
+ const content = getAllByTestId('formgroup-content');
+
+ expect(formgroups[0]).toHaveTextContent('Filter');
+ expect(formgroups[1]).toHaveTextContent(
+ 'Only show hosts that have results',
+ );
+ expect(formgroups[2]).toHaveTextContent('QoD');
+ expect(formgroups[3]).toHaveTextContent('Compliance');
+ expect(content[3]).toHaveTextContent('YesNoIncompleteUndefined');
+ expect(formgroups[4]).toHaveTextContent('Solution Type');
+ expect(formgroups[5]).toHaveTextContent('Vulnerability');
+ expect(formgroups[6]).toHaveTextContent('Host (IP)');
+ expect(formgroups[7]).toHaveTextContent('Location (eg. port/protocol)');
+ expect(formgroups[8]).toHaveTextContent('First result');
+ expect(formgroups[9]).toHaveTextContent('Results per page');
+ });
+
+ test('should render severity levels filter group', () => {
+ const onFilterChanged = testing.fn();
+ const onFilterCreated = testing.fn();
+ const onCloseClick = testing.fn();
+
+ const filter = Filter.fromString(
+ 'apply_overrides=0 levels=hmlg rows=100 min_qod=70 first=1 sort=severity',
+ );
+
+ const gmp = {
+ settings: {manualUrl, reportResultsThreshold: 10},
+ };
+
+ const {render} = rendererWith({
+ gmp,
+ capabilities: caps,
+ });
+
+ const {getAllByTestId} = render(
+ ,
+ );
+
+ const formgroups = getAllByTestId('formgroup-title');
+ const content = getAllByTestId('formgroup-content');
+
+ expect(formgroups[0]).toHaveTextContent('Filter');
+ expect(formgroups[1]).toHaveTextContent('Apply Overrides');
+ expect(formgroups[2]).toHaveTextContent(
+ 'Only show hosts that have results',
+ );
+ expect(formgroups[3]).toHaveTextContent('QoD');
+ expect(formgroups[4]).toHaveTextContent('Severity (Class)');
+ expect(content[4]).toHaveTextContent('HighMediumLowLogFalse Pos.');
+ expect(formgroups[5]).toHaveTextContent('Severity');
+ expect(formgroups[6]).toHaveTextContent('Solution Type');
+ expect(formgroups[7]).toHaveTextContent('Vulnerability');
+ expect(formgroups[8]).toHaveTextContent('Host (IP)');
+ expect(formgroups[9]).toHaveTextContent('Location (eg. port/protocol)');
+ expect(formgroups[10]).toHaveTextContent('First result');
+ expect(formgroups[11]).toHaveTextContent('Results per page');
+ });
+});
diff --git a/src/web/pages/reports/auditdashboard/index.jsx b/src/web/pages/reports/auditdashboard/index.jsx
new file mode 100644
index 0000000000..ab590e00b1
--- /dev/null
+++ b/src/web/pages/reports/auditdashboard/index.jsx
@@ -0,0 +1,36 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+
+import Dashboard from 'web/components/dashboard/dashboard';
+
+import {
+ ReportComplianceDisplay,
+ ReportComplianceTableDisplay,
+} from './statusdisplay';
+
+export const AUDIT_REPORTS_DASHBOARD_ID =
+ '8083d77b-05bb-4b17-ab39-c81175cb512c';
+
+export const AUDIT_REPORTS_DISPLAYS = [
+ ReportComplianceDisplay.displayId,
+ ReportComplianceTableDisplay.displayId,
+];
+
+const AuditReportsDashboard = props => (
+
+);
+
+export default AuditReportsDashboard;
\ No newline at end of file
diff --git a/src/web/pages/reports/auditdashboard/loaders.jsx b/src/web/pages/reports/auditdashboard/loaders.jsx
new file mode 100644
index 0000000000..54ddad147f
--- /dev/null
+++ b/src/web/pages/reports/auditdashboard/loaders.jsx
@@ -0,0 +1,30 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import Loader, {
+ loadFunc,
+ loaderPropTypes,
+} from 'web/store/dashboard/data/loader';
+
+export const REPORTS_COMPLIANCE = 'reports-compliance';
+
+export const reportComplianceLoader = loadFunc(
+ ({gmp, filter}) =>
+ gmp.auditreports.getComplianceAggregates({filter}).then(r => r.data),
+ REPORTS_COMPLIANCE,
+);
+
+export const ReportCompianceLoader = ({children, filter}) => (
+
+ {children}
+
+);
+
+ReportCompianceLoader.propTypes = loaderPropTypes;
\ No newline at end of file
diff --git a/src/web/pages/reports/auditdashboard/statusdisplay.jsx b/src/web/pages/reports/auditdashboard/statusdisplay.jsx
new file mode 100644
index 0000000000..7305781531
--- /dev/null
+++ b/src/web/pages/reports/auditdashboard/statusdisplay.jsx
@@ -0,0 +1,89 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+
+import {_, _l} from 'gmp/locale/lang';
+
+import {AUDIT_REPORTS_FILTER_FILTER} from 'gmp/models/filter';
+import {getTranslatableReportCompliance} from 'gmp/models/auditreport';
+
+import {registerDisplay} from 'web/components/dashboard/registry';
+import {
+ complianceColorScale,
+ totalCount,
+ percent,
+} from 'web/components/dashboard/display/utils';
+
+import createDisplay from 'web/components/dashboard/display/createDisplay';
+import DataTable from 'web/components/dashboard/display/datatable';
+import DataTableDisplay from 'web/components/dashboard/display/datatabledisplay'; // eslint-disable-line max-len
+
+import StatusDisplay from 'web/components/dashboard/display/status/statusdisplay'; // eslint-disable-line max-len
+
+import {ReportCompianceLoader} from './loaders';
+
+const transformStatusData = (data = {}) => {
+ const {groups = []} = data;
+
+ const sum = totalCount(groups);
+
+ const tdata = groups.map(group => {
+ const {count, value} = group;
+ const translatableValue = getTranslatableReportCompliance(value);
+ const perc = percent(count, sum);
+ return {
+ value: count,
+ label: translatableValue,
+ toolTip: `${translatableValue}: ${perc}% (${count})`,
+ color: complianceColorScale(value),
+ filterValue: value,
+ };
+ });
+
+ tdata.total = sum;
+
+ return tdata;
+};
+
+export const ReportComplianceDisplay = createDisplay({
+ dataTransform: transformStatusData,
+ displayComponent: StatusDisplay,
+ filterTerm: 'compliant',
+ displayId: 'report-by-compliance',
+ title: ({data: tdata}) =>
+ _('Audit Reports by Compliance (Total: {{count}})', {
+ count: tdata.total,
+ }),
+ filtersFilter: AUDIT_REPORTS_FILTER_FILTER,
+ loaderComponent: ReportCompianceLoader,
+});
+
+export const ReportComplianceTableDisplay = createDisplay({
+ chartComponent: DataTable,
+ displayComponent: DataTableDisplay,
+ loaderComponent: ReportCompianceLoader,
+ dataTransform: transformStatusData,
+ dataTitles: [_l('Status'), _l('# of Reports')],
+ dataRow: row => [row.label, row.value],
+ title: ({data: tdata}) =>
+ _('Audit Reports by Compliance (Total: {{count}})', {
+ count: tdata.total,
+ }),
+ displayId: 'report-by-compliance-table',
+ displayName: 'ReportComplianceTableDisplay',
+ filtersFilter: AUDIT_REPORTS_FILTER_FILTER,
+});
+
+registerDisplay(ReportComplianceDisplay.displayId, ReportComplianceDisplay, {
+ title: _l('Chart: Audit Reports by Compliance'),
+});
+
+registerDisplay(
+ ReportComplianceTableDisplay.displayId,
+ ReportComplianceTableDisplay,
+ {
+ title: _l('Table: Audit Reports by Compliance'),
+ },
+);
\ No newline at end of file
diff --git a/src/web/pages/reports/auditdeltadetailspage.jsx b/src/web/pages/reports/auditdeltadetailspage.jsx
new file mode 100644
index 0000000000..2a65928c1f
--- /dev/null
+++ b/src/web/pages/reports/auditdeltadetailspage.jsx
@@ -0,0 +1,565 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+
+import React, {useEffect, useState} from 'react';
+
+import {useDispatch, useSelector, shallowEqual} from 'react-redux';
+
+import {useRouteMatch} from 'react-router-dom';
+
+import useTranslation from 'web/hooks/useTranslation';
+
+import logger from 'gmp/log';
+
+import Filter, {
+ ALL_FILTER,
+ RESET_FILTER,
+ RESULTS_FILTER_FILTER
+} from 'gmp/models/filter';
+import {isActive} from 'gmp/models/task';
+
+import {first} from 'gmp/utils/array';
+import {isDefined, hasValue} from 'gmp/utils/identity';
+
+import withDownload from 'web/components/form/withDownload';
+
+import Reload, {
+ NO_RELOAD,
+ USE_DEFAULT_RELOAD_INTERVAL_ACTIVE,
+} from 'web/components/loading/reload';
+
+import withDialogNotification from 'web/components/notification/withDialogNotifiaction'; // eslint-disable-line max-len
+
+import DownloadReportDialog from 'web/pages/reports/downloadreportdialog';
+
+import {
+ loadAllEntities as loadFilters,
+ selector as filterSelector,
+} from 'web/store/entities/filters';
+
+import {
+ loadAllEntities as loadReportFormats,
+ selector as reportFormatsSelector,
+} from 'web/store/entities/reportformats';
+
+import {
+ loadAllEntities as loadReportConfigs,
+ selector as reportConfigsSelector,
+} from 'web/store/entities/reportconfigs';
+
+import {loadDeltaAuditReport} from 'web/store/entities/report/actions';
+
+import {deltaAuditReportSelector} from 'web/store/entities/report/selectors';
+
+import {
+ loadReportComposerDefaults,
+ renewSessionTimeout,
+ saveReportComposerDefaults,
+} from 'web/store/usersettings/actions';
+
+import {loadUserSettingDefaults} from 'web/store/usersettings/defaults/actions';
+import {getUserSettingsDefaults} from 'web/store/usersettings/defaults/selectors';
+import {getUserSettingsDefaultFilter} from 'web/store/usersettings/defaultfilters/selectors';
+
+import {
+ getReportComposerDefaults,
+ getUsername,
+} from 'web/store/usersettings/selectors';
+
+import compose from 'web/utils/compose';
+import {generateFilename} from 'web/utils/render';
+import PropTypes from 'web/utils/proptypes';
+import useGmp from 'web/hooks/useGmp';
+
+import TargetComponent from '../targets/component';
+
+import Page from './deltadetailscontent';
+import FilterDialog from './detailsfilterdialog';
+
+const log = logger.getLogger('web.pages.report.deltadetailspage');
+
+const DEFAULT_FILTER = Filter.fromString(
+ 'levels=hmlg rows=100 min_qod=70 first=1 sort-reverse=compliant',
+);
+
+const REPORT_FORMATS_FILTER = Filter.fromString('active=1 and trust=1 rows=-1');
+
+const getTarget = (entity = {}) => {
+ const {report = {}} = entity;
+ const {task = {}} = report;
+ return task.target;
+};
+
+const DeltaAuditReportDetails = props => {
+ const [activeTab, setActiveTab] = useState(0);
+ const [showFilterDialog, setShowFilterDialog] = useState(false);
+ const [showDownloadReportDialog, setShowDownloadReportDialog] =
+ useState(false);
+ const [reportFormatId, setReportFormatId] = useState();
+ const [isUpdating, setIsUpdating] = useState(false);
+ // storeAsDefault is set in SaveDialogContent
+ // eslint-disable-next-line no-unused-vars
+ const [storeAsDefault, setStoreAsDefault] = useState();
+
+ const [sorting, setSorting] = useState({
+ results: {
+ sortField: 'compliant',
+ sortReverse: true,
+ },
+ errors: {
+ sortField: 'error',
+ sortReverse: false,
+ },
+ });
+
+ const [_] = useTranslation();
+ const gmp = useGmp();
+ const dispatch = useDispatch();
+ const match = useRouteMatch();
+ const {id: reportId, deltaid: deltaReportId} = match.params;
+
+ const reportFormatsSel = useSelector(reportFormatsSelector);
+ const reportConfigsSel = useSelector(reportConfigsSelector);
+ const reportFormats = reportFormatsSel?.getAllEntities(REPORT_FORMATS_FILTER);
+ const reportConfigs = reportConfigsSel?.getAllEntities(ALL_FILTER);
+ const userDefaultFilterSel = useSelector(
+ rootState => getUserSettingsDefaultFilter(rootState, 'result'),
+ shallowEqual,
+ );
+ const resultDefaultFilter = userDefaultFilterSel?.getFilter('result');
+ const reportComposerDefaults = useSelector(getReportComposerDefaults);
+ const userDefaultsSelector = useSelector(
+ getUserSettingsDefaults,
+ shallowEqual,
+ );
+ const reportExportFileName = userDefaultsSelector?.getValueByName(
+ 'reportexportfilename',
+ );
+ const username = useSelector(getUsername);
+ const filterSel = useSelector(filterSelector);
+ const filters = filterSel?.getAllEntities(RESULTS_FILTER_FILTER);
+ const [entity, entityError] = useSelector(state => {
+ const deltaSel = deltaAuditReportSelector(state);
+ return [
+ deltaSel?.getEntity(reportId, deltaReportId),
+ deltaSel?.getError(reportId, deltaReportId),
+ ];
+ });
+ const isLoading = !isDefined(entity);
+
+ useEffect(() => {
+ dispatch(loadUserSettingDefaults(gmp)());
+ dispatch(loadFilters(gmp)(RESULTS_FILTER_FILTER));
+ dispatch(loadReportFormats(gmp)(REPORT_FORMATS_FILTER));
+ dispatch(loadReportConfigs(gmp)(ALL_FILTER));
+ dispatch(loadReportComposerDefaults(gmp)());
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+
+ useEffect(() => {
+ if (
+ !isDefined(reportFormatId) &&
+ isDefined(reportFormats) &&
+ reportFormats.length > 0
+ ) {
+ // set initial report format id if available
+ const initialReportFormatId = first(reportFormats).id;
+ if (isDefined(initialReportFormatId)) {
+ // ensure the report format id is only set if we really have one
+ // if no report format id is available we would create an infinite
+ // render loop here
+ setReportFormatId({initialReportFormatId});
+ } else {
+ // if there is no report format at all, throw a proper error message
+ // instead of just showing x is undefined JS stacktrace
+ const noReportFormatError = _(
+ 'The report cannot be displayed because' +
+ ' no report format is available.' +
+ ' This could be due to a missing gvmd data feed. Please update' +
+ ' the gvmd data feed, check the "feed import owner" setting, the' +
+ ' feed status page, or contact your system administrator.',
+ );
+ throw new Error(noReportFormatError);
+ }
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [reportFormats, reportFormatId]);
+
+ useEffect(() => {
+ load();
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [reportId, deltaReportId]);
+
+ const load = filter => {
+ log.debug('Loading report', {
+ filter,
+ });
+ const {reportFilter: prevFilter} = props;
+
+ setIsUpdating(!isDefined(prevFilter) || !prevFilter.equals(filter));
+
+ props
+ .reload(filter)
+ .then(() => {
+ setIsUpdating(false);
+ })
+ .catch(() => {
+ setIsUpdating(false);
+ });
+ };
+
+ const reload = () => {
+ // reload data from backend
+ load(props.reportFilter);
+ };
+
+ const handleChanged = () => {
+ reload();
+ };
+
+ const handleError = error => {
+ const {showError} = props;
+ log.error(error);
+ showError(error);
+ };
+
+ const handleFilterChange = filter => {
+ handleInteraction();
+ load(filter);
+ };
+
+ const handleFilterRemoveClick = () => {
+ handleFilterChange(RESET_FILTER);
+ };
+
+ const handleFilterResetClick = () => {
+ if (hasValue(resultDefaultFilter)) {
+ handleFilterChange(resultDefaultFilter);
+ } else {
+ handleFilterChange(DEFAULT_FILTER);
+ }
+ };
+
+ const handleActivateTab = index => {
+ handleInteraction();
+ setActiveTab(index);
+ };
+
+ const handleAddToAssets = () => {
+ const {showSuccessMessage, reportFilter: filter} = props;
+
+ handleInteraction();
+
+ gmp.auditreport.addAssets(entity, {filter}).then(() => {
+ showSuccessMessage(
+ _(
+ 'Report content added to Assets with QoD>=70% and Overrides enabled.',
+ ),
+ );
+ reload();
+ }, handleError);
+ };
+
+ const handleRemoveFromAssets = () => {
+ const {showSuccessMessage, reportFilter: filter} = props;
+
+ handleInteraction();
+
+ gmp.auditreport.removeAssets(entity, {filter}).then(() => {
+ showSuccessMessage(_('Report content removed from Assets.'));
+ reload();
+ }, handleError);
+ };
+
+ const handleFilterEditClick = () => {
+ handleInteraction();
+
+ setShowFilterDialog(true);
+ };
+
+ const handleFilterDialogClose = () => {
+ handleInteraction();
+ setShowFilterDialog(false);
+ };
+
+ const handleOpenDownloadReportDialog = () => {
+ setShowDownloadReportDialog(true);
+ };
+
+ const handleCloseDownloadReportDialog = () => {
+ setShowDownloadReportDialog(false);
+ };
+
+ const handleReportDownload = state => {
+ const {reportFilter, onDownload} = props;
+ // eslint-disable-next-line no-shadow
+ const {includeNotes, includeOverrides, reportFormatId, storeAsDefault} =
+ state;
+
+ const newFilter = reportFilter.copy();
+ newFilter.set('notes', includeNotes);
+ newFilter.set('overrides', includeOverrides);
+
+ if (storeAsDefault) {
+ const defaults = {
+ ...reportComposerDefaults,
+ defaultReportFormatId: reportFormatId,
+ includeNotes,
+ includeOverrides,
+ };
+ dispatch(saveReportComposerDefaults(gmp)(defaults));
+ }
+
+ const report_format = reportFormats
+ ? reportFormats.find(format => reportFormatId === format.id)
+ : undefined;
+
+ const extension = isDefined(report_format)
+ ? report_format.extension
+ : 'unknown'; // unknown should never happen but we should be save here
+
+ handleInteraction();
+
+ return gmp.auditreport
+ .download(entity, {
+ reportFormatId,
+ deltaReportId,
+ filter: newFilter,
+ })
+ .then(response => {
+ setShowDownloadReportDialog(false);
+ const {data} = response;
+ const filename = generateFilename({
+ creationTime: entity.creationTime,
+ extension,
+ fileNameFormat: reportExportFileName,
+ id: entity.id,
+ modificationTime: entity.modificationTime,
+ reportFormat: report_format?.name,
+ resourceName: entity.task.name,
+ resourceType: 'report',
+ username,
+ });
+
+ onDownload({filename, data});
+ }, handleError);
+ };
+
+ const handleFilterCreated = filter => {
+ handleInteraction();
+ load(filter);
+ dispatch(loadFilters(gmp)(RESULTS_FILTER_FILTER));
+ };
+
+ const handleFilterDecreaseMinQoD = () => {
+ const {reportFilter} = props;
+
+ handleInteraction();
+
+ if (reportFilter.has('min_qod')) {
+ const lfilter = reportFilter.copy();
+ lfilter.set('min_qod', 30);
+ load(lfilter);
+ }
+ };
+
+ const handleSortChange = (name, sortField) => {
+ handleInteraction();
+
+ const prev = sorting[name];
+
+ const sortReverse =
+ sortField === prev.sortField ? !prev.sortReverse : false;
+
+ const newSorting = {
+ ...sorting,
+ [name]: {
+ sortField,
+ sortReverse,
+ },
+ };
+ setSorting(newSorting);
+ };
+
+ const handleInteraction = () => dispatch(renewSessionTimeout(gmp)());
+
+ const loadTarget = () => {
+ const target = getTarget(entity);
+ return gmp.target.get({id: target.id});
+ };
+
+ const {reportFilter, showError, showErrorMessage, showSuccessMessage} = props;
+
+ const {report} = entity || {};
+
+ return (
+
+
+ {({edit}) => (
+
+ loadTarget().then(response => edit(response.data))
+ }
+ showError={showError}
+ showErrorMessage={showErrorMessage}
+ showSuccessMessage={showSuccessMessage}
+ />
+ )}
+
+ {showFilterDialog && (
+
+ )}
+ {showDownloadReportDialog && (
+
+ )}
+
+ );
+};
+
+DeltaAuditReportDetails.propTypes = {
+ defaultFilter: PropTypes.filter,
+ location: PropTypes.object.isRequired,
+ reload: PropTypes.func.isRequired,
+ reportFilter: PropTypes.filter,
+ showError: PropTypes.func.isRequired,
+ showErrorMessage: PropTypes.func.isRequired,
+ showSuccessMessage: PropTypes.func.isRequired,
+ target: PropTypes.model,
+ username: PropTypes.string,
+ onDownload: PropTypes.func.isRequired,
+};
+
+const reloadInterval = report =>
+ isDefined(report) && isActive(report.report.scan_run_status)
+ ? USE_DEFAULT_RELOAD_INTERVAL_ACTIVE
+ : NO_RELOAD; // report doesn't change anymore. no need to reload
+
+const load =
+ ({defaultFilter, reportId, deltaReportId, dispatch, gmp, reportFilter}) =>
+ filter => {
+ if (!hasValue(filter)) {
+ // use loaded filter after initial loading
+ filter = reportFilter;
+ }
+
+ if (!hasValue(filter)) {
+ // use filter from user setting
+ filter = defaultFilter;
+ }
+
+ if (!hasValue(filter)) {
+ // use fallback filter
+ filter = DEFAULT_FILTER;
+ }
+
+ // to avoid confusion of loaded results with different sort terms and
+ // directions, always load the report with sort=name from gvmd (the user's
+ // sort term will be handled by GSA in the browser)
+ filter.delete('sort-reverse');
+ filter.set('sort', 'name');
+ return dispatch(
+ loadDeltaAuditReport(gmp)(reportId, deltaReportId, filter),
+ ).then(() =>
+ dispatch(loadDeltaAuditReport(gmp)(reportId, deltaReportId, filter)),
+ );
+ };
+
+const DeltaAuditReportDetailsWrapper = ({defaultFilter, ...props}) => {
+ const gmp = useGmp();
+ const dispatch = useDispatch();
+ const match = useRouteMatch();
+
+ const {id: reportId, deltaid: deltaReportId} = match.params;
+ const deltaSel = useSelector(deltaAuditReportSelector, shallowEqual);
+ const entity = deltaSel.getEntity(reportId, deltaReportId);
+ const reportFilter = entity?.report?.filter;
+
+ return (
+ reloadInterval(entity)}
+ >
+ {({reload}) => (
+
+ )}
+
+ );
+};
+
+DeltaAuditReportDetailsWrapper.propTypes = {
+ defaultFilter: PropTypes.filter,
+};
+
+export default compose(
+ withDialogNotification,
+ withDownload,
+)(DeltaAuditReportDetailsWrapper);
\ No newline at end of file
diff --git a/src/web/pages/reports/auditdetailscontent.jsx b/src/web/pages/reports/auditdetailscontent.jsx
new file mode 100644
index 0000000000..9006567e62
--- /dev/null
+++ b/src/web/pages/reports/auditdetailscontent.jsx
@@ -0,0 +1,448 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+
+import React from 'react';
+
+import styled from 'styled-components';
+
+import useTranslation from 'web/hooks/useTranslation';
+
+import {TASK_STATUS} from 'gmp/models/task';
+
+import {isDefined} from 'gmp/utils/identity';
+
+import StatusBar from 'web/components/bar/statusbar';
+import ToolBar from 'web/components/bar/toolbar';
+
+import DateTime from 'web/components/date/datetime';
+
+import ErrorPanel from 'web/components/error/errorpanel';
+
+import ReportIcon from 'web/components/icon/reporticon';
+
+import Divider from 'web/components/layout/divider';
+import Layout from 'web/components/layout/layout';
+
+import Loading from 'web/components/loading/loading';
+
+import Powerfilter from 'web/components/powerfilter/powerfilter';
+
+import Tab from 'web/components/tab/tab';
+import TabLayout from 'web/components/tab/tablayout';
+import TabList from 'web/components/tab/tablist';
+import TabPanel from 'web/components/tab/tabpanel';
+import TabPanels from 'web/components/tab/tabpanels';
+import Tabs from 'web/components/tab/tabs';
+
+import Section from 'web/components/section/section';
+import SectionHeader from 'web/components/section/header';
+
+import EntityInfo from 'web/entity/info';
+import EntityTags from 'web/entity/tags';
+
+import PropTypes from 'web/utils/proptypes';
+import useGmp from 'web/hooks/useGmp';
+
+import ErrorsTab from './details/errorstab';
+import HostsTab from './details/hoststab';
+import OperatingSystemsTab from './details/operatingsystemstab';
+import ResultsTab from './details/resultstab';
+import Summary from './details/summary';
+import TabTitle from './details/tabtitle';
+import AuditThresholdPanel from './details/auditthresholdpanel';
+import TLSCertificatesTab from './details/tlscertificatestab';
+import ToolBarIcons from './details/toolbaricons';
+
+const Span = styled.span`
+ margin-top: 2px;
+`;
+
+const PageContent = ({
+ activeTab,
+ entity,
+ errorsCounts,
+ filters,
+ hostsCounts,
+ isLoading = true,
+ isLoadingFilters = true,
+ isUpdating = false,
+ operatingSystemsCounts,
+ pageFilter,
+ reportError,
+ reportFilter,
+ reportId,
+ resetFilter,
+ resultsCounts,
+ sorting,
+ showError,
+ showErrorMessage,
+ showSuccessMessage,
+ task,
+ tlsCertificatesCounts,
+ onActivateTab,
+ onAddToAssetsClick,
+ onTlsCertificateDownloadClick,
+ onError,
+ onFilterChanged,
+ onFilterCreated,
+ onFilterDecreaseMinQoDClick,
+ onFilterEditClick,
+ onFilterRemoveClick,
+ onFilterResetClick,
+ onInteraction,
+ onRemoveFromAssetsClick,
+ onReportDownloadClick,
+ onSortChange,
+ onTagSuccess,
+ onTargetEditClick,
+}) => {
+ const hasReport = isDefined(entity);
+
+ const report = hasReport ? entity.report : undefined;
+
+ const userTags = hasReport ? report.userTags : undefined;
+ const userTagsCount = isDefined(userTags) ? userTags.length : 0;
+ const gmp = useGmp();
+ const [_] = useTranslation();
+
+ const {
+ errors = {},
+ hosts = {},
+ operatingSystems = {},
+ results = {},
+ tlsCertificates = {},
+ timestamp,
+ scan_run_status,
+ } = report || {};
+
+ if (!hasReport && isDefined(reportError)) {
+ return (
+
+ );
+ }
+
+ const threshold = gmp.settings.reportResultsThreshold;
+
+ const showThresholdMessage =
+ !isLoading && hasReport && results.counts.filtered > threshold;
+
+ const isContainer = isDefined(task) && task.isContainer();
+ const status = isContainer ? TASK_STATUS.container : scan_run_status;
+ const progress = isDefined(task) ? task.progress : 0;
+
+ const showIsLoading = isLoading && !hasReport;
+
+ const showInitialLoading =
+ isLoading &&
+ !isDefined(reportError) &&
+ !showThresholdMessage &&
+ (!isDefined(results.entities) || results.entities.length === 0);
+
+ const header_title = (
+
+ {_('Audit Report:')}
+ {showIsLoading ? (
+ {_('Loading')}
+ ) : (
+
+
+
+
+
+
+ )}
+
+ );
+
+ const header = (
+ } title={header_title}>
+ {hasReport && }
+
+ );
+
+ return (
+
+
+
+
+
+
+
+
+
+ {showIsLoading ? (
+
+ ) : (
+
+
+
+ {_('Information')}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {hasReport ? (
+
+
+
+
+
+
+
+ onSortChange('results', sortField)
+ }
+ onTargetEditClick={onTargetEditClick}
+ />
+
+
+ {showInitialLoading ? (
+
+ ) : showThresholdMessage ? (
+
+ ) : (
+
+ onSortChange('hosts', sortField)
+ }
+ />
+ )}
+
+
+ {showInitialLoading ? (
+
+ ) : showThresholdMessage ? (
+
+ ) : (
+
+ onSortChange('os', sortField)
+ }
+ />
+ )}
+
+
+ {showInitialLoading ? (
+
+ ) : showThresholdMessage ? (
+
+ ) : (
+
+ onSortChange('tlscerts', sortField)
+ }
+ onTlsCertificateDownloadClick={
+ onTlsCertificateDownloadClick
+ }
+ />
+ )}
+
+
+
+ onSortChange('errors', sortField)
+ }
+ />
+
+
+
+
+
+
+ ) : (
+
+ )}
+
+ )}
+
+
+ );
+};
+
+PageContent.propTypes = {
+ activeTab: PropTypes.number,
+ applicationsCounts: PropTypes.counts,
+ closedCvesCounts: PropTypes.counts,
+ cvesCounts: PropTypes.counts,
+ entity: PropTypes.model,
+ errorsCounts: PropTypes.counts,
+ filters: PropTypes.array,
+ hostsCounts: PropTypes.counts,
+ isLoading: PropTypes.bool,
+ isLoadingFilters: PropTypes.bool,
+ isUpdating: PropTypes.bool,
+ operatingSystemsCounts: PropTypes.counts,
+ pageFilter: PropTypes.filter,
+ portsCounts: PropTypes.counts,
+ reportError: PropTypes.error,
+ reportFilter: PropTypes.filter,
+ reportId: PropTypes.id.isRequired,
+ resetFilter: PropTypes.filter,
+ resultsCounts: PropTypes.counts,
+ showError: PropTypes.func.isRequired,
+ showErrorMessage: PropTypes.func.isRequired,
+ showSuccessMessage: PropTypes.func.isRequired,
+ sorting: PropTypes.object,
+ task: PropTypes.model,
+ tlsCertificatesCounts: PropTypes.counts,
+ onActivateTab: PropTypes.func.isRequired,
+ onAddToAssetsClick: PropTypes.func.isRequired,
+ onError: PropTypes.func.isRequired,
+ onFilterChanged: PropTypes.func.isRequired,
+ onFilterCreated: PropTypes.func.isRequired,
+ onFilterDecreaseMinQoDClick: PropTypes.func.isRequired,
+ onFilterEditClick: PropTypes.func.isRequired,
+ onFilterRemoveClick: PropTypes.func.isRequired,
+ onFilterResetClick: PropTypes.func.isRequired,
+ onInteraction: PropTypes.func.isRequired,
+ onRemoveFromAssetsClick: PropTypes.func.isRequired,
+ onReportDownloadClick: PropTypes.func.isRequired,
+ onSortChange: PropTypes.func.isRequired,
+ onTagSuccess: PropTypes.func.isRequired,
+ onTargetEditClick: PropTypes.func.isRequired,
+ onTlsCertificateDownloadClick: PropTypes.func.isRequired,
+};
+
+export default PageContent;
\ No newline at end of file
diff --git a/src/web/pages/reports/auditdetailspage.jsx b/src/web/pages/reports/auditdetailspage.jsx
new file mode 100644
index 0000000000..b0585d6ffa
--- /dev/null
+++ b/src/web/pages/reports/auditdetailspage.jsx
@@ -0,0 +1,705 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+
+import React, {useEffect, useState} from 'react';
+
+import {useDispatch, useSelector, shallowEqual} from 'react-redux';
+
+import {useRouteMatch} from 'react-router-dom';
+
+import useTranslation from 'web/hooks/useTranslation';
+
+import logger from 'gmp/log';
+
+import Filter, {
+ ALL_FILTER,
+ RESET_FILTER,
+ RESULTS_FILTER_FILTER
+} from 'gmp/models/filter';
+import {isActive} from 'gmp/models/task';
+
+import {first} from 'gmp/utils/array';
+import {isDefined, hasValue} from 'gmp/utils/identity';
+
+import withDownload from 'web/components/form/withDownload';
+
+import Reload, {
+ NO_RELOAD,
+ USE_DEFAULT_RELOAD_INTERVAL_ACTIVE,
+} from 'web/components/loading/reload';
+
+import withDialogNotification from 'web/components/notification/withDialogNotifiaction'; // eslint-disable-line max-len
+
+import FilterProvider from 'web/entities/filterprovider';
+
+import DownloadReportDialog from 'web/pages/reports/downloadreportdialog';
+
+import {
+ loadAllEntities as loadFilters,
+ selector as filterSelector,
+} from 'web/store/entities/filters';
+
+import {
+ loadAllEntities as loadReportFormats,
+ selector as reportFormatsSelector,
+} from 'web/store/entities/reportformats';
+
+import {
+ loadAllEntities as loadReportConfigs,
+ selector as reportConfigsSelector,
+} from 'web/store/entities/reportconfigs';
+
+import {loadAuditReportWithThreshold} from 'web/store/entities/report/actions';
+import {auditReportSelector} from 'web/store/entities/report/selectors';
+
+import {
+ loadReportComposerDefaults,
+ renewSessionTimeout,
+ saveReportComposerDefaults,
+} from 'web/store/usersettings/actions';
+
+import {loadUserSettingDefaults} from 'web/store/usersettings/defaults/actions';
+import {getUserSettingsDefaults} from 'web/store/usersettings/defaults/selectors';
+import {getUserSettingsDefaultFilter} from 'web/store/usersettings/defaultfilters/selectors';
+
+import {
+ getReportComposerDefaults,
+ getUsername,
+} from 'web/store/usersettings/selectors';
+
+import {create_pem_certificate} from 'web/utils/cert';
+import compose from 'web/utils/compose';
+import {generateFilename} from 'web/utils/render';
+import PropTypes from 'web/utils/proptypes';
+
+import TargetComponent from '../targets/component';
+import PageTitle from 'web/components/layout/pagetitle';
+
+import Page from './auditdetailscontent';
+
+import FilterDialog from './detailsfilterdialog';
+import {pageFilter as setPageFilter} from 'web/store/pages/actions';
+import getPage from 'web/store/pages/selectors';
+import useGmp from 'web/hooks/useGmp';
+
+const log = logger.getLogger('web.pages.auditreport.detailspage');
+
+const DEFAULT_FILTER = Filter.fromString(
+ 'levels=hmlg rows=100 min_qod=70 first=1 compliance_levels=yniu sort=compliant',
+);
+
+export const AUDIT_REPORT_RESET_FILTER = RESET_FILTER.copy()
+ .setSortOrder('sort')
+ .setSortBy('compliant');
+
+const REPORT_FORMATS_FILTER = Filter.fromString('active=1 and trust=1 rows=-1');
+
+const getReportPageName = id => `report-${id}`;
+
+const getTarget = (entity = {}) => {
+ const {report = {}} = entity;
+ const {task = {}} = report;
+ return task.target;
+};
+
+const ReportDetails = props => {
+ const [activeTab, setActiveTab] = useState(0);
+ const [showFilterDialog, setShowFilterDialog] = useState(false);
+ const [showDownloadReportDialog, setShowDownloadReportDialog] =
+ useState(false);
+ const [sorting, setSorting] = useState({
+ results: {
+ sortField: 'compliant',
+ sortReverse: true,
+ },
+ hosts: {
+ sortField: 'compliant',
+ sortReverse: true,
+ },
+ os: {
+ sortField: 'compliant',
+ sortReverse: true,
+ },
+ tlscerts: {
+ sortField: 'dn',
+ sortReverse: false,
+ },
+ errors: {
+ sortField: 'error',
+ sortReverse: false,
+ },
+ });
+
+ const [entity, setEntity] = useState();
+ const [resultsCounts, setResultsCounts] = useState();
+ const [hostsCounts, setHostsCounts] = useState();
+ const [operatingSystemsCounts, setOperatingSystemsCounts] = useState();
+ const [tlsCertificatesCounts, setTlsCertificatesCounts] = useState();
+ const [reportFormatId, setReportFormatId] = useState();
+ const [errorsCounts, setErrorsCounts] = useState();
+ const [reportFilter, setReportFilter] = useState();
+ const [isUpdating, setIsUpdating] = useState(false);
+ // storeAsDefault is set in SaveDialogContent
+ // eslint-disable-next-line no-unused-vars
+ const [storeAsDefault, setStoreAsDefault] = useState();
+
+ const [_] = useTranslation();
+ const gmp = useGmp();
+ const dispatch = useDispatch();
+ const match = useRouteMatch();
+ const {id: reportId} = match.params;
+
+ const pSelector = useSelector(getPage, shallowEqual);
+ const pageFilter = pSelector?.getFilter(getReportPageName(reportId));
+
+ const [selectedEntity, reportError, isLoading] = useSelector(state => {
+ const reportSel = auditReportSelector(state);
+ return [
+ reportSel?.getEntity(reportId, pageFilter),
+ reportSel?.getEntityError(reportId, pageFilter),
+ reportSel?.isLoadingEntity(reportId, pageFilter),
+ ];
+ }, shallowEqual);
+
+ const userDefaultsSelector = useSelector(
+ getUserSettingsDefaults,
+ shallowEqual,
+ );
+ const reportExportFileName = userDefaultsSelector?.getValueByName(
+ 'reportexportfilename',
+ );
+
+ const reportFormatsSel = useSelector(reportFormatsSelector);
+ const reportConfigsSel = useSelector(reportConfigsSelector);
+ const reportFormats = reportFormatsSel?.getAllEntities(REPORT_FORMATS_FILTER);
+ const reportConfigs = reportConfigsSel?.getAllEntities(ALL_FILTER);
+ const reportComposerDefaults = useSelector(getReportComposerDefaults);
+ const userDefaultFilterSel = useSelector(
+ rootState => getUserSettingsDefaultFilter(rootState, 'result'),
+ shallowEqual,
+ );
+ const resultDefaultFilter = userDefaultFilterSel?.getFilter();
+ const username = useSelector(getUsername);
+
+ useEffect(() => {
+ dispatch(loadUserSettingDefaults(gmp)());
+ dispatch(loadFilters(gmp)(RESULTS_FILTER_FILTER));
+ dispatch(loadReportFormats(gmp)(REPORT_FORMATS_FILTER));
+ dispatch(loadReportConfigs(gmp)(ALL_FILTER));
+ dispatch(loadReportComposerDefaults(gmp)());
+
+ if (isDefined(selectedEntity)) {
+ setEntity(entity);
+ updateReportCounts(selectedEntity);
+ setReportFilter(props.reportFilter);
+ setIsUpdating(false);
+ } else {
+ setIsUpdating(true);
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+
+ useEffect(() => {
+ if (isDefined(selectedEntity)) {
+ // update only if a new report is available to avoid having no report
+ // when the filter changes
+ setEntity(selectedEntity);
+ updateReportCounts(selectedEntity);
+ setReportFilter(props.reportFilter);
+ setIsUpdating(false);
+ } else {
+ // report is not in the store and is currently loaded
+ setIsUpdating(true);
+ }
+ }, [selectedEntity, props.reportFilter]);
+
+ useEffect(() => {
+ if (
+ !isDefined(reportFormatId) &&
+ isDefined(reportFormats) &&
+ reportFormats.length > 0
+ ) {
+ // set initial report format id if available
+ const initialReportFormatId = first(reportFormats).id;
+ if (isDefined(initialReportFormatId)) {
+ // ensure the report format id is only set if we really have one
+ // if no report format id is available we would create an infinite
+ // render loop here
+ setReportFormatId({initialReportFormatId});
+ } else {
+ // if there is no report format at all, throw a proper error message
+ // instead of just showing x is undefined JS stacktrace
+ const noReportFormatError = _(
+ 'The report cannot be displayed because' +
+ ' no report format is available.' +
+ ' This could be due to a missing gvmd data feed. Please update' +
+ ' the gvmd data feed, check the "feed import owner" setting, the' +
+ ' feed status page, or contact your system administrator.',
+ );
+ throw new Error(noReportFormatError);
+ }
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [reportFormats, reportFormatId]);
+
+ useEffect(() => {
+ load();
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [reportId]);
+
+ const updateReportCounts = reportEntity => {
+ const {report = {}} = reportEntity;
+ const {
+ results = {},
+ hosts = {},
+ operatingSystems = {},
+ tlsCertificates = {},
+ errors = {},
+ } = report;
+
+ if (isDefined(results.counts)) {
+ setResultsCounts(results.counts);
+ }
+ if (isDefined(hosts.counts)) {
+ setHostsCounts(hosts.counts);
+ }
+ if (isDefined(operatingSystems.counts)) {
+ setOperatingSystemsCounts(operatingSystems.counts);
+ }
+ if (isDefined(tlsCertificates.counts)) {
+ setTlsCertificatesCounts(tlsCertificates.counts);
+ }
+ if (isDefined(errors.counts)) {
+ setErrorsCounts(errors.counts);
+ }
+ };
+
+ const load = newFilter => {
+ log.debug('Loading report', {
+ newFilter,
+ });
+ const {reportFilter: filter} = props;
+
+ setIsUpdating(!isDefined(filter) || !filter.equals(newFilter)); // show update indicator if filter has changed
+
+ props
+ .reload(newFilter)
+ .then(() => {
+ setIsUpdating(false);
+ })
+ .catch(() => {
+ setIsUpdating(false);
+ });
+ };
+
+ const reload = () => {
+ // reload data from backend
+ load(props.reportFilter);
+ };
+
+ const handleChanged = () => {
+ reload();
+ };
+
+ const handleError = error => {
+ const {showError} = props;
+ log.error(error);
+ showError(error);
+ };
+
+ const handleFilterChange = filter => {
+ handleInteraction();
+ load(filter);
+ };
+
+ const handleFilterRemoveClick = () => {
+ handleFilterChange(AUDIT_REPORT_RESET_FILTER);
+ };
+
+ const handleFilterResetClick = () => {
+ if (hasValue(resultDefaultFilter)) {
+ handleFilterChange(resultDefaultFilter);
+ } else {
+ handleFilterChange(DEFAULT_FILTER);
+ }
+ };
+
+ const handleActivateTab = index => {
+ handleInteraction();
+ setActiveTab(index);
+ };
+
+ const handleAddToAssets = () => {
+ const {showSuccessMessage, reportFilter: filter} = props;
+
+ handleInteraction();
+
+ gmp.auditreport.addAssets(selectedEntity, {filter}).then(() => {
+ showSuccessMessage(
+ _(
+ 'Report content added to Assets with QoD>=70% and Overrides enabled.',
+ ),
+ );
+ reload();
+ }, handleError);
+ };
+
+ const handleRemoveFromAssets = () => {
+ const {showSuccessMessage, reportFilter: filter} = props;
+
+ handleInteraction();
+
+ gmp.auditreport.removeAssets(selectedEntity, {filter}).then(() => {
+ showSuccessMessage(_('Report content removed from Assets.'));
+ reload();
+ }, handleError);
+ };
+
+ const handleFilterEditClick = () => {
+ handleInteraction();
+ setShowFilterDialog(true);
+ };
+
+ const handleFilterDialogClose = () => {
+ handleInteraction();
+ setShowFilterDialog(false);
+ };
+
+ const handleOpenDownloadReportDialog = () => {
+ setShowDownloadReportDialog(true);
+ };
+
+ const handleCloseDownloadReportDialog = () => {
+ setShowDownloadReportDialog(false);
+ };
+
+ const handleReportDownload = state => {
+ const {reportFilter: filter, onDownload} = props;
+
+ const {
+ includeNotes,
+ includeOverrides,
+ // eslint-disable-next-line no-shadow
+ reportFormatId,
+ // eslint-disable-next-line no-shadow
+ storeAsDefault,
+ } = state;
+
+ const newFilter = filter.copy();
+ newFilter.set('notes', includeNotes);
+ newFilter.set('overrides', includeOverrides);
+
+ if (storeAsDefault) {
+ const defaults = {
+ ...reportComposerDefaults,
+ defaultReportFormatId: reportFormatId,
+ includeNotes,
+ includeOverrides,
+ };
+ dispatch(saveReportComposerDefaults(gmp)(defaults));
+ }
+
+ const report_format = reportFormats
+ ? reportFormats.find(format => reportFormatId === format.id)
+ : undefined;
+
+ const extension = isDefined(report_format)
+ ? report_format.extension
+ : 'unknown'; // unknown should never happen but we should be save here
+
+ handleInteraction();
+
+ return gmp.auditreport
+ .download(selectedEntity, {
+ reportFormatId,
+ filter: newFilter,
+ })
+ .then(response => {
+ setShowDownloadReportDialog(false);
+ const {data} = response;
+ const filename = generateFilename({
+ creationTime: selectedEntity.creationTime,
+ extension,
+ fileNameFormat: reportExportFileName,
+ id: selectedEntity.id,
+ modificationTime: selectedEntity.modificationTime,
+ reportFormat: report_format?.name,
+ resourceName: selectedEntity.task.name,
+ resourceType: 'report',
+ username,
+ });
+
+ onDownload({filename, data});
+ }, handleError);
+ };
+
+ const handleTlsCertificateDownload = cert => {
+ const {onDownload} = props;
+
+ const {data, serial} = cert;
+
+ handleInteraction();
+
+ onDownload({
+ filename: 'tls-cert-' + serial + '.pem',
+ mimetype: 'application/x-x509-ca-cert',
+ data: create_pem_certificate(data),
+ });
+ };
+
+ const handleFilterCreated = filter => {
+ handleInteraction();
+ load(filter);
+ dispatch(loadFilters(gmp)(RESULTS_FILTER_FILTER));
+ };
+
+ const handleFilterDecreaseMinQoD = () => {
+ const {reportFilter: filter} = props;
+
+ handleInteraction();
+
+ if (filter.has('min_qod')) {
+ const lfilter = filter.copy();
+ lfilter.set('min_qod', 30);
+ load(lfilter);
+ }
+ };
+
+ const handleSortChange = (name, sortField) => {
+ handleInteraction();
+
+ const prev = sorting[name];
+
+ const sortReverse =
+ sortField === prev.sortField ? !prev.sortReverse : false;
+
+ const newSort = {
+ ...sorting,
+ [name]: {
+ sortField,
+ sortReverse,
+ },
+ };
+ setSorting(newSort);
+ };
+
+ const handleInteraction = () => dispatch(renewSessionTimeout(gmp)());
+
+ const loadTarget = () => {
+ const target = getTarget(selectedEntity);
+ return gmp.target.get({id: target.id});
+ };
+
+ const {showError, showErrorMessage, showSuccessMessage} = props;
+
+ const report = isDefined(entity) ? entity.report : undefined;
+
+ const threshold = gmp.settings.reportResultsThreshold;
+
+ const showThresholdMessage =
+ isDefined(report) && report.results.counts.filtered > threshold;
+
+ const [filters, isLoadingFilters] = useSelector(state => {
+ const filterSel = filterSelector(state);
+ return [
+ filterSel?.getAllEntities(RESULTS_FILTER_FILTER),
+ filterSel?.isLoadingAllEntities(RESULTS_FILTER_FILTER),
+ ];
+ });
+
+ return (
+
+
+
+ {({edit}) => (
+
+ loadTarget().then(response => edit(response.data))
+ }
+ onTlsCertificateDownloadClick={handleTlsCertificateDownload}
+ showError={showError}
+ showErrorMessage={showErrorMessage}
+ showSuccessMessage={showSuccessMessage}
+ />
+ )}
+
+ {showFilterDialog && (
+
+ )}
+ {showDownloadReportDialog && (
+
+ )}
+
+ );
+};
+
+ReportDetails.propTypes = {
+ location: PropTypes.object.isRequired,
+ reload: PropTypes.func.isRequired,
+ reportFilter: PropTypes.filter,
+ showError: PropTypes.func.isRequired,
+ showErrorMessage: PropTypes.func.isRequired,
+ showSuccessMessage: PropTypes.func.isRequired,
+ target: PropTypes.model,
+ username: PropTypes.string,
+ onDownload: PropTypes.func.isRequired,
+};
+
+const reloadInterval = report =>
+ isDefined(report) && isActive(report.report.scan_run_status)
+ ? USE_DEFAULT_RELOAD_INTERVAL_ACTIVE
+ : NO_RELOAD; // report doesn't change anymore. no need to reload
+
+const load =
+ ({
+ defaultFilter,
+ reportId,
+ // eslint-disable-next-line no-shadow
+ dispatch,
+ gmp,
+ match,
+ pageFilter,
+ reportFilter,
+ }) =>
+ filter => {
+ if (!hasValue(filter)) {
+ // use loaded filter after initial loading
+ filter = reportFilter;
+ }
+
+ if (!hasValue(filter)) {
+ // use filter from store
+ filter = pageFilter;
+ }
+
+ if (!hasValue(filter)) {
+ // use filter from user setting
+ filter = defaultFilter;
+ }
+
+ if (!hasValue(filter)) {
+ // use fallback filter
+ filter = DEFAULT_FILTER;
+ }
+ dispatch(setPageFilter(getReportPageName(match.params.id), filter));
+ return dispatch(loadAuditReportWithThreshold(gmp)(reportId, {filter}));
+ };
+
+const ReportDetailsWrapper = props => {
+ const dispatch = useDispatch();
+ const gmp = useGmp();
+ const match = useRouteMatch();
+
+ const {id: reportId} = match.params;
+ const reportSel = useSelector(auditReportSelector, shallowEqual);
+ const pSelector = useSelector(getPage, shallowEqual);
+
+ const pageFilter = pSelector.getFilter(getReportPageName(reportId));
+ const entity = reportSel.getEntity(reportId, pageFilter);
+ const reportFilter = entity?.report?.filter;
+
+ return (
+
+ {({filter}) => (
+ reloadInterval(entity)}
+ >
+ {({reload}) => (
+
+ )}
+
+ )}
+
+ );
+};
+
+export default compose(
+ withDialogNotification,
+ withDownload,
+)(ReportDetailsWrapper);
\ No newline at end of file
diff --git a/src/web/pages/reports/auditfilterdialog.jsx b/src/web/pages/reports/auditfilterdialog.jsx
new file mode 100644
index 0000000000..aa0db7183b
--- /dev/null
+++ b/src/web/pages/reports/auditfilterdialog.jsx
@@ -0,0 +1,134 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import React from 'react';
+
+import Layout from 'web/components/layout/layout';
+
+import useCapabilities from 'web/hooks/useCapabilities';
+
+import useTranslation from 'web/hooks/useTranslation';
+
+/* eslint-disable max-len */
+
+import CreateNamedFilterGroup from 'web/components/powerfilter/createnamedfiltergroup';
+import FilterStringGroup from 'web/components/powerfilter/filterstringgroup';
+import FirstResultGroup from 'web/components/powerfilter/firstresultgroup';
+import MinQodGroup from 'web/components/powerfilter/minqodgroup';
+import ResultsPerPageGroup from 'web/components/powerfilter/resultsperpagegroup';
+import SortByGroup from 'web/components/powerfilter/sortbygroup';
+import withFilterDialog from 'web/components/powerfilter/withFilterDialog';
+import FilterDialogPropTypes from 'web/components/powerfilter/dialogproptypes';
+import ComplianceLevelFilterGroup from 'web/components/powerfilter/compliancelevelsgroup';
+import FilterSearchGroup from 'web/components/powerfilter/filtersearchgroup';
+
+/* eslint-enable */
+
+const AuditReportFilterDialogComponent = ({
+ filter,
+ filterName,
+ filterstring,
+ onFilterChange,
+ saveNamedFilter,
+ onFilterStringChange,
+ onFilterValueChange,
+ onSearchTermChange,
+ onSortByChange,
+ onSortOrderChange,
+ onValueChange,
+}) => {
+ const [_] = useTranslation();
+ const capabilities = useCapabilities();
+ const handleRemoveCompliance = () =>
+ onFilterChange(filter.delete('report_compliance_levels'));
+ const SORT_FIELDS = [
+ {
+ name: 'date',
+ displayName: _('Date'),
+ },
+ {
+ name: 'status',
+ displayName: _('Status'),
+ },
+ {
+ name: 'task',
+ displayName: _('Task'),
+ },
+ {
+ name: 'compliant',
+ displayName: _('Compliant'),
+ },
+ {
+ name: 'compliance_yes',
+ displayName: _('Compliance: Yes'),
+ },
+ {
+ name: 'compliance_no',
+ displayName: _('Compliance: No'),
+ },
+ {
+ name: 'compliance_incomplete',
+ displayName: _('Compliance: Incomplete'),
+ },
+ ];
+
+ if (!filter) {
+ return null;
+ }
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {capabilities.mayCreate('filter') && (
+
+ )}
+
+ );
+};
+
+AuditReportFilterDialogComponent.propTypes = FilterDialogPropTypes;
+
+export default withFilterDialog()(AuditReportFilterDialogComponent);
\ No newline at end of file
diff --git a/src/web/pages/reports/auditreportrow.jsx b/src/web/pages/reports/auditreportrow.jsx
new file mode 100644
index 0000000000..28334e9b3d
--- /dev/null
+++ b/src/web/pages/reports/auditreportrow.jsx
@@ -0,0 +1,147 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+
+import React from 'react';
+
+import useTranslation from 'web/hooks/useTranslation';
+
+import {isDefined} from 'gmp/utils/identity';
+
+import {TASK_STATUS, isActive} from 'gmp/models/task';
+
+import StatusBar from 'web/components/bar/statusbar';
+
+import DateTime from 'web/components/date/datetime';
+
+import DeleteIcon from 'web/components/icon/deleteicon';
+import DeltaIcon from 'web/components/icon/deltaicon';
+import DeltaSecondIcon from 'web/components/icon/deltasecondicon';
+
+import IconDivider from 'web/components/layout/icondivider';
+
+import DetailsLink from 'web/components/link/detailslink';
+
+import TableData from 'web/components/table/data';
+import TableRow from 'web/components/table/row';
+
+import withEntitiesActions from 'web/entities/withEntitiesActions';
+
+import ComplianceBar from 'web/components/bar/compliancebar';
+
+import PropTypes from 'web/utils/proptypes';
+
+const Actions = withEntitiesActions(
+ ({entity, selectedDeltaReport, onReportDeleteClick, onReportDeltaSelect}) => {
+ const {report} = entity;
+
+ const scanActive = isActive(report.scan_run_status);
+
+ const [_] = useTranslation();
+ const title = scanActive ? _('Scan is active') : _('Delete Report');
+
+ return (
+
+ {isDefined(selectedDeltaReport) ? (
+ entity.id === selectedDeltaReport.id ? (
+
+ ) : (
+
+ )
+ ) : (
+
+ )}
+
+
+ );
+ },
+);
+
+Actions.propTypes = {
+ entity: PropTypes.model.isRequired,
+ selectedDeltaReport: PropTypes.model,
+ onReportDeleteClick: PropTypes.func.isRequired,
+ onReportDeltaSelect: PropTypes.func.isRequired,
+};
+
+const AuditRow = ({
+ actionsComponent: ActionsComponent = Actions,
+ entity,
+ links = true,
+ ...props
+}) => {
+ const {report} = entity;
+ const {scan_run_status, task} = report;
+
+ let status = scan_run_status;
+ let progress;
+
+ if (isDefined(task)) {
+ if (task.isContainer() && status !== TASK_STATUS.processing) {
+ status =
+ status === TASK_STATUS.interrupted
+ ? TASK_STATUS.uploadinginterrupted
+ : status === TASK_STATUS.running || status === TASK_STATUS.processing
+ ? TASK_STATUS.uploading
+ : TASK_STATUS.container;
+ }
+ progress = task.progress;
+ }
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {entity.task.name}
+
+
+
+
+
+
+ {report.complianceCounts.yes.filtered}
+ {report.complianceCounts.no.filtered}
+
+ {report.complianceCounts.incomplete.filtered}
+
+
+
+ );
+};
+
+AuditRow.propTypes = {
+ actionsComponent: PropTypes.component,
+ entity: PropTypes.model.isRequired,
+ links: PropTypes.bool,
+};
+
+export default AuditRow;
\ No newline at end of file
diff --git a/src/web/pages/reports/auditreportslistpage.jsx b/src/web/pages/reports/auditreportslistpage.jsx
new file mode 100644
index 0000000000..b12d3739a0
--- /dev/null
+++ b/src/web/pages/reports/auditreportslistpage.jsx
@@ -0,0 +1,169 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+
+import React, {useEffect, useState} from 'react';
+
+import {useHistory} from 'react-router-dom';
+
+import useTranslation from 'web/hooks/useTranslation';
+
+import Filter, {AUDIT_REPORTS_FILTER_FILTER} from 'gmp/models/filter';
+
+import {isActive} from 'gmp/models/task';
+
+import {isDefined} from 'gmp/utils/identity';
+
+import EntitiesPage from 'web/entities/page';
+import withEntitiesContainer from 'web/entities/withEntitiesContainer';
+
+import DashboardControls from 'web/components/dashboard/controls';
+
+import ManualIcon from 'web/components/icon/manualicon';
+import ReportIcon from 'web/components/icon/reporticon';
+
+import IconDivider from 'web/components/layout/icondivider';
+import PageTitle from 'web/components/layout/pagetitle';
+
+import {
+ USE_DEFAULT_RELOAD_INTERVAL,
+ USE_DEFAULT_RELOAD_INTERVAL_ACTIVE,
+} from 'web/components/loading/reload';
+
+import {
+ loadEntities,
+ selector as entitiesSelector,
+} from 'web/store/entities/auditreports';
+
+import PropTypes from 'web/utils/proptypes';
+
+import AuditFilterDialog from './auditfilterdialog';
+import AuditReportsTable from './auditreportstable';
+
+import AuditReportsDashboard, {
+ AUDIT_REPORTS_DASHBOARD_ID,
+} from './auditdashboard';
+
+const ToolBarIcons = () => {
+ const [_] = useTranslation();
+ return (
+
+
+
+ )
+};
+
+const AuditReportsPage = ({
+ filter,
+ onFilterChanged,
+ onInteraction,
+ onDelete,
+ ...props
+}) => {
+ const [selectedDeltaReport, setSelectedDeltaReport] = useState();
+ const [beforeSelectFilter, setBeforeSelectFilter] = useState();
+ const history = useHistory();
+ const [_] = useTranslation();
+
+ useEffect(() => {
+ if (
+ isDefined(selectedDeltaReport) &&
+ (!isDefined(filter) ||
+ filter.get('task_id') !== selectedDeltaReport.task.id)
+ ) {
+ // filter has changed. reset delta report selection
+ setSelectedDeltaReport();
+ }
+ }, [filter, selectedDeltaReport]);
+
+ const handleReportDeleteClick = onDelete;
+
+ const handleReportDeltaSelect = report => {
+ if (isDefined(selectedDeltaReport)) {
+ onFilterChanged(beforeSelectFilter);
+
+ history.push(
+ '/auditreport/delta/' + selectedDeltaReport.id + '/' + report.id,
+ );
+ } else {
+ if (!isDefined(filter)) {
+ filter = new Filter();
+ }
+
+ onFilterChanged(
+ filter
+ .copy()
+ .set('first', 1) // reset to first page
+ .set('task_id', report.task.id),
+ );
+ setSelectedDeltaReport(report);
+ setBeforeSelectFilter(filter);
+ }
+ };
+
+ return (
+
+
+ (
+
+ )}
+ dashboardControls={() => (
+
+ )}
+ filtersFilter={AUDIT_REPORTS_FILTER_FILTER}
+ filterEditDialog={AuditFilterDialog}
+ table={AuditReportsTable}
+ toolBarIcons={ToolBarIcons}
+ title={_('Audit Reports')}
+ sectionIcon={ }
+ filter={filter}
+ onFilterChanged={onFilterChanged}
+ onInteraction={onInteraction}
+ onReportDeltaSelect={handleReportDeltaSelect}
+ onReportDeleteClick={handleReportDeleteClick}
+ />
+
+ );
+};
+
+AuditReportsPage.propTypes = {
+ filter: PropTypes.filter,
+ history: PropTypes.object.isRequired,
+ onChanged: PropTypes.func.isRequired,
+ onDelete: PropTypes.func.isRequired,
+ onError: PropTypes.func.isRequired,
+ onFilterChanged: PropTypes.func.isRequired,
+ onInteraction: PropTypes.func.isRequired,
+};
+
+const reportsReloadInterval = ({entities = []}) =>
+ entities.some(entity => isActive(entity.report.scan_run_status))
+ ? USE_DEFAULT_RELOAD_INTERVAL_ACTIVE
+ : USE_DEFAULT_RELOAD_INTERVAL;
+
+const FALLBACK_AUDIT_REPORT_LIST_FILTER = Filter.fromString(
+ 'report_compliance_levels=yniu sort-reverse=date first=1',
+);
+
+export default withEntitiesContainer('auditreport', {
+ fallbackFilter: FALLBACK_AUDIT_REPORT_LIST_FILTER,
+ entitiesSelector,
+ loadEntities,
+ reloadInterval: reportsReloadInterval,
+ })(AuditReportsPage);
\ No newline at end of file
diff --git a/src/web/pages/reports/auditreportstable.jsx b/src/web/pages/reports/auditreportstable.jsx
new file mode 100644
index 0000000000..4608cf114f
--- /dev/null
+++ b/src/web/pages/reports/auditreportstable.jsx
@@ -0,0 +1,130 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import React from 'react';
+
+import {_l} from 'gmp/locale/lang';
+import useTranslation from 'web/hooks/useTranslation';
+
+import {isDefined} from 'gmp/utils/identity';
+
+import PropTypes from 'web/utils/proptypes';
+
+import {createEntitiesFooter} from 'web/entities/footer';
+import {createEntitiesTable} from 'web/entities/table';
+
+import ComplianceState from 'web/components/label/compliancestate';
+
+import TableHead from 'web/components/table/head';
+import TableHeader from 'web/components/table/header';
+import TableRow from 'web/components/table/row';
+
+import AuditReportRow from './auditreportrow';
+
+const Header = ({
+ actionsColumn,
+ sort = true,
+ currentSortBy,
+ currentSortDir,
+ onSortChange,
+}) => {
+ const [_] = useTranslation();
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {isDefined(actionsColumn) ? (
+ actionsColumn
+ ) : (
+
+ {_('Actions')}
+
+ )}
+
+
+ );
+};
+
+Header.propTypes = {
+ actionsColumn: PropTypes.element,
+ currentSortBy: PropTypes.string,
+ currentSortDir: PropTypes.string,
+ sort: PropTypes.bool,
+ onSortChange: PropTypes.func,
+};
+
+const Footer = createEntitiesFooter({
+ span: 10,
+ delete: true,
+});
+
+export default createEntitiesTable({
+ emptyTitle: _l('No reports available'),
+ header: Header,
+ footer: Footer,
+ row: AuditReportRow,
+ toggleDetailsIcon: false,
+});
\ No newline at end of file
diff --git a/src/web/pages/reports/deltadetailscontent.jsx b/src/web/pages/reports/deltadetailscontent.jsx
index 97141d8c48..b2379a4258 100644
--- a/src/web/pages/reports/deltadetailscontent.jsx
+++ b/src/web/pages/reports/deltadetailscontent.jsx
@@ -56,6 +56,7 @@ const Span = styled.span`
const PageContent = ({
activeTab,
+ audit = false,
entity,
entityError,
filter,
@@ -70,7 +71,6 @@ const PageContent = ({
task,
onActivateTab,
onAddToAssetsClick,
- onTlsCertificateDownloadClick,
onError,
onFilterAddLogLevelClick,
onFilterChanged,
@@ -92,7 +92,13 @@ const PageContent = ({
const {userTags = {}} = report;
const userTagsCount = userTags.length;
- const {results = {}, result_count = {}, timestamp, scan_run_status} = report;
+ const {
+ results = {},
+ complianceCounts = {},
+ result_count = {},
+ timestamp,
+ scan_run_status,
+ } = report;
const hasReport = isDefined(entity);
@@ -126,12 +132,13 @@ const PageContent = ({
);
- const {filtered} = result_count;
+ const {filtered} = audit ? complianceCounts : result_count;
return (
this.loadTarget().then(response => edit(response.data))
}
- onTlsCertificateDownloadClick={this.handleTlsCertificateDownload}
showError={showError}
showErrorMessage={showErrorMessage}
showSuccessMessage={showSuccessMessage}
diff --git a/src/web/pages/reports/details/__tests__/hoststab.jsx b/src/web/pages/reports/details/__tests__/hoststab.jsx
index f96cd8716c..d1ab375865 100644
--- a/src/web/pages/reports/details/__tests__/hoststab.jsx
+++ b/src/web/pages/reports/details/__tests__/hoststab.jsx
@@ -14,6 +14,7 @@ import {setTimezone, setUsername} from 'web/store/usersettings/actions';
import {rendererWith} from 'web/utils/testing';
import {getMockReport} from 'web/pages/reports/__mocks__/mockreport';
+import {getMockAuditReport} from 'web/pages/reports/__mocks__/mockauditreport';
import HostsTab from '../hoststab';
@@ -114,3 +115,107 @@ describe('Report Hosts Tab tests', () => {
);
});
});
+
+const auditfilter = Filter.fromString(
+ 'apply_overrides=0 levels=hmlg rows=3 min_qod=70 first=1 sort=compliant',
+);
+
+describe('Audit Report Hosts Tab tests', () => {
+ test('should render Audit Report Hosts Tab', () => {
+ const {hosts} = getMockAuditReport();
+
+ const onSortChange = testing.fn();
+ const onInteraction = testing.fn();
+
+ const {render, store} = rendererWith({
+ gmp,
+ capabilities: caps,
+ router: true,
+ store: true,
+ });
+
+ store.dispatch(setTimezone('CET'));
+ store.dispatch(setUsername('admin'));
+
+ const {baseElement, getAllByTestId} = render(
+ onSortChange('hosts', sortField)}
+ />,
+ );
+
+ const images = baseElement.querySelectorAll('img');
+ const links = baseElement.querySelectorAll('a');
+ const header = baseElement.querySelectorAll('th');
+ const rows = baseElement.querySelectorAll('tr');
+
+ const bars = getAllByTestId('progressbar-box');
+
+ // Headings
+ expect(header[0]).toHaveTextContent('IP Address');
+ expect(header[1]).toHaveTextContent('Hostname');
+ expect(header[2]).toHaveTextContent('OS');
+ expect(header[3]).toHaveTextContent('Ports');
+ expect(header[4]).toHaveTextContent('Apps');
+ expect(header[5]).toHaveTextContent('Distance');
+ expect(header[6]).toHaveTextContent('Auth');
+ expect(header[7]).toHaveTextContent('Start');
+ expect(header[8]).toHaveTextContent('End');
+ expect(header[9]).toHaveTextContent('Yes');
+ expect(header[10]).toHaveTextContent('No');
+ expect(header[11]).toHaveTextContent('Incomplete');
+ expect(header[12]).toHaveTextContent('Total');
+ expect(header[13]).toHaveTextContent('Compliant');
+
+ // Row 1
+ expect(links[13]).toHaveAttribute(
+ 'href',
+ '/hosts?filter=name%3D109.876.54.321',
+ ); // filter by name because host has no asset id
+ expect(links[13]).toHaveTextContent('109.876.54.321');
+ expect(rows[1]).toHaveTextContent('lorem.ipsum');
+ expect(images[0]).toHaveAttribute('src', '/img/os_unknown.svg');
+ expect(rows[1]).toHaveTextContent('1521'); // 15 Ports, 2 Apps, 1 Distance
+ expect(rows[1]).toHaveTextContent('Mon, Jun 3, 2019 1:15 PM CEST');
+ expect(rows[1]).toHaveTextContent('Mon, Jun 3, 2019 1:31 PM CEST');
+ expect(rows[1]).toHaveTextContent('170540'); // 17 Yes, 0 No, 5 Incomplete, 40 Total
+ expect(bars[0]).toHaveAttribute('title', 'Incomplete');
+ expect(bars[0]).toHaveTextContent('Incomplete');
+
+ // Row 2
+ expect(links[14]).toHaveAttribute('href', '/host/123');
+ expect(links[14]).toHaveTextContent('123.456.78.910');
+ expect(rows[2]).toHaveTextContent('foo.bar');
+ expect(images[0]).toHaveAttribute('src', '/img/os_unknown.svg');
+ expect(rows[2]).toHaveTextContent('1032'); // 10 Ports, 3 Apps, 2 Distance
+ expect(rows[2]).toHaveTextContent('Mon, Jun 3, 2019 1:00 PM CEST');
+ expect(rows[2]).toHaveTextContent('Mon, Jun 3, 2019 1:15 PM CEST');
+ expect(rows[2]).toHaveTextContent('7301450'); // 7 Yes, 30 No, 14 Incomplete, 50 Total
+ expect(bars[1]).toHaveAttribute('title', 'No');
+ expect(bars[1]).toHaveTextContent('No');
+
+ // Row 3
+ expect(links[15]).toHaveAttribute('href', '/host/123');
+ expect(links[15]).toHaveTextContent('123.456.78.810');
+ expect(rows[3]).toHaveTextContent('foo.bar');
+ expect(images[0]).toHaveAttribute('src', '/img/os_unknown.svg');
+ expect(rows[3]).toHaveTextContent('1032'); // 10 Ports, 3 Apps, 2 Distance
+ expect(rows[3]).toHaveTextContent('Mon, Jun 3, 2019 1:00 PM CEST');
+ expect(rows[3]).toHaveTextContent('Mon, Jun 3, 2019 1:15 PM CEST');
+ expect(rows[3]).toHaveTextContent('200020'); // 20 Yes, 0 No, 0 Incomplete, 20 Total
+ expect(bars[2]).toHaveAttribute('title', 'Yes');
+ expect(bars[2]).toHaveTextContent('Yes');
+
+ // Filter
+ expect(baseElement).toHaveTextContent(
+ '(Applied filter: apply_overrides=0 levels=hmlg rows=3 min_qod=70 first=1 sort=compliant)',
+ );
+ });
+});
diff --git a/src/web/pages/reports/details/__tests__/operatingsystemstab.jsx b/src/web/pages/reports/details/__tests__/operatingsystemstab.jsx
index cb382d0b38..fe335de140 100644
--- a/src/web/pages/reports/details/__tests__/operatingsystemstab.jsx
+++ b/src/web/pages/reports/details/__tests__/operatingsystemstab.jsx
@@ -13,6 +13,8 @@ import {rendererWith} from 'web/utils/testing';
import {getMockReport} from 'web/pages/reports/__mocks__/mockreport';
+import {getMockAuditReport} from 'web/pages/reports/__mocks__/mockauditreport';
+
import OperatingSystemsTab from '../operatingsystemstab';
const filter = Filter.fromString(
@@ -94,3 +96,84 @@ describe('Report Operating Systems Tab tests', () => {
);
});
});
+
+const auditfilter = Filter.fromString(
+ 'apply_overrides=0 levels=hmlg rows=3 min_qod=70 first=1 sort=compliant',
+);
+
+describe('Audit Report Operating Systems Tab tests', () => {
+ test('should render Audit Report Operating Systems Tab', () => {
+ const {operatingsystems} = getMockAuditReport();
+
+ const onSortChange = testing.fn();
+ const onInteraction = testing.fn();
+
+ const {render, store} = rendererWith({
+ router: true,
+ store: true,
+ });
+
+ store.dispatch(setTimezone('CET'));
+ store.dispatch(setUsername('admin'));
+
+ const {baseElement, getAllByTestId} = render(
+ ,
+ );
+
+ const images = baseElement.querySelectorAll('img');
+ const links = baseElement.querySelectorAll('a');
+ const header = baseElement.querySelectorAll('th');
+ const bars = getAllByTestId('progressbar-box');
+
+ // Headings
+ expect(header[0]).toHaveTextContent('Operating System');
+ expect(header[1]).toHaveTextContent('CPE');
+ expect(header[2]).toHaveTextContent('Hosts');
+ expect(header[3]).toHaveTextContent('Compliant');
+
+ // Row 1
+ expect(images[0]).toHaveAttribute('src', '/img/os_unknown.svg');
+ expect(links[4]).toHaveAttribute(
+ 'href',
+ '/operatingsystems?filter=name%3Dcpe%3A%2Ffoo%2Fbar',
+ );
+ expect(links[4]).toHaveTextContent('Foo OS');
+ expect(links[5]).toHaveAttribute(
+ 'href',
+ '/operatingsystems?filter=name%3Dcpe%3A%2Ffoo%2Fbar',
+ );
+ expect(links[5]).toHaveTextContent('cpe:/foo/bar');
+ expect(bars[0]).toHaveAttribute('title', 'No');
+ expect(bars[0]).toHaveTextContent('No');
+
+ // Row 2
+ expect(images[1]).toHaveAttribute('src', '/img/os_unknown.svg');
+ expect(links[6]).toHaveAttribute(
+ 'href',
+ '/operatingsystems?filter=name%3Dcpe%3A%2Florem%2Fipsum',
+ );
+ expect(links[6]).toHaveTextContent('Lorem OS');
+ expect(links[7]).toHaveAttribute(
+ 'href',
+ '/operatingsystems?filter=name%3Dcpe%3A%2Florem%2Fipsum',
+ );
+ expect(links[7]).toHaveTextContent('cpe:/lorem/ipsum');
+ expect(bars[1]).toHaveAttribute('title', 'Incomplete');
+ expect(bars[1]).toHaveTextContent('Incomplete');
+
+ // Filter
+ expect(baseElement).toHaveTextContent(
+ '(Applied filter: apply_overrides=0 levels=hmlg rows=3 min_qod=70 first=1 sort=compliant)',
+ );
+ });
+});
diff --git a/src/web/pages/reports/details/__tests__/resultstab.jsx b/src/web/pages/reports/details/__tests__/resultstab.jsx
new file mode 100644
index 0000000000..736267d6f8
--- /dev/null
+++ b/src/web/pages/reports/details/__tests__/resultstab.jsx
@@ -0,0 +1,369 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {describe, test, expect, testing} from '@gsa/testing';
+import React from 'react';
+
+import Filter from 'gmp/models/filter';
+
+import {setTimezone, setUsername} from 'web/store/usersettings/actions';
+import CollectionCounts from 'gmp/collection/collectioncounts';
+
+import {rendererWith, wait} from 'web/utils/testing';
+import Result from 'gmp/models/result';
+import {loadingActions} from 'web/store/usersettings/defaults/actions';
+import {defaultFilterLoadingActions} from 'web/store/usersettings/defaultfilters/actions';
+import {entitiesLoadingActions} from 'web/store/entities/results';
+
+import ResultsTab from '../resultstab';
+
+const reloadInterval = 1;
+const manualUrl = 'test/';
+
+// mock entities
+export const result1 = Result.fromElement({
+ _id: '101',
+ name: 'Result 1',
+ owner: {name: 'admin'},
+ comment: 'Comment 1',
+ creation_time: '2019-06-03T11:06:31Z',
+ modification_time: '2019-06-03T11:06:31Z',
+ host: {__text: '123.456.78.910', hostname: 'foo'},
+ port: '80/tcp',
+ nvt: {
+ _oid: '201',
+ type: 'nvt',
+ name: 'nvt1',
+ tags: 'solution_type=Mitigation',
+ refs: {ref: [{_type: 'cve', _id: 'CVE-2019-1234'}]},
+ },
+ threat: 'High',
+ severity: 10.0,
+ qod: {value: 80},
+ compliance: 'yes',
+});
+
+export const result2 = Result.fromElement({
+ _id: '102',
+ name: 'Result 2',
+ owner: {name: 'admin'},
+ comment: 'Comment 2',
+ creation_time: '2019-06-03T11:06:31Z',
+ modification_time: '2019-06-03T11:06:31Z',
+ host: {__text: '109.876.54.321'},
+ port: '80/tcp',
+ nvt: {
+ _oid: '202',
+ type: 'nvt',
+ name: 'nvt2',
+ tags: 'solution_type=VendorFix',
+ refs: {ref: [{_type: 'cve', _id: 'CVE-2019-5678'}]},
+ },
+ threat: 'Medium',
+ severity: 5.0,
+ qod: {value: 70},
+ compliance: 'no',
+});
+
+export const result3 = Result.fromElement({
+ _id: '103',
+ name: 'Result 3',
+ owner: {name: 'admin'},
+ comment: 'Comment 3',
+ creation_time: '2019-06-03T11:06:31Z',
+ modification_time: '2019-06-03T11:06:31Z',
+ host: {__text: '109.876.54.321', hostname: 'bar'},
+ port: '80/tcp',
+ nvt: {
+ _oid: '201',
+ type: 'nvt',
+ name: 'nvt1',
+ tags: 'solution_type=Mitigation',
+ refs: {ref: [{_type: 'cve', _id: 'CVE-2019-1234'}]},
+ solution: {
+ _type: 'Mitigation',
+ },
+ },
+ threat: 'Medium',
+ severity: 5.0,
+ qod: {value: 80},
+ compliance: 'incomplete',
+});
+
+const results = [result1, result2, result3];
+
+let currentSettings;
+let getAggregates;
+let getDashboardSetting;
+let getFilters;
+let getResults;
+
+beforeEach(() => {
+ // mock gmp commands
+
+ getResults = testing.fn().mockResolvedValue({
+ data: results,
+ meta: {
+ filter: Filter.fromString(),
+ counts: new CollectionCounts(),
+ },
+ });
+
+ getFilters = testing.fn().mockReturnValue(
+ Promise.resolve({
+ data: [],
+ meta: {
+ filter: Filter.fromString(),
+ counts: new CollectionCounts(),
+ },
+ }),
+ );
+
+ getDashboardSetting = testing.fn().mockResolvedValue({
+ data: [],
+ meta: {
+ filter: Filter.fromString(),
+ counts: new CollectionCounts(),
+ },
+ });
+
+ getAggregates = testing.fn().mockResolvedValue({
+ data: [],
+ meta: {
+ filter: Filter.fromString(),
+ counts: new CollectionCounts(),
+ },
+ });
+
+ currentSettings = testing.fn().mockResolvedValue({
+ foo: 'bar',
+ });
+});
+
+describe('Report Results Tab tests', () => {
+ test('should render Results Tab with compliance information', async () => {
+ const reload = testing.fn();
+ const onFilterAddLogLevelClick = testing.fn();
+ const onFilterDecreaseMinQoDClick = testing.fn();
+ const onFilterEditClick = testing.fn();
+ const onFilterRemoveClick = testing.fn();
+ const onFilterRemoveSeverityClick = testing.fn();
+ const onTargetEditClick = testing.fn();
+
+ const gmp = {
+ results: {
+ get: getResults,
+ getSeverityAggregates: getAggregates,
+ getWordCountsAggregates: getAggregates,
+ },
+ filters: {
+ get: getFilters,
+ },
+ dashboard: {
+ getSetting: getDashboardSetting,
+ },
+ settings: {manualUrl, reloadInterval},
+ user: {currentSettings},
+ };
+
+ const {render, store} = rendererWith({
+ gmp,
+ capabilities: true,
+ store: true,
+ router: true,
+ });
+
+ store.dispatch(setTimezone('CET'));
+ store.dispatch(setUsername('admin'));
+
+ const defaultSettingfilter = Filter.fromString('foo=bar');
+ store.dispatch(loadingActions.success({rowsperpage: {value: '2'}}));
+ store.dispatch(
+ defaultFilterLoadingActions.success('result', defaultSettingfilter),
+ );
+
+ const counts = new CollectionCounts({
+ first: 1,
+ all: 1,
+ filtered: 1,
+ length: 1,
+ rows: 10,
+ });
+ const filter = Filter.fromString('first=1 rows=10');
+ const loadedFilter = Filter.fromString('first=1 rows=10');
+ store.dispatch(
+ entitiesLoadingActions.success(results, filter, loadedFilter, counts),
+ );
+
+ const {baseElement} = render(
+ ,
+ );
+
+ await wait();
+
+ const header = baseElement.querySelectorAll('th');
+ const row = baseElement.querySelectorAll('tr');
+
+ expect(header[0]).toHaveTextContent('Vulnerability');
+ expect(header[2]).toHaveTextContent('Compliant');
+ expect(header[3]).toHaveTextContent('QoD');
+ expect(header[4]).toHaveTextContent('Host');
+ expect(header[5]).toHaveTextContent('Location');
+ expect(header[6]).toHaveTextContent('Created');
+ expect(header[7]).toHaveTextContent('IP');
+ expect(header[8]).toHaveTextContent('Name');
+
+ expect(row[2]).toHaveTextContent('Result 1');
+ expect(row[2]).toHaveTextContent('Yes');
+ expect(row[2]).toHaveTextContent('80 %');
+ expect(row[2]).toHaveTextContent('123.456.78.910');
+ expect(row[2]).toHaveTextContent('foo');
+ expect(row[2]).toHaveTextContent('80/tcp');
+ expect(row[2]).toHaveTextContent('Mon, Jun 3, 2019 1:06 PM CEST');
+
+ expect(row[3]).toHaveTextContent('Result 2');
+ expect(row[3]).toHaveTextContent('No');
+ expect(row[3]).toHaveTextContent('70 %');
+ expect(row[3]).toHaveTextContent('109.876.54.321');
+ expect(row[3]).toHaveTextContent('80/tcp');
+ expect(row[3]).toHaveTextContent('Mon, Jun 3, 2019 1:06 PM CEST');
+
+ expect(row[4]).toHaveTextContent('Result 3');
+ expect(row[4]).toHaveTextContent('Incomplete');
+ expect(row[4]).toHaveTextContent('80 %');
+ expect(row[4]).toHaveTextContent('109.876.54.321');
+ expect(row[4]).toHaveTextContent('bar');
+ expect(row[4]).toHaveTextContent('80/tcp');
+ expect(row[4]).toHaveTextContent('Mon, Jun 3, 2019 1:06 PM CEST');
+ });
+
+ test('should render Results Tab with compliance information', async () => {
+ const reload = testing.fn();
+ const onFilterAddLogLevelClick = testing.fn();
+ const onFilterDecreaseMinQoDClick = testing.fn();
+ const onFilterEditClick = testing.fn();
+ const onFilterRemoveClick = testing.fn();
+ const onFilterRemoveSeverityClick = testing.fn();
+ const onTargetEditClick = testing.fn();
+
+ const gmp = {
+ results: {
+ get: getResults,
+ getSeverityAggregates: getAggregates,
+ getWordCountsAggregates: getAggregates,
+ },
+ filters: {
+ get: getFilters,
+ },
+ dashboard: {
+ getSetting: getDashboardSetting,
+ },
+ settings: {manualUrl, reloadInterval},
+ user: {currentSettings},
+ };
+
+ const {render, store} = rendererWith({
+ gmp,
+ capabilities: true,
+ store: true,
+ router: true,
+ });
+
+ store.dispatch(setTimezone('CET'));
+ store.dispatch(setUsername('admin'));
+
+ const defaultSettingfilter = Filter.fromString('foo=bar');
+ store.dispatch(loadingActions.success({rowsperpage: {value: '2'}}));
+ store.dispatch(
+ defaultFilterLoadingActions.success('result', defaultSettingfilter),
+ );
+
+ const counts = new CollectionCounts({
+ first: 1,
+ all: 1,
+ filtered: 1,
+ length: 1,
+ rows: 10,
+ });
+ const filter = Filter.fromString('first=1 rows=10');
+ const loadedFilter = Filter.fromString('first=1 rows=10');
+ store.dispatch(
+ entitiesLoadingActions.success(results, filter, loadedFilter, counts),
+ );
+
+ const {baseElement} = render(
+ ,
+ );
+
+ await wait();
+
+ const header = baseElement.querySelectorAll('th');
+ const row = baseElement.querySelectorAll('tr');
+
+ expect(header[0]).toHaveTextContent('Vulnerability');
+ expect(header[2]).toHaveTextContent('Severity');
+ expect(header[3]).toHaveTextContent('QoD');
+ expect(header[4]).toHaveTextContent('Host');
+ expect(header[5]).toHaveTextContent('Location');
+ expect(header[6]).toHaveTextContent('Created');
+ expect(header[7]).toHaveTextContent('IP');
+ expect(header[8]).toHaveTextContent('Name');
+
+ expect(row[2]).toHaveTextContent('Result 1');
+ expect(row[2]).toHaveTextContent('10.0 (High)');
+ expect(row[2]).toHaveTextContent('80 %');
+ expect(row[2]).toHaveTextContent('123.456.78.910');
+ expect(row[2]).toHaveTextContent('foo');
+ expect(row[2]).toHaveTextContent('80/tcp');
+ expect(row[2]).toHaveTextContent('Mon, Jun 3, 2019 1:06 PM CEST');
+
+ expect(row[3]).toHaveTextContent('Result 2');
+ expect(row[3]).toHaveTextContent('5.0 (Medium)');
+ expect(row[3]).toHaveTextContent('70 %');
+ expect(row[3]).toHaveTextContent('109.876.54.321');
+ expect(row[3]).toHaveTextContent('80/tcp');
+ expect(row[3]).toHaveTextContent('Mon, Jun 3, 2019 1:06 PM CEST');
+
+ expect(row[4]).toHaveTextContent('Result 3');
+ expect(row[4]).toHaveTextContent('5.0 (Medium)');
+ expect(row[4]).toHaveTextContent('80 %');
+ expect(row[4]).toHaveTextContent('109.876.54.321');
+ expect(row[4]).toHaveTextContent('bar');
+ expect(row[4]).toHaveTextContent('80/tcp');
+ expect(row[4]).toHaveTextContent('Mon, Jun 3, 2019 1:06 PM CEST');
+ });
+});
diff --git a/src/web/pages/reports/details/auditthresholdpanel.jsx b/src/web/pages/reports/details/auditthresholdpanel.jsx
new file mode 100644
index 0000000000..d9b141a1b7
--- /dev/null
+++ b/src/web/pages/reports/details/auditthresholdpanel.jsx
@@ -0,0 +1,150 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import React from 'react';
+
+import styled from 'styled-components';
+
+import useTranslation from 'web/hooks/useTranslation';
+
+import Divider from 'web/components/layout/divider';
+
+import InfoPanel from 'web/components/panel/infopanel';
+
+import FilterIcon from 'web/components/icon/filtericon';
+
+import PropTypes from 'web/utils/proptypes';
+
+import ReportPanel from './reportpanel';
+import EditIcon from 'web/components/icon/editicon';
+import FootNote from 'web/components/footnote/footnote';
+import Layout from 'web/components/layout/layout';
+
+const UpdatingDivider = styled(({isUpdating, ...props}) => (
+
+))`
+ opacity: ${props => (props.isUpdating ? '0.2' : '1.0')};
+`;
+
+const AuditThresholdPanel = ({
+ entityType,
+ filter,
+ isUpdating = false,
+ threshold,
+ onFilterChanged,
+ onFilterEditClick,
+}) => {
+ const [_] = useTranslation();
+
+ const compliance = filter.get('compliance_levels', '');
+
+ const handleRemoveComplianceYes = () => {
+ if (compliance.includes('y')) {
+ const newCompliance = compliance.replace('y', '');
+ const lfilter = filter.copy();
+ lfilter.set('compliance_levels', newCompliance);
+
+ onFilterChanged(lfilter);
+ }
+ };
+
+ const handleRemoveComplianceUndefined = () => {
+ if (compliance.includes('u')) {
+ const newCompliance = compliance.replace('u', '');
+ const lfilter = filter.copy();
+ lfilter.set('compliance_levels', newCompliance);
+
+ onFilterChanged(lfilter);
+ }
+ };
+
+ const handleRemoveComplianceIncomplete = () => {
+ if (compliance.includes('i')) {
+ const newCompliance = compliance.replace('i', '');
+ const lfilter = filter.copy();
+ lfilter.set('compliance_levels', newCompliance);
+
+ onFilterChanged(lfilter);
+ }
+ };
+
+ return (
+
+
+
+ {compliance.includes('y') && (
+ }
+ title={_('Results with compliance "Yes" are currently included.')}
+ onClick={handleRemoveComplianceYes}
+ >
+ {_('Filter out results with compliance "Yes".')}
+
+ )}
+ {compliance.includes('u') && (
+ }
+ title={_(
+ 'Results with compliance "Undefined" are currently included.',
+ )}
+ onClick={handleRemoveComplianceUndefined}
+ >
+ {_('Filter out results with compliance "Undefined".')}
+
+ )}
+ {compliance.includes('i') && (
+ }
+ title={_(
+ 'Results with compliance "Incomplete" are currently included.',
+ )}
+ onClick={handleRemoveComplianceIncomplete}
+ >
+ {_('Filter out results with compliance "Incomplete".')}
+
+ )}
+ }
+ title={_('Your filter settings may be too unrefined.')}
+ onClick={onFilterEditClick}
+ >
+ {_('Adjust and update your filter settings.')}
+
+
+
+
+ {_('(Applied filter: {{- filter}})', {
+ filter: filter.simple().toFilterString(),
+ })}
+
+
+
+ );
+};
+
+AuditThresholdPanel.propTypes = {
+ entityType: PropTypes.string.isRequired,
+ filter: PropTypes.filter.isRequired,
+ isUpdating: PropTypes.bool,
+ threshold: PropTypes.number.isRequired,
+ onFilterChanged: PropTypes.func.isRequired,
+ onFilterEditClick: PropTypes.func.isRequired,
+};
+
+export default AuditThresholdPanel;
diff --git a/src/web/pages/reports/details/deltaresultstab.jsx b/src/web/pages/reports/details/deltaresultstab.jsx
index 4b3a52a4ba..95d37996df 100644
--- a/src/web/pages/reports/details/deltaresultstab.jsx
+++ b/src/web/pages/reports/details/deltaresultstab.jsx
@@ -32,9 +32,11 @@ const resultsSortFunctions = {
severity: makeCompareSeverity(),
solution_type: makeCompareString(entity => entity.nvt.solution?.type),
vulnerability: makeCompareString('vulnerability'),
+ compliant: makeCompareString('compliance'),
};
const ResultsTab = ({
+ audit = false,
counts,
delta = false,
filter,
@@ -99,6 +101,7 @@ const ResultsTab = ({
onPreviousClick,
}) => (
- {!levels.includes('g') && (
+ {!levels.includes('g') && isDefined(onFilterAddLogLevelClick) && (
}
title={_('Log messages are currently excluded.')}
@@ -66,7 +66,7 @@ const EmptyResultsReport = ({
)}
- {has_severity_filter && (
+ {has_severity_filter && isDefined(onFilterRemoveSeverityClick) && (
}
title={_(
@@ -117,11 +117,11 @@ const EmptyResultsReport = ({
EmptyResultsReport.propTypes = {
all: PropTypes.number.isRequired,
filter: PropTypes.filter.isRequired,
- onFilterAddLogLevelClick: PropTypes.func.isRequired,
+ onFilterAddLogLevelClick: PropTypes.func,
onFilterDecreaseMinQoDClick: PropTypes.func.isRequired,
onFilterEditClick: PropTypes.func.isRequired,
onFilterRemoveClick: PropTypes.func.isRequired,
- onFilterRemoveSeverityClick: PropTypes.func.isRequired,
+ onFilterRemoveSeverityClick: PropTypes.func,
};
export default EmptyResultsReport;
diff --git a/src/web/pages/reports/details/hoststab.jsx b/src/web/pages/reports/details/hoststab.jsx
index 5da00be099..60095d019e 100644
--- a/src/web/pages/reports/details/hoststab.jsx
+++ b/src/web/pages/reports/details/hoststab.jsx
@@ -37,9 +37,17 @@ const hostsSortFunctions = {
start: makeCompareDate(entity => entity.start),
end: makeCompareDate(entity => entity.end),
total: makeCompareNumber(entity => entity.result_counts.total),
+ complianceYes: makeCompareNumber(entity => entity.complianceCounts.yes),
+ complianceNo: makeCompareNumber(entity => entity.complianceCounts.no),
+ complianceIncomplete: makeCompareNumber(
+ entity => entity.complianceCounts.incomplete,
+ ),
+ complianceTotal: makeCompareNumber(entity => entity.complianceCounts.total),
+ compliant: makeCompareString('hostCompliance'),
};
const HostsTab = ({
+ audit = false,
counts,
hosts,
filter,
@@ -69,6 +77,7 @@ const HostsTab = ({
onPreviousClick,
}) => (
(
+const Header = ({
+ audit = false,
+ currentSortBy,
+ currentSortDir,
+ sort = true,
+ onSortChange,
+}) => (
(
onSortChange={onSortChange}
title={_('End')}
/>
-
-
-
-
-
-
-
+ {audit ? (
+
+ ) : (
+
+ )}
+ {audit ? (
+
+ ) : (
+
+ )}
+ {audit ? (
+
+ ) : (
+
+ )}
+ {!audit && (
+
+ )}
+ {!audit && (
+
+ )}
+ {audit ? (
+
+ ) : (
+
+ )}
+ {audit ? (
+
+ ) : (
+
+ )}
);
Header.propTypes = {
+ audit: PropTypes.bool,
currentSortBy: PropTypes.string,
currentSortDir: PropTypes.string,
sort: PropTypes.bool,
@@ -206,14 +273,16 @@ const renderAuthIcons = authSuccess => {
);
};
-const Row = ({entity, links = true}) => {
+const Row = ({entity, links = true, audit = false}) => {
const {
asset = {},
authSuccess,
details = {},
end,
+ hostCompliance,
ip,
result_counts = {},
+ complianceCounts = {},
severity,
start,
portsCount,
@@ -251,20 +320,43 @@ const Row = ({entity, links = true}) => {
- {result_counts.high}
- {result_counts.warning}
- {result_counts.info}
- {result_counts.log}
- {result_counts.false_positive}
- {result_counts.total}
-
-
-
+ {audit ? (
+ {complianceCounts.yes}
+ ) : (
+ {result_counts.high}
+ )}
+ {audit ? (
+ {complianceCounts.no}
+ ) : (
+ {result_counts.warning}
+ )}
+ {audit ? (
+ {complianceCounts.incomplete}
+ ) : (
+ {result_counts.info}
+ )}
+ {!audit && {result_counts.log} }
+ {!audit && {result_counts.false_positive} }
+ {audit ? (
+ {complianceCounts.total}
+ ) : (
+ {result_counts.total}
+ )}
+ {audit ? (
+
+
+
+ ) : (
+
+
+
+ )}
);
};
Row.propTypes = {
+ audit: PropTypes.bool,
entity: PropTypes.object.isRequired,
links: PropTypes.bool,
};
diff --git a/src/web/pages/reports/details/operatingsystemstab.jsx b/src/web/pages/reports/details/operatingsystemstab.jsx
index 66dca4b897..86f04fa524 100644
--- a/src/web/pages/reports/details/operatingsystemstab.jsx
+++ b/src/web/pages/reports/details/operatingsystemstab.jsx
@@ -18,9 +18,11 @@ const operatingssystemsSortFunctions = {
cpe: makeCompareString('id'),
hosts: makeCompareNumber(entity => entity.hosts.count),
severity: makeCompareNumber('severity', 0),
+ compliant: makeCompareString('compliance'),
};
const OperatingSystemsTab = ({
+ audit = false,
counts,
filter,
operatingsystems,
@@ -50,6 +52,7 @@ const OperatingSystemsTab = ({
onPreviousClick,
}) => (
(
+const Header = ({
+ audit = false,
+ currentSortDir,
+ currentSortBy,
+ sort = true,
+ onSortChange,
+}) => (
(
onSortChange={onSortChange}
title={_('Hosts')}
/>
-
+ {audit ? (
+
+ ) : (
+
+ )}
);
Header.propTypes = {
+ audit: PropTypes.bool,
currentSortBy: PropTypes.string,
currentSortDir: PropTypes.string,
sort: PropTypes.bool,
onSortChange: PropTypes.func,
};
-const Row = ({entity, links = true}) => {
- const {name, cpe, hosts, severity} = entity;
+const Row = ({audit = false, entity, links = true}) => {
+ const {name, cpe, hosts, severity, compliance} = entity;
return (
@@ -86,14 +106,21 @@ const Row = ({entity, links = true}) => {
{hosts.count}
-
-
-
+ {audit && isDefined(compliance) ? (
+
+
+
+ ) : (
+
+
+
+ )}
);
};
Row.propTypes = {
+ audit: PropTypes.bool,
entity: PropTypes.object.isRequired,
links: PropTypes.bool,
};
diff --git a/src/web/pages/reports/details/resultstab.jsx b/src/web/pages/reports/details/resultstab.jsx
index 37371e83b5..0acc2e8d24 100644
--- a/src/web/pages/reports/details/resultstab.jsx
+++ b/src/web/pages/reports/details/resultstab.jsx
@@ -148,6 +148,7 @@ class ResultsTab extends React.Component {
render() {
const {isUpdating, results, resultsCounts} = this.state;
const {
+ audit = false,
hasTarget,
isLoading = true,
progress,
@@ -225,6 +226,7 @@ class ResultsTab extends React.Component {
}
return (
isActive(status) ? USE_DEFAULT_RELOAD_INTERVAL_ACTIVE : NO_RELOAD; // report doesn't change anymore. no need to reload
-const loadInitial = ({
- reportFilter,
- reportId,
- resultsFilter,
- // eslint-disable-next-line no-shadow
- loadResults,
- updateFilter,
-}) => () => {
- let newFilter = resultsFilter;
-
- if (isDefined(resultsFilter) && isDefined(reportFilter)) {
- const simplifiedResultsFilter = resultsFilter
- .copy()
- .delete(resultsFilter.getSortOrder())
- .delete('first')
- .delete('_and_report_id');
- const simplifiedReportFilter = reportFilter
- .copy()
- .delete(reportFilter.getSortOrder())
- .delete('first');
-
- if (!simplifiedReportFilter.equals(simplifiedResultsFilter)) {
- // report filter has changed
+const loadInitial =
+ ({
+ reportFilter,
+ reportId,
+ resultsFilter,
+ // eslint-disable-next-line no-shadow
+ loadResults,
+ updateFilter,
+ }) =>
+ () => {
+ let newFilter = resultsFilter;
+
+ if (isDefined(resultsFilter) && isDefined(reportFilter)) {
+ const simplifiedResultsFilter = resultsFilter
+ .copy()
+ .delete(resultsFilter.getSortOrder())
+ .delete('first')
+ .delete('_and_report_id');
+ const simplifiedReportFilter = reportFilter
+ .copy()
+ .delete(reportFilter.getSortOrder())
+ .delete('first');
+
+ if (!simplifiedReportFilter.equals(simplifiedResultsFilter)) {
+ // report filter has changed
+ newFilter = reportFilter;
+ }
+ } else if (isDefined(resultsFilter)) {
+ newFilter = resultsFilter;
+ } else {
newFilter = reportFilter;
}
- } else if (isDefined(resultsFilter)) {
- newFilter = resultsFilter;
- } else {
- newFilter = reportFilter;
- }
- newFilter = filterWithReportId(newFilter, reportId);
- updateFilter(newFilter);
+ newFilter = filterWithReportId(newFilter, reportId);
+ updateFilter(newFilter);
- return loadResults(newFilter);
-};
+ return loadResults(newFilter);
+ };
-const load = ({
- reportFilter,
- reportId,
- resultsFilter,
- // eslint-disable-next-line no-shadow
- loadResults,
- updateFilter,
-}) => newFilter => {
- if (!hasValue(newFilter)) {
- newFilter = resultsFilter;
- }
+const load =
+ ({
+ reportFilter,
+ reportId,
+ resultsFilter,
+ // eslint-disable-next-line no-shadow
+ loadResults,
+ updateFilter,
+ }) =>
+ newFilter => {
+ if (!hasValue(newFilter)) {
+ newFilter = resultsFilter;
+ }
- if (!hasValue(newFilter)) {
- newFilter = reportFilter;
- }
+ if (!hasValue(newFilter)) {
+ newFilter = reportFilter;
+ }
- newFilter = filterWithReportId(newFilter, reportId);
- updateFilter(newFilter);
+ newFilter = filterWithReportId(newFilter, reportId);
+ updateFilter(newFilter);
- return loadResults(newFilter);
-};
+ return loadResults(newFilter);
+ };
const ResultsTabWrapper = props => (
{
export default compose(
withGmp,
connect(mapStateToProps, mapDispatchToProps),
-)(ResultsTabWrapper);
-
-// vim: set ts=2 sw=2 tw=80:
+)(ResultsTabWrapper);
\ No newline at end of file
diff --git a/src/web/pages/reports/details/toolbaricons.jsx b/src/web/pages/reports/details/toolbaricons.jsx
index 3caadaef46..7a61def7f5 100644
--- a/src/web/pages/reports/details/toolbaricons.jsx
+++ b/src/web/pages/reports/details/toolbaricons.jsx
@@ -33,6 +33,7 @@ import PropTypes from 'web/utils/proptypes';
import AlertActions from './alertactions';
const ToolBarIcons = ({
+ audit = false,
delta = false,
filter,
isLoading,
@@ -56,7 +57,11 @@ const ToolBarIcons = ({
anchor="reading-a-report"
title={_('Help: Reading Reports')}
/>
-
+ {audit ? (
+
+ ) : (
+
+ )}
{!isLoading && (
@@ -86,13 +91,15 @@ const ToolBarIcons = ({
>
-
-
-
+ {!audit && (
+
+
+
+ )}
{!delta && (
onFilterChange(filter.copy().delete('levels'));
+ const handleRemoveCompliance = () =>
+ onFilterChange(filter.delete('compliance_levels'));
return (
)}
-
+ {!audit && (
+
+ )}
-
+ {audit ? (
+
+ ) : (
+
+ )}
-
+ {!audit && (
+
+ )}
@@ -154,6 +170,7 @@ const ReportDetailsFilterDialog = ({
};
ReportDetailsFilterDialog.propTypes = {
+ audit: PropTypes.bool,
delta: PropTypes.bool,
filter: PropTypes.filter,
onClose: PropTypes.func,
diff --git a/src/web/pages/results/__tests__/row.jsx b/src/web/pages/results/__tests__/row.jsx
index e061adf30e..b8f6b103cf 100644
--- a/src/web/pages/results/__tests__/row.jsx
+++ b/src/web/pages/results/__tests__/row.jsx
@@ -142,3 +142,147 @@ describe('Delta reports V2 with same severity, qod and hostname', () => {
expect(icons.length).toBe(0);
});
});
+
+describe('Audit reports with compliance', () => {
+ const {render} = rendererWith({gmp, store: true});
+
+ test('should render Audit report with compliance yes', () => {
+ const entity = Result.fromElement({
+ _id: '101',
+ name: 'Result 1',
+ host: {__text: '123.456.78.910', hostname: 'foo'},
+ port: '80/tcp',
+ severity: 10.0,
+ qod: {value: 80},
+ notes: [],
+ overrides: [],
+ tickets: [],
+ compliance: 'yes',
+ });
+
+ const {getAllByTestId} = render(
+ ,
+ );
+ const bars = getAllByTestId('progressbar-box');
+
+ expect(bars[0]).toHaveAttribute('title', 'Yes');
+ expect(bars[0]).toHaveTextContent('Yes');
+ });
+
+ test('should render Audit report with compliance no', () => {
+ const entity = Result.fromElement({
+ _id: '101',
+ name: 'Result 1',
+ host: {__text: '123.456.78.910', hostname: 'foo'},
+ port: '80/tcp',
+ severity: 10.0,
+ qod: {value: 80},
+ notes: [],
+ overrides: [],
+ tickets: [],
+ compliance: 'no',
+ });
+
+ const {getAllByTestId} = render(
+ ,
+ );
+ const bars = getAllByTestId('progressbar-box');
+ expect(bars[0]).toHaveAttribute('title', 'No');
+ expect(bars[0]).toHaveTextContent('No');
+ });
+
+ test('should render Audit report with compliance incomplete', () => {
+ const entity = Result.fromElement({
+ _id: '101',
+ name: 'Result 1',
+ host: {__text: '123.456.78.910', hostname: 'foo'},
+ port: '80/tcp',
+ severity: 10.0,
+ qod: {value: 80},
+ notes: [],
+ overrides: [],
+ tickets: [],
+ compliance: 'incomplete',
+ });
+
+ const {getAllByTestId} = render(
+ ,
+ );
+ const bars = getAllByTestId('progressbar-box');
+ expect(bars[0]).toHaveAttribute('title', 'Incomplete');
+ expect(bars[0]).toHaveTextContent('Incomplete');
+ });
+
+ test('should render Audit report with compliance undefined', () => {
+ const entity = Result.fromElement({
+ _id: '101',
+ name: 'Result 1',
+ host: {__text: '123.456.78.910', hostname: 'foo'},
+ port: '80/tcp',
+ severity: 10.0,
+ qod: {value: 80},
+ notes: [],
+ overrides: [],
+ tickets: [],
+ compliance: 'undefined',
+ });
+
+ const {getAllByTestId} = render(
+ ,
+ );
+ const bars = getAllByTestId('progressbar-box');
+ expect(bars[0]).toHaveAttribute('title', 'Undefined');
+ expect(bars[0]).toHaveTextContent('Undefined');
+ });
+
+ test('Delta audit report with changed compliance', () => {
+ const entity = Result.fromElement({
+ _id: '101',
+ name: 'Result 1',
+ host: {__text: '123.456.78.910', hostname: 'foo'},
+ port: '80/tcp',
+ severity: 10.0,
+ qod: {value: 80},
+ notes: [],
+ overrides: [],
+ tickets: [],
+ compliance: 'undefined',
+ delta: {
+ delta_type: 'changed',
+ result: {
+ compliance: 'yes',
+ },
+ },
+ });
+
+ const {getAllByTestId} = render(
+ ,
+ );
+ const icons = getAllByTestId('svg-icon');
+ expect(icons.length).toEqual(1);
+ expect(icons[0]).toHaveAttribute(
+ 'title',
+ 'Compliance is changed from yes.',
+ );
+ });
+});
diff --git a/src/web/pages/results/row.jsx b/src/web/pages/results/row.jsx
index addef1f093..18ee6ad6ed 100644
--- a/src/web/pages/results/row.jsx
+++ b/src/web/pages/results/row.jsx
@@ -13,6 +13,7 @@ import {isDefined, isNumber} from 'gmp/utils/identity';
import {shorten} from 'gmp/utils/string';
import SeverityBar from 'web/components/bar/severitybar';
+import ComplianceBar from 'web/components/bar/compliancebar';
import DateTime from 'web/components/date/datetime';
@@ -42,6 +43,7 @@ import useGmp from "web/hooks/useGmp";
const Row = ({
actionsComponent: ActionsComponent = EntitiesActions,
+ audit = false,
delta = false,
entity,
links = true,
@@ -59,6 +61,7 @@ const Row = ({
entity.overrides.filter(override => override.isActive()).length > 0;
const hasTickets = entity.tickets.length > 0;
const deltaSeverity = entity.delta?.result?.severity;
+ const deltaCompliance = entity.delta?.result?.compliance;
const deltaHostname = entity.delta?.result?.host?.hostname;
const deltaQoD = entity.delta?.result?.qod?.value;
const epssScore = entity?.information?.epss?.max_severity?.score
@@ -95,16 +98,30 @@ const Row = ({
)}
-
-
- {isDefined(deltaSeverity) && entity.severity !== deltaSeverity && (
-
- )}
-
+ {audit ? (
+
+
+ {isDefined(deltaCompliance) &&
+ entity.compliance !== deltaCompliance && (
+
+ )}
+
+ ) : (
+
+ { }
+ {isDefined(deltaSeverity) && entity.severity !== deltaSeverity && (
+
+ )}
+
+ )}
@@ -165,6 +182,7 @@ const Row = ({
Row.propTypes = {
actionsComponent: PropTypes.component,
+ audit: PropTypes.bool,
delta: PropTypes.bool,
entity: PropTypes.model.isRequired,
links: PropTypes.bool,
diff --git a/src/web/pages/results/table.jsx b/src/web/pages/results/table.jsx
index 30e4344b04..ff936cba57 100644
--- a/src/web/pages/results/table.jsx
+++ b/src/web/pages/results/table.jsx
@@ -30,6 +30,7 @@ import useGmp from "web/hooks/useGmp";
const Header = ({
actionsColumn,
+ audit = false,
delta = false,
links = true,
sort = true,
@@ -72,15 +73,27 @@ const Header = ({
)}
-
+ {audit ? (
+
+ ) : (
+
+ )}
(
+}) => {
+ const caps = useCapabilities();
+ const displayIds = [
+ ...ALL_DISPLAYS,
+ ...(caps.featureEnabled('COMPLIANCE_REPORTS')
+ ? AUDIT_REPORTS_DISPLAYS
+ : [])
+ ];
+ return (
-);
+)};
StartDashboard.propTypes = {
id: PropTypes.id.isRequired,
diff --git a/src/web/pages/tags/component.jsx b/src/web/pages/tags/component.jsx
index 870f8eaf47..fa868aaa99 100644
--- a/src/web/pages/tags/component.jsx
+++ b/src/web/pages/tags/component.jsx
@@ -29,6 +29,7 @@ export const MAX_RESOURCES = 40; // concerns listing in "Assigned Resources" tab
const TYPES = [
'alert',
+ 'audit',
'host',
'operatingsystem',
'cpe',
@@ -42,6 +43,7 @@ const TYPES = [
'nvt',
'override',
'permission',
+ 'policy',
'portlist',
'report',
'reportconfig',
@@ -106,7 +108,13 @@ class TagComponent extends React.Component {
getResourceTypes() {
const {capabilities} = this.props;
- return TYPES.map(type =>
+ const types = [
+ ...TYPES,
+ ...(capabilities.featureEnabled('COMPLIANCE_REPORTS')
+ ? ['auditreport']
+ : [])
+ ].sort();
+ return types.map(type =>
capabilities.mayAccess(type) ? [type, typeName(type)] : undefined,
).filter(isDefined);
}
diff --git a/src/web/pages/tags/dialog.jsx b/src/web/pages/tags/dialog.jsx
index 9c49ae1760..38e1e661ea 100644
--- a/src/web/pages/tags/dialog.jsx
+++ b/src/web/pages/tags/dialog.jsx
@@ -40,6 +40,7 @@ const ScrollableContent = styled.div`
`;
const types = {
+ auditreport: 'audit_report',
operatingsystem: 'os',
certbund: 'cert_bund_adv',
dfncert: 'dfn_cert_adv',
diff --git a/src/web/pages/tasks/status.jsx b/src/web/pages/tasks/status.jsx
index 03a6778574..8fcf3cb9d8 100644
--- a/src/web/pages/tasks/status.jsx
+++ b/src/web/pages/tasks/status.jsx
@@ -23,7 +23,7 @@ const StyledDetailsLink = styled(DetailsLink)`
}
`;
-const TaskStatus = ({task, links = true}) => {
+const TaskStatus = ({task, links = true, isAudit = false}) => {
let report_id;
if (isDefined(task.current_report)) {
report_id = task.current_report.id;
@@ -35,16 +35,20 @@ const TaskStatus = ({task, links = true}) => {
}
return (
-
+
{
};
TaskStatus.propTypes = {
+ isAudit: PropTypes.bool,
links: PropTypes.bool,
task: PropTypes.model.isRequired,
};
diff --git a/src/web/pages/users/confirmdeletedialog.jsx b/src/web/pages/users/confirmdeletedialog.jsx
index e877f22093..8941d4163a 100644
--- a/src/web/pages/users/confirmdeletedialog.jsx
+++ b/src/web/pages/users/confirmdeletedialog.jsx
@@ -3,6 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
+
import React from 'react';
import PropTypes from 'web/utils/proptypes';
diff --git a/src/web/pages/usersettings/defaultspart.jsx b/src/web/pages/usersettings/defaultspart.jsx
index 6dc0402bd1..43ca958eb1 100644
--- a/src/web/pages/usersettings/defaultspart.jsx
+++ b/src/web/pages/usersettings/defaultspart.jsx
@@ -3,6 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
+
import React from 'react';
import FormGroup from 'web/components/form/formgroup';
diff --git a/src/web/pages/usersettings/dialog.jsx b/src/web/pages/usersettings/dialog.jsx
index 0fe8335694..1673f37f13 100644
--- a/src/web/pages/usersettings/dialog.jsx
+++ b/src/web/pages/usersettings/dialog.jsx
@@ -69,6 +69,7 @@ let UserSettingsDialog = ({
defaultSchedule,
defaultTarget,
alertsFilter,
+ auditReportsFilter,
configsFilter,
credentialsFilter,
filtersFilter,
@@ -124,6 +125,7 @@ let UserSettingsDialog = ({
defaultSchedule,
defaultTarget,
alertsFilter,
+ auditReportsFilter,
configsFilter,
credentialsFilter,
filtersFilter,
@@ -247,6 +249,7 @@ let UserSettingsDialog = ({
filters.filter(filter => filter.filter_type === type);
const FilterPart = ({
alertsFilter,
+ auditReportsFilter,
configsFilter,
credentialsFilter,
filtersFilter,
@@ -50,6 +52,7 @@ const FilterPart = ({
onChange,
}) => {
const [_] = useTranslation();
+ const caps = useCapabilities();
return (
@@ -63,6 +66,19 @@ const FilterPart = ({
onChange={onChange}
/>
+ {caps.featureEnabled('COMPLIANCE_REPORTS') && (
+
+
+
+ )}
+ {capabilities.featureEnabled('COMPLIANCE_REPORTS') && (
+
+ )
+ }
{
const defaultSchedule = schedulesSel.getEntity(defaultScheduleId);
const defaultTarget = targetsSel.getEntity(defaultTargetId);
const alertsFilter = userDefaultFilterSelector.getFilter('alert');
+ const auditReportsFilter = userDefaultFilterSelector.getFilter('auditreport');
const configsFilter = userDefaultFilterSelector.getFilter('scanconfig');
const credentialsFilter = userDefaultFilterSelector.getFilter('credential');
const filtersFilter = userDefaultFilterSelector.getFilter('filter');
@@ -1010,6 +1026,7 @@ const mapStateToProps = rootState => {
defaultSchedule,
defaultTarget,
alertsFilter,
+ auditReportsFilter,
configsFilter,
credentialsFilter,
filtersFilter,
@@ -1050,6 +1067,7 @@ const mapDispatchToProps = (dispatch, {gmp}) => ({
loadFilterDefaults: () =>
Promise.all([
dispatch(loadUserSettingsDefaultFilter(gmp)('alert')),
+ dispatch(loadUserSettingsDefaultFilter(gmp)('auditreport')),
dispatch(loadUserSettingsDefaultFilter(gmp)('scanconfig')),
dispatch(loadUserSettingsDefaultFilter(gmp)('credential')),
dispatch(loadUserSettingsDefaultFilter(gmp)('filter')),
diff --git a/src/web/routes.jsx b/src/web/routes.jsx
index 63d0825356..80b99c7fad 100644
--- a/src/web/routes.jsx
+++ b/src/web/routes.jsx
@@ -11,6 +11,7 @@ import {createBrowserHistory} from 'history';
import {stringify, parse} from 'qs';
import qhistory from 'qhistory';
+import ConditionalRoute from 'web/components/conditionalRoute/ConditionalRoute';
import LocationObserver from 'web/components/observer/locationobserver';
import SessionObserver from 'web/components/observer/sessionobserver';
@@ -23,6 +24,8 @@ import AboutPage from './pages/help/about';
import AlertsPage from './pages/alerts/listpage';
import AlertDetailsPage from './pages/alerts/detailspage';
import AuditsPage from './pages/audits/listpage';
+import AuditReportDetailsPage from './pages/reports/auditdetailspage';
+import AuditReportsPage from './pages/reports/auditreportslistpage';
import AuditsDetailsPage from './pages/audits/detailspage';
import CertBundsPage from './pages/certbund/listpage';
import CertBundDetailsPage from './pages/certbund/detailspage';
@@ -66,6 +69,7 @@ import ReportFormatsPage from './pages/reportformats/listpage';
import ReportFormatDetailsPage from './pages/reportformats/detailspage';
import ReportsPage from './pages/reports/listpage';
import ReportDetailsPage from './pages/reports/detailspage';
+import DeltaAuditReportDetailsPage from './pages/reports/auditdeltadetailspage';
import DeltaReportDetailsPage from './pages/reports/deltadetailspage';
import ResultsPage from './pages/results/listpage';
import ResultDetailsPage from './pages/results/detailspage';
@@ -121,6 +125,18 @@ const Routes = () => (
+
+
+
diff --git a/src/web/store/entities/__tests__/reducers.js b/src/web/store/entities/__tests__/reducers.js
index 71e7a11e04..e9112b0c86 100644
--- a/src/web/store/entities/__tests__/reducers.js
+++ b/src/web/store/entities/__tests__/reducers.js
@@ -24,10 +24,12 @@ describe('entities reducer tests', () => {
expect(entitiesReducer(undefined, {})).toEqual({
alert: initState,
audit: initState,
+ auditreport: initState,
certbund: initState,
cpe: initState,
credential: initState,
cve: initState,
+ deltaAuditReport: initState,
deltaReport: initState,
dfncert: initState,
filter: initState,
diff --git a/src/web/store/entities/auditreports.js b/src/web/store/entities/auditreports.js
new file mode 100644
index 0000000000..95febbe2e3
--- /dev/null
+++ b/src/web/store/entities/auditreports.js
@@ -0,0 +1,62 @@
+/* SPDX-FileCopyrightText: 2024 Greenbone AG
+ *
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import {
+ createEntitiesLoadingActions,
+ createLoadAllEntities,
+ createLoadEntities,
+ types,
+} from 'web/store/entities/utils/actions';
+
+import {createReducer, initialState} from 'web/store/entities/utils/reducers';
+import {createEntitiesSelector} from 'web/store/entities/utils/selectors';
+
+import {reportReducer} from './report/reducers';
+import {reportsReducer} from './reports/reducers';
+
+const reportsSelector = createEntitiesSelector('auditreport');
+const entitiesActions = createEntitiesLoadingActions('auditreport');
+const loadAllEntities = createLoadAllEntities({
+ selector: reportsSelector,
+ actions: entitiesActions,
+ entityType: 'auditreport',
+});
+const loadEntities = createLoadEntities({
+ selector: reportsSelector,
+ actions: entitiesActions,
+ entityType: 'auditreport',
+});
+
+const reducer = (state = initialState, action) => {
+ if (action.entityType !== 'auditreport') {
+ return state;
+ }
+
+ switch (action.type) {
+ case types.ENTITIES_LOADING_REQUEST:
+ case types.ENTITIES_LOADING_SUCCESS:
+ case types.ENTITIES_LOADING_ERROR:
+ return reportsReducer(state, action);
+
+ case types.ENTITY_LOADING_REQUEST:
+ case types.ENTITY_LOADING_SUCCESS:
+ case types.ENTITY_LOADING_ERROR:
+ return reportReducer(state, action);
+
+ default:
+ return state;
+ }
+};
+
+const deltaAuditReducer = createReducer('deltaAuditReport');
+
+export {
+ deltaAuditReducer,
+ loadAllEntities,
+ loadEntities,
+ reducer,
+ reportsSelector as selector,
+ entitiesActions,
+};
diff --git a/src/web/store/entities/reducers.js b/src/web/store/entities/reducers.js
index d12f11332f..7ec854db10 100644
--- a/src/web/store/entities/reducers.js
+++ b/src/web/store/entities/reducers.js
@@ -7,6 +7,10 @@ import {combineReducers} from 'redux';
import {reducer as alert} from './alerts';
import {reducer as audit} from './audits';
+import {
+ reducer as auditreport,
+ deltaAuditReducer as deltaAuditReport,
+} from './auditreports';
import {reducer as certbund} from './certbund';
import {reducer as cpe} from './cpes';
import {reducer as credential} from './credentials';
@@ -41,10 +45,12 @@ import {reducer as vuln} from './vulns';
const entitiesReducer = combineReducers({
alert,
audit,
+ auditreport,
certbund,
cpe,
credential,
cve,
+ deltaAuditReport,
deltaReport,
dfncert,
filter,
diff --git a/src/web/store/entities/report/__tests__/actions.js b/src/web/store/entities/report/__tests__/actions.js
index 5712358259..ca9bb8c2e5 100644
--- a/src/web/store/entities/report/__tests__/actions.js
+++ b/src/web/store/entities/report/__tests__/actions.js
@@ -14,18 +14,24 @@ import {types} from 'web/store/entities/utils/actions';
import {createState, testEntityActions} from 'web/store/entities/utils/testing';
import {
+ auditReportActions,
deltaReportActions,
loadReport,
+ loadAuditReport,
+ loadAuditReportIfNeeded,
+ loadAuditReportWithThreshold,
+ loadDeltaReport,
+ loadDeltaAuditReport,
loadReportIfNeeded,
loadReportWithThreshold,
reportActions,
- loadDeltaReport,
} from '../actions';
import {reportIdentifier} from '../selectors';
testEntityActions('report', reportActions);
testEntityActions('deltaReport', deltaReportActions);
+testEntityActions('auditreport', auditReportActions);
describe('loadReport function tests', () => {
test('should load report successfully', () => {
@@ -936,3 +942,936 @@ describe('loadDeltaReport function tests', () => {
});
});
});
+
+describe('loadAuditReport function tests', () => {
+ test('should load audit report successfully', () => {
+ const id = 'a1';
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [id]: false,
+ },
+ });
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const get = testing.fn().mockResolvedValue({
+ data: {foo: 'bar'},
+ });
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ };
+
+ expect(loadAuditReport).toBeDefined();
+ expect(isFunction(loadAuditReport)).toBe(true);
+
+ expect.assertions(7);
+
+ return loadAuditReport(gmp)(id)(dispatch, getState).then(() => {
+ expect(getState).toBeCalled();
+ expect(get).toBeCalledWith({id}, {details: true, filter: undefined});
+ expect(dispatch).toHaveBeenCalledTimes(2);
+ expect(dispatch).toHaveBeenNthCalledWith(1, {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(2, {
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'auditreport',
+ data: {foo: 'bar'},
+ id,
+ });
+ });
+ });
+
+ test('should load audit report with results filter successfully', () => {
+ const id = 'a1';
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [id]: false,
+ },
+ });
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const get = testing.fn().mockResolvedValue({
+ data: {foo: 'bar'},
+ });
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ };
+
+ const filter = Filter.fromString('foo=bar');
+
+ expect(loadAuditReport).toBeDefined();
+ expect(isFunction(loadAuditReport)).toBe(true);
+
+ expect.assertions(7);
+
+ return loadAuditReport(gmp)(id, {filter})(dispatch, getState).then(() => {
+ expect(getState).toBeCalled();
+ expect(get).toBeCalledWith({id}, {details: true, filter});
+ expect(dispatch).toHaveBeenCalledTimes(2);
+ expect(dispatch).toHaveBeenNthCalledWith(1, {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ filter,
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(2, {
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'auditreport',
+ filter,
+ data: {foo: 'bar'},
+ id,
+ });
+ });
+ });
+
+ test('should not load audit report if isLoading is true', () => {
+ const id = 'a1';
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [id]: true,
+ },
+ });
+
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const get = testing.fn().mockResolvedValue([{id: 'foo'}]);
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ };
+
+ expect.assertions(3);
+
+ return loadAuditReport(gmp)(id)(dispatch, getState).then(() => {
+ expect(getState).toBeCalled();
+ expect(dispatch).not.toBeCalled();
+ expect(get).not.toBeCalled();
+ });
+ });
+
+ test('should fail loading audit report with an error', () => {
+ const id = 'a1';
+ const rootState = createState('auditreport', {
+ [id]: {
+ isLoading: false,
+ },
+ });
+
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const get = testing.fn().mockRejectedValue('An Error');
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ };
+
+ expect.assertions(5);
+
+ return loadAuditReport(gmp)(id)(dispatch, getState).catch(() => {
+ expect(getState).toBeCalled();
+ expect(get).toBeCalledWith({id}, {details: true, filter: undefined});
+ expect(dispatch).toHaveBeenCalledTimes(2);
+ expect(dispatch).toHaveBeenNthCalledWith(1, {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(2, {
+ type: types.ENTITY_LOADING_ERROR,
+ entityType: 'auditreport',
+ error: 'An Error',
+ id,
+ });
+ });
+ });
+});
+
+describe('report loadAuditReportIfNeeded function tests', () => {
+ test('should load audit report successfully if needed', () => {
+ const id = 'a1';
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [id]: false,
+ },
+ });
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const get = testing.fn().mockResolvedValue({data: {foo: 'bar'}});
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ };
+
+ expect.assertions(7);
+
+ expect(loadAuditReportIfNeeded).toBeDefined();
+ expect(isFunction(loadAuditReportIfNeeded)).toBe(true);
+
+ return loadAuditReportIfNeeded(gmp)(id)(dispatch, getState).then(() => {
+ expect(getState).toBeCalled();
+ expect(get).toBeCalledWith({id}, {details: false, filter: undefined});
+ expect(dispatch).toHaveBeenCalledTimes(2);
+ expect(dispatch).toHaveBeenNthCalledWith(1, {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(2, {
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'auditreport',
+ data: {foo: 'bar'},
+ id,
+ });
+ });
+ });
+
+ test('should not load audit report if report is already in store', () => {
+ const id = 'a1';
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [id]: false,
+ },
+ byId: {
+ [id]: 'a1',
+ },
+ });
+
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const get = testing.fn().mockResolvedValue([{id: 'foo'}]);
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ };
+
+ expect.assertions(3);
+
+ return loadAuditReportIfNeeded(gmp)(id)(dispatch, getState).then(() => {
+ expect(getState).toBeCalled();
+ expect(dispatch).not.toBeCalled();
+ expect(get).not.toBeCalled();
+ });
+ });
+
+ test('should load audit report with results filter successfully if needed', () => {
+ const id = 'a1';
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [id]: false,
+ },
+ });
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const get = testing.fn().mockResolvedValue({data: {foo: 'bar'}});
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ };
+
+ const filter = Filter.fromString('foo=bar');
+
+ expect.assertions(7);
+
+ expect(loadAuditReportIfNeeded).toBeDefined();
+ expect(isFunction(loadAuditReportIfNeeded)).toBe(true);
+
+ return loadAuditReportIfNeeded(gmp)(id, {filter})(dispatch, getState).then(
+ () => {
+ expect(getState).toBeCalled();
+ expect(get).toBeCalledWith({id}, {details: false, filter});
+ expect(dispatch).toHaveBeenCalledTimes(2);
+ expect(dispatch).toHaveBeenNthCalledWith(1, {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ filter,
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(2, {
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'auditreport',
+ filter,
+ data: {foo: 'bar'},
+ id,
+ });
+ },
+ );
+ });
+
+ test('should not audit load report if isLoading is true', () => {
+ const id = 'a1';
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [id]: true,
+ },
+ });
+
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const get = testing.fn().mockResolvedValue([{id: 'foo'}]);
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ };
+
+ expect.assertions(3);
+
+ return loadAuditReportIfNeeded(gmp)(id)(dispatch, getState).then(() => {
+ expect(getState).toBeCalled();
+ expect(dispatch).not.toBeCalled();
+ expect(get).not.toBeCalled();
+ });
+ });
+
+ test('should fail loading audit report with an error', () => {
+ const id = 'a1';
+ const rootState = createState('auditreport', {
+ [id]: {
+ isLoading: false,
+ },
+ });
+
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const get = testing.fn().mockRejectedValue('An Error');
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ };
+
+ expect.assertions(5);
+
+ return loadAuditReportIfNeeded(gmp)(id)(dispatch, getState).catch(() => {
+ expect(getState).toBeCalled();
+ expect(get).toBeCalledWith({id}, {details: false, filter: undefined});
+ expect(dispatch).toHaveBeenCalledTimes(2);
+ expect(dispatch.mock.calls[0]).toEqual([
+ {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ id,
+ },
+ ]);
+ expect(dispatch.mock.calls[1]).toEqual([
+ {
+ type: types.ENTITY_LOADING_ERROR,
+ entityType: 'auditreport',
+ error: 'An Error',
+ id,
+ },
+ ]);
+ });
+ });
+});
+
+describe('loadAuditReportWithThreshold tests', () => {
+ test('should only load "simple" audit report', () => {
+ const id = 'a1';
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [id]: false,
+ },
+ });
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const auditreport = {
+ report: {
+ results: {
+ counts: {
+ filtered: 10000,
+ },
+ },
+ },
+ };
+
+ const get = testing.fn().mockResolvedValue({
+ data: auditreport,
+ });
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ settings: {
+ reportResultsThreshold: 1000,
+ },
+ };
+
+ expect(loadAuditReportWithThreshold).toBeDefined();
+ expect(isFunction(loadAuditReportWithThreshold)).toBe(true);
+
+ expect.assertions(7);
+
+ return loadAuditReportWithThreshold(gmp)(id)(dispatch, getState).then(
+ () => {
+ expect(getState).toBeCalled();
+ expect(get).toBeCalledWith({id}, {details: false, filter: undefined});
+ expect(dispatch).toHaveBeenCalledTimes(2);
+ expect(dispatch).toHaveBeenNthCalledWith(1, {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(2, {
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'auditreport',
+ data: auditreport,
+ id,
+ });
+ },
+ );
+ });
+
+ test('should load "full" audit report', () => {
+ const id = 'a1';
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [id]: false,
+ },
+ });
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const auditreport = {
+ report: {
+ results: {
+ counts: {
+ filtered: 10000,
+ },
+ },
+ },
+ };
+
+ const get = testing.fn().mockResolvedValue({
+ data: auditreport,
+ });
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ settings: {
+ reportResultsThreshold: 100001,
+ },
+ };
+
+ expect(loadAuditReportWithThreshold).toBeDefined();
+ expect(isFunction(loadAuditReportWithThreshold)).toBe(true);
+
+ expect.assertions(11);
+
+ return loadAuditReportWithThreshold(gmp)(id)(dispatch, getState).then(
+ () => {
+ expect(getState).toBeCalled();
+ expect(get).toHaveBeenCalledTimes(2);
+ expect(get).toHaveBeenNthCalledWith(
+ 1,
+ {id},
+ {details: false, filter: undefined},
+ );
+ expect(get).toHaveBeenNthCalledWith(
+ 2,
+ {id},
+ {details: true, filter: undefined},
+ );
+ expect(dispatch).toHaveBeenCalledTimes(4);
+ expect(dispatch).toHaveBeenNthCalledWith(1, {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(2, {
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'auditreport',
+ data: auditreport,
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(3, {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(4, {
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'auditreport',
+ data: auditreport,
+ id,
+ });
+ },
+ );
+ });
+
+ test('should only load "simple" audit report with filter', () => {
+ const id = 'a1';
+ const filter = Filter.fromString('foo=bar rows=10');
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [reportIdentifier(id, filter)]: false,
+ },
+ });
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const auditreport = {
+ report: {
+ results: {
+ counts: {
+ filtered: 10000,
+ },
+ },
+ },
+ };
+
+ const get = testing.fn().mockResolvedValue({
+ data: auditreport,
+ });
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ settings: {
+ reportResultsThreshold: 1000,
+ },
+ };
+
+ expect(loadAuditReportWithThreshold).toBeDefined();
+ expect(isFunction(loadAuditReportWithThreshold)).toBe(true);
+
+ expect.assertions(7);
+
+ return loadAuditReportWithThreshold(gmp)(id, {filter})(
+ dispatch,
+ getState,
+ ).then(() => {
+ expect(getState).toBeCalled();
+ expect(get).toBeCalledWith({id}, {details: false, filter});
+ expect(dispatch).toHaveBeenCalledTimes(2);
+ expect(dispatch).toHaveBeenNthCalledWith(1, {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ filter,
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(2, {
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'auditreport',
+ filter,
+ data: auditreport,
+ id,
+ });
+ });
+ });
+
+ test('should load "full" audit report with filter', () => {
+ const id = 'a1';
+ const filter = Filter.fromString('foo=bar rows=10');
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [reportIdentifier(id, filter)]: false,
+ },
+ });
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const auditreport = {
+ report: {
+ results: {
+ counts: {
+ filtered: 10000,
+ },
+ },
+ },
+ };
+
+ const get = testing.fn().mockResolvedValue({
+ data: auditreport,
+ });
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ settings: {
+ reportResultsThreshold: 100001,
+ },
+ };
+
+ expect(loadAuditReportWithThreshold).toBeDefined();
+ expect(isFunction(loadAuditReportWithThreshold)).toBe(true);
+
+ expect.assertions(11);
+
+ return loadAuditReportWithThreshold(gmp)(id, {filter})(
+ dispatch,
+ getState,
+ ).then(() => {
+ expect(getState).toBeCalled();
+ expect(get).toHaveBeenCalledTimes(2);
+ expect(get).toHaveBeenNthCalledWith(1, {id}, {details: false, filter});
+ expect(get).toHaveBeenNthCalledWith(2, {id}, {details: true, filter});
+ expect(dispatch).toHaveBeenCalledTimes(4);
+ expect(dispatch).toHaveBeenNthCalledWith(1, {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ filter,
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(2, {
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'auditreport',
+ filter,
+ data: auditreport,
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(3, {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
+ filter,
+ id,
+ });
+ expect(dispatch).toHaveBeenNthCalledWith(4, {
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'auditreport',
+ filter,
+ data: auditreport,
+ id,
+ });
+ });
+ });
+
+ test('should not load audit report if already loading', () => {
+ const id = 'a1';
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [id]: true,
+ },
+ });
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const auditreport = {
+ report: {
+ results: {
+ counts: {
+ filtered: 10000,
+ },
+ },
+ },
+ };
+
+ const get = testing.fn().mockResolvedValue({
+ data: auditreport,
+ });
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ settings: {
+ reportResultsThreshold: 1000,
+ },
+ };
+
+ expect(loadAuditReportWithThreshold).toBeDefined();
+ expect(isFunction(loadAuditReportWithThreshold)).toBe(true);
+
+ expect.assertions(5);
+
+ return loadAuditReportWithThreshold(gmp)(id)(dispatch, getState).then(
+ () => {
+ expect(getState).toBeCalled();
+ expect(get).not.toHaveBeenCalled();
+ expect(dispatch).not.toHaveBeenCalled();
+ },
+ );
+ });
+
+ test('should not audit load report if already loading with filter', () => {
+ const id = 'a1';
+ const filter = Filter.fromString('foo=bar rows=10');
+ const rootState = createState('auditreport', {
+ isLoading: {
+ [reportIdentifier(id, filter)]: true,
+ },
+ });
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const auditreport = {
+ report: {
+ results: {
+ counts: {
+ filtered: 10000,
+ },
+ },
+ },
+ };
+
+ const get = testing.fn().mockResolvedValue({
+ data: auditreport,
+ });
+
+ const gmp = {
+ auditreport: {
+ get,
+ },
+ settings: {
+ reportResultsThreshold: 1000,
+ },
+ };
+
+ expect(loadAuditReportWithThreshold).toBeDefined();
+ expect(isFunction(loadAuditReportWithThreshold)).toBe(true);
+
+ expect.assertions(5);
+
+ return loadAuditReportWithThreshold(gmp)(id, {filter})(
+ dispatch,
+ getState,
+ ).then(() => {
+ expect(getState).toBeCalled();
+ expect(get).not.toHaveBeenCalled();
+ expect(dispatch).not.toHaveBeenCalled();
+ });
+ });
+});
+
+describe('loadDeltaAuditReport function tests', () => {
+ test('should load delta audit report successfully', () => {
+ const id = 'a1';
+ const deltaId = 'a2';
+ const identifier = `${id}+${deltaId}`;
+
+ const rootState = createState('deltaAuditReport', {
+ isLoading: {
+ [identifier]: false,
+ },
+ });
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const getDelta = testing.fn().mockResolvedValue({
+ data: {foo: 'bar'},
+ });
+
+ const gmp = {
+ auditreport: {
+ getDelta,
+ },
+ };
+
+ expect(loadDeltaAuditReport).toBeDefined();
+ expect(isFunction(loadDeltaAuditReport)).toBe(true);
+
+ return loadDeltaAuditReport(gmp)(id, deltaId)(dispatch, getState).then(
+ () => {
+ expect(getState).toBeCalled();
+ expect(getDelta).toBeCalledWith(
+ {id},
+ {id: deltaId},
+ {filter: undefined},
+ );
+ expect(dispatch).toHaveBeenCalledTimes(2);
+ expect(dispatch.mock.calls[0]).toEqual([
+ {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'deltaAuditReport',
+ id: identifier,
+ },
+ ]);
+ expect(dispatch.mock.calls[1]).toEqual([
+ {
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'deltaAuditReport',
+ data: {foo: 'bar'},
+ id: identifier,
+ },
+ ]);
+ },
+ );
+ });
+
+ test('should load delta audit report with results filter successfully', () => {
+ const id = 'a1';
+ const deltaId = 'a2';
+ const identifier = `${id}+${deltaId}`;
+
+ const rootState = createState('deltaAuditReport', {
+ isLoading: {
+ [identifier]: false,
+ },
+ });
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const getDelta = testing.fn().mockResolvedValue({
+ data: {foo: 'bar'},
+ });
+
+ const gmp = {
+ auditreport: {
+ getDelta,
+ },
+ };
+
+ const filter = Filter.fromString('foo=bar');
+
+ expect(loadDeltaAuditReport).toBeDefined();
+ expect(isFunction(loadDeltaReport)).toBe(true);
+
+ return loadDeltaAuditReport(gmp)(
+ id,
+ deltaId,
+ filter,
+ )(dispatch, getState).then(() => {
+ expect(getState).toBeCalled();
+ expect(getDelta).toBeCalledWith({id}, {id: deltaId}, {filter});
+ expect(dispatch).toHaveBeenCalledTimes(2);
+ expect(dispatch.mock.calls[0]).toEqual([
+ {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'deltaAuditReport',
+ id: identifier,
+ },
+ ]);
+ expect(dispatch.mock.calls[1]).toEqual([
+ {
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'deltaAuditReport',
+ data: {foo: 'bar'},
+ id: identifier,
+ },
+ ]);
+ });
+ });
+
+ test('should not load audit delta report if isLoading is true', () => {
+ const id = 'a1';
+ const deltaId = 'a2';
+ const identifier = `${id}+${deltaId}`;
+ const rootState = createState('deltaAuditReport', {
+ isLoading: {
+ [identifier]: true,
+ },
+ });
+
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const getDelta = testing.fn().mockResolvedValue([{id: 'foo'}]);
+
+ const gmp = {
+ auditreport: {
+ getDelta,
+ },
+ };
+
+ return loadDeltaAuditReport(gmp)(id, deltaId)(dispatch, getState).then(
+ () => {
+ expect(getState).toBeCalled();
+ expect(dispatch).not.toBeCalled();
+ expect(getDelta).not.toBeCalled();
+ },
+ );
+ });
+
+ test('should fail loading audit delta report with an error', () => {
+ const id = 'a1';
+ const deltaId = 'a2';
+ const identifier = `${id}+${deltaId}`;
+ const rootState = createState('deltaAuditReport', {
+ [identifier]: {
+ isLoading: false,
+ },
+ });
+
+ const getState = testing.fn().mockReturnValue(rootState);
+
+ const dispatch = testing.fn();
+
+ const getDelta = testing.fn().mockRejectedValue('An Error');
+
+ const gmp = {
+ auditreport: {
+ getDelta,
+ },
+ };
+
+ return loadDeltaAuditReport(gmp)(id, deltaId)(dispatch, getState).then(
+ () => {
+ expect(getState).toBeCalled();
+ expect(getDelta).toBeCalledWith(
+ {id},
+ {id: deltaId},
+ {filter: undefined},
+ );
+ expect(dispatch).toHaveBeenCalledTimes(2);
+ expect(dispatch.mock.calls[0]).toEqual([
+ {
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'deltaAuditReport',
+ id: identifier,
+ },
+ ]);
+ expect(dispatch.mock.calls[1]).toEqual([
+ {
+ type: types.ENTITY_LOADING_ERROR,
+ entityType: 'deltaAuditReport',
+ error: 'An Error',
+ id: identifier,
+ },
+ ]);
+ },
+ );
+ });
+});
diff --git a/src/web/store/entities/report/actions.js b/src/web/store/entities/report/actions.js
index 50bf796acf..a667af5cb4 100644
--- a/src/web/store/entities/report/actions.js
+++ b/src/web/store/entities/report/actions.js
@@ -11,30 +11,53 @@ import {
} from 'web/store/entities/utils/actions';
import {
+ auditReportSelector,
reportSelector,
deltaReportSelector,
+ deltaAuditReportSelector,
deltaReportIdentifier,
} from './selectors';
-const entityType = 'report';
-
export const reportActions = {
request: (id, filter) => ({
type: types.ENTITY_LOADING_REQUEST,
- entityType,
+ entityType: 'report',
+ filter,
+ id,
+ }),
+ success: (id, data, filter) => ({
+ type: types.ENTITY_LOADING_SUCCESS,
+ entityType: 'report',
+ data,
+ filter,
+ id,
+ }),
+ error: (id, error, filter) => ({
+ type: types.ENTITY_LOADING_ERROR,
+ entityType: 'report',
+ error,
+ filter,
+ id,
+ }),
+};
+
+export const auditReportActions = {
+ request: (id, filter) => ({
+ type: types.ENTITY_LOADING_REQUEST,
+ entityType: 'auditreport',
filter,
id,
}),
success: (id, data, filter) => ({
type: types.ENTITY_LOADING_SUCCESS,
- entityType,
+ entityType: 'auditreport',
data,
filter,
id,
}),
error: (id, error, filter) => ({
type: types.ENTITY_LOADING_ERROR,
- entityType,
+ entityType: 'auditreport',
error,
filter,
id,
@@ -150,3 +173,108 @@ export const loadDeltaReport =
error => dispatch(deltaReportActions.error(identifier, error)),
);
};
+
+export const loadAuditReport =
+ gmp =>
+ (id, {filter, details = true, force = false} = {}) =>
+ (dispatch, getState) => {
+ const rootState = getState();
+ const state = auditReportSelector(rootState);
+
+ if (!force && state.isLoadingEntity(id, filter)) {
+ return Promise.resolve();
+ }
+
+ dispatch(auditReportActions.request(id, filter));
+
+ return gmp.auditreport
+ .get({id}, {filter, details})
+ .then(
+ response => response.data,
+ error => {
+ dispatch(auditReportActions.error(id, error, filter));
+ return Promise.reject(error);
+ },
+ )
+ .then(data => {
+ dispatch(auditReportActions.success(id, data, filter));
+
+ return data;
+ });
+ };
+
+export const loadAuditReportWithThreshold =
+ gmp =>
+ (id, {filter} = {}) =>
+ (dispatch, getState) => {
+ const rootState = getState();
+ const state = auditReportSelector(rootState);
+
+ if (state.isLoadingEntity(id, filter)) {
+ return Promise.resolve();
+ }
+
+ dispatch(auditReportActions.request(id, filter));
+
+ const {reportResultsThreshold: threshold} = gmp.settings;
+ return gmp.auditreport
+ .get({id}, {filter, details: false})
+ .then(
+ response => response.data,
+ error => {
+ dispatch(auditReportActions.error(id, error, filter));
+ return Promise.reject(error);
+ },
+ )
+ .then(report => {
+ const fullReport =
+ isDefined(report) &&
+ isDefined(report.report) &&
+ isDefined(report.report.results) &&
+ report.report.results.counts.filtered < threshold;
+
+ dispatch(auditReportActions.success(id, report, filter));
+ if (fullReport) {
+ return loadAuditReport(gmp)(id, {filter, details: true, force: true})(
+ dispatch,
+ getState,
+ );
+ }
+ });
+ };
+
+export const loadAuditReportIfNeeded =
+ gmp =>
+ (id, {filter, details = false} = {}) =>
+ (dispatch, getState) => {
+ const rootState = getState();
+ const state = auditReportSelector(rootState);
+
+ if (isDefined(state.getEntity(id, filter))) {
+ return Promise.resolve();
+ }
+ return loadAuditReport(gmp)(id, {filter, details})(dispatch, getState);
+ };
+
+export const deltaAuditReportActions =
+ createEntityLoadingActions('deltaAuditReport');
+
+export const loadDeltaAuditReport =
+ gmp => (id, deltaId, filter) => (dispatch, getState) => {
+ const rootState = getState();
+ const state = deltaAuditReportSelector(rootState);
+
+ if (state.isLoading(id, deltaId)) {
+ return Promise.resolve();
+ }
+
+ const identifier = deltaReportIdentifier(id, deltaId);
+
+ dispatch(deltaAuditReportActions.request(identifier));
+
+ return gmp.auditreport.getDelta({id}, {id: deltaId}, {filter}).then(
+ response =>
+ dispatch(deltaAuditReportActions.success(identifier, response.data)),
+ error => dispatch(deltaAuditReportActions.error(identifier, error)),
+ );
+ };
diff --git a/src/web/store/entities/report/reducers.js b/src/web/store/entities/report/reducers.js
index 0166bac722..6a6dd2a4c8 100644
--- a/src/web/store/entities/report/reducers.js
+++ b/src/web/store/entities/report/reducers.js
@@ -70,7 +70,7 @@ const byId = (state = {}, action) => {
};
export const reportReducer = (state = {}, action) => {
- if (action.entityType !== 'report') {
+ if (action.entityType !== 'report' && action.entityType !== 'auditreport') {
return state;
}
diff --git a/src/web/store/entities/report/selectors.js b/src/web/store/entities/report/selectors.js
index 228b0d241a..26d7b3da4d 100644
--- a/src/web/store/entities/report/selectors.js
+++ b/src/web/store/entities/report/selectors.js
@@ -78,5 +78,11 @@ class DeltaReportSelector {
export const reportSelector = rootState =>
new ReportSelector(rootState.entities.report);
+export const auditReportSelector = rootState =>
+ new ReportSelector(rootState.entities.auditreport);
+
export const deltaReportSelector = rootState =>
new DeltaReportSelector(rootState.entities.deltaReport);
+
+export const deltaAuditReportSelector = rootState =>
+ new DeltaReportSelector(rootState.entities.deltaAuditReport);
diff --git a/src/web/store/entities/reports/reducers.js b/src/web/store/entities/reports/reducers.js
index cd66b54b5f..0ee6e3c88b 100644
--- a/src/web/store/entities/reports/reducers.js
+++ b/src/web/store/entities/reports/reducers.js
@@ -77,7 +77,7 @@ const byId = (state = {}, action) => {
};
export const reportsReducer = (state = {}, action) => {
- if (action.entityType !== 'report') {
+ if (action.entityType !== 'report' && action.entityType !== 'auditreport') {
return state;
}
diff --git a/src/web/utils/theme.jsx b/src/web/utils/theme.jsx
index d6f31fdaf9..a03c73b7a6 100644
--- a/src/web/utils/theme.jsx
+++ b/src/web/utils/theme.jsx
@@ -28,6 +28,11 @@ const Theme = {
darkRed: '#c12c30', // used by: dialog errors font
errorRed: '#c83814', // used by: progressbar
+ complianceYes: '#4cb045',
+ complianceNo: '#D80000',
+ complianceIncomplete: 'orange',
+ complianceUndefined: 'silver',
+
lightBlue: '#d6e6fd', // used by InfoPanel and dashboard hovering
mediumBlue: '#77acf7', // used by active/hovered items in Select
blue: '#0a53b8', // used by: links
From 60f27392b04a0b860e33dd640ab6a35b0281734a Mon Sep 17 00:00:00 2001
From: daniele-mng
Date: Tue, 10 Sep 2024 10:38:26 +0200
Subject: [PATCH 126/130] update test
---
src/web/pages/audits/__tests__/listpage.jsx | 12 ++-
src/web/pages/policies/__tests__/listpage.jsx | 2 +-
.../__tests__/auditdeltadetailspage.jsx | 37 +++++----
.../reports/__tests__/auditdetailscontent.jsx | 30 ++++---
.../reports/__tests__/auditfilterdialog.jsx | 36 +++++----
.../__tests__/auditreportslistpage.jsx | 43 ++++++----
.../reports/__tests__/detailsfilterdialog.jsx | 79 ++++++++++++-------
7 files changed, 146 insertions(+), 93 deletions(-)
diff --git a/src/web/pages/audits/__tests__/listpage.jsx b/src/web/pages/audits/__tests__/listpage.jsx
index de6c6b25da..336d74518d 100644
--- a/src/web/pages/audits/__tests__/listpage.jsx
+++ b/src/web/pages/audits/__tests__/listpage.jsx
@@ -209,14 +209,18 @@ describe('AuditPage tests', () => {
const icons = getBulkActionItems();
expect(deleteByFilter).not.toHaveBeenCalled();
- expect(icons[0]).toHaveAttribute('title', 'Move page contents to trashcan');
- await clickElement(icons[0]);
+ const deleteIcon = icons[1];
+ expect(deleteIcon).toHaveAttribute(
+ 'title',
+ 'Move page contents to trashcan',
+ );
+ await clickElement(deleteIcon);
testBulkTrashcanDialog(screen, deleteByFilter);
expect(exportByFilter).not.toHaveBeenCalled();
- expect(icons[1]).toHaveAttribute('title', 'Export page contents');
- await clickElement(icons[1]);
+ expect(icons[2]).toHaveAttribute('title', 'Export page contents');
+ await clickElement(icons[2]);
expect(exportByFilter).toHaveBeenCalled();
});
});
diff --git a/src/web/pages/policies/__tests__/listpage.jsx b/src/web/pages/policies/__tests__/listpage.jsx
index d891383fd6..c2c5915d96 100644
--- a/src/web/pages/policies/__tests__/listpage.jsx
+++ b/src/web/pages/policies/__tests__/listpage.jsx
@@ -117,7 +117,7 @@ describe('PoliciesPage tests', () => {
await wait();
- expect(baseElement).toBeVisible();
+ expect(element).toBeVisible();
});
test('should call commands for bulk actions', async () => {
diff --git a/src/web/pages/reports/__tests__/auditdeltadetailspage.jsx b/src/web/pages/reports/__tests__/auditdeltadetailspage.jsx
index fbd2849f14..930e662021 100644
--- a/src/web/pages/reports/__tests__/auditdeltadetailspage.jsx
+++ b/src/web/pages/reports/__tests__/auditdeltadetailspage.jsx
@@ -12,7 +12,8 @@ import Filter from 'gmp/models/filter';
import {setTimezone, setUsername} from 'web/store/usersettings/actions';
-import {rendererWith} from 'web/utils/testing';
+import {getByRole, rendererWith} from 'web/utils/testing';
+import {getPowerFilter, getTextInputs} from 'web/components/testing';
import {getMockAuditDeltaReport} from 'web/pages/reports/__mocks__/mockauditdeltareport';
@@ -91,7 +92,7 @@ describe('Audit Detla Report Details Content tests', () => {
store.dispatch(setTimezone('CET'));
store.dispatch(setUsername('admin'));
- const {baseElement, getAllByTestId} = render(
+ const {baseElement, getAllByTestId, within} = render(
{
);
const icons = baseElement.querySelectorAll('svg');
- const inputs = baseElement.querySelectorAll('input');
const links = baseElement.querySelectorAll('a');
const tableData = baseElement.querySelectorAll('td');
- const selects = getAllByTestId('select-selected-value');
+ const powerFilter = getPowerFilter();
+ const inputs = getTextInputs(powerFilter);
+ const select = getByRole(powerFilter, 'combobox');
const bars = getAllByTestId('progressbar-box');
// Toolbar Icons
- expect(icons.length).toEqual(14)
+ expect(icons.length).toEqual(15);
- // Powerfilter
+ // Powerilter
expect(inputs[0]).toHaveAttribute('name', 'userFilterString');
- expect(selects[0]).toHaveAttribute('title', 'Loaded filter');
- expect(selects[0]).toHaveTextContent('foo');
+
+ const input = within(select).getByTitle('Loaded filter');
+ expect(input).toHaveValue('foo');
// Header
expect(baseElement).toHaveTextContent(
@@ -266,7 +269,7 @@ describe('Audit Detla Report Details Content tests', () => {
store.dispatch(setTimezone('CET'));
store.dispatch(setUsername('admin'));
- const {baseElement, getAllByTestId} = render(
+ const {baseElement, getAllByTestId, within} = render(
{
);
const icons = baseElement.querySelectorAll('svg');
- const inputs = baseElement.querySelectorAll('input');
const header = baseElement.querySelectorAll('th');
const rows = baseElement.querySelectorAll('tr');
- const selects = getAllByTestId('select-selected-value');
+ const powerFilter = getPowerFilter();
+ const inputs = getTextInputs(powerFilter);
+ const select = getByRole(powerFilter, 'combobox');
+
+ // PowerFilter
+ expect(inputs[0]).toHaveAttribute('name', 'userFilterString');
+
+ const input = within(select).getByTitle('Loaded filter');
+ expect(input).toHaveValue('--');
+
const bars = getAllByTestId('progressbar-box');
// Toolbar Icons
- expect(icons.length).toEqual(24)
+ expect(icons.length).toEqual(25);
// Powerfilter
expect(inputs[0]).toHaveAttribute('name', 'userFilterString');
- expect(selects[0]).toHaveAttribute('title', 'Loaded filter');
- expect(selects[0]).toHaveTextContent('--');
// Header
expect(baseElement).toHaveTextContent(
diff --git a/src/web/pages/reports/__tests__/auditdetailscontent.jsx b/src/web/pages/reports/__tests__/auditdetailscontent.jsx
index fa8ccd693f..42542d748f 100644
--- a/src/web/pages/reports/__tests__/auditdetailscontent.jsx
+++ b/src/web/pages/reports/__tests__/auditdetailscontent.jsx
@@ -12,9 +12,10 @@ import Filter from 'gmp/models/filter';
import {setTimezone, setUsername} from 'web/store/usersettings/actions';
-import {rendererWith} from 'web/utils/testing';
+import {getByRole, rendererWith} from 'web/utils/testing';
import {getMockAuditReport} from 'web/pages/reports/__mocks__/mockauditreport';
+import {getPowerFilter, getTextInputs} from 'web/components/testing';
import DetailsContent from 'web/pages/reports/auditdetailscontent';
@@ -95,7 +96,7 @@ describe('Audit Report Details Content tests', () => {
store.dispatch(setTimezone('CET'));
store.dispatch(setUsername('admin'));
- const {baseElement, getAllByTestId} = render(
+ const {baseElement, getAllByTestId, within} = render(
{
const inputs = baseElement.querySelectorAll('input');
const links = baseElement.querySelectorAll('a');
const tableData = baseElement.querySelectorAll('td');
- const selects = getAllByTestId('select-selected-value');
+ const powerFilter = getPowerFilter();
+
+ const select = getByRole(powerFilter, 'combobox');
const bars = getAllByTestId('progressbar-box');
// Toolbar Icons
- expect(icons.length).toEqual(16)
+ expect(icons.length).toEqual(17);
// Powerfilter
expect(inputs[0]).toHaveAttribute('name', 'userFilterString');
- expect(selects[0]).toHaveAttribute('title', 'Loaded filter');
- expect(selects[0]).toHaveTextContent('Loading...');
+ const input = within(select).getByTitle('Loaded filter');
+ expect(input).toHaveAttribute('placeholder', 'Loading...');
// Header
- expect(baseElement).toHaveTextContent(
+ expect(baseElement).toHaveTextContent(
'Report:Mon, Jun 3, 2019 1:00 PM CEST',
);
expect(bars[0]).toHaveAttribute('title', 'Done');
@@ -261,7 +264,7 @@ describe('Audit Report Details Content tests', () => {
store.dispatch(setTimezone('CET'));
store.dispatch(setUsername('admin'));
- const {baseElement, getAllByTestId} = render(
+ const {baseElement, getAllByTestId, within} = render(
{
);
const icons = baseElement.querySelectorAll('svg');
- const inputs = baseElement.querySelectorAll('input');
- const selects = getAllByTestId('select-selected-value');
+ const powerFilter = getPowerFilter();
+ const inputs = getTextInputs(powerFilter);
+ const select = getByRole(powerFilter, 'combobox');
const bars = getAllByTestId('progressbar-box');
// Toolbar Icons
- expect(icons.length).toEqual(20)
+ expect(icons.length).toEqual(21);
// Powerfilter
expect(inputs[0]).toHaveAttribute('name', 'userFilterString');
- expect(selects[0]).toHaveAttribute('title', 'Loaded filter');
- expect(selects[0]).toHaveTextContent('Loading...');
+ const input = within(select).getByTitle('Loaded filter');
+ expect(input).toHaveAttribute('placeholder', 'Loading...');
// Header
expect(baseElement).toHaveTextContent(
diff --git a/src/web/pages/reports/__tests__/auditfilterdialog.jsx b/src/web/pages/reports/__tests__/auditfilterdialog.jsx
index f9d29e5809..f47cd90ea7 100644
--- a/src/web/pages/reports/__tests__/auditfilterdialog.jsx
+++ b/src/web/pages/reports/__tests__/auditfilterdialog.jsx
@@ -37,7 +37,7 @@ describe('Filter Dialog for Audit report', () => {
capabilities: caps,
});
- const {getAllByTestId} = render(
+ const {baseElement, getByLabelText} = render(
{
/>,
);
- const formgroups = getAllByTestId('formgroup-title');
- const content = getAllByTestId('formgroup-content');
- const radioTitles = getAllByTestId('radio-title');
-
- expect(formgroups[0]).toHaveTextContent('Filter');
- expect(formgroups[1]).toHaveTextContent('Compliance');
- expect(content[1]).toHaveTextContent('YesNoIncompleteUndefined');
- expect(formgroups[2]).toHaveTextContent('QoD');
- expect(formgroups[3]).toHaveTextContent('From Task (name)');
- expect(formgroups[4]).toHaveTextContent('First result');
- expect(formgroups[5]).toHaveTextContent('Results per page');
- expect(formgroups[6]).toHaveTextContent('Sort by');
- expect(radioTitles[0]).toHaveTextContent('Ascending');
- expect(radioTitles[1]).toHaveTextContent('Descending');
+ const formGroups = baseElement.querySelectorAll(
+ '[class*="mantine-Text-root"]',
+ );
+
+ expect(formGroups[0]).toHaveTextContent('Filter');
+ expect(formGroups[1]).toHaveTextContent('Compliance');
+ expect(formGroups[2]).toHaveTextContent('QoD');
+ expect(formGroups[3]).toHaveTextContent('From Task (name)');
+ expect(formGroups[4]).toHaveTextContent('First result');
+ expect(formGroups[5]).toHaveTextContent('Results per page');
+ expect(formGroups[6]).toHaveTextContent('Sort by');
+
+ const ascendingRadio = getByLabelText('Ascending');
+ const descendingRadio = getByLabelText('Descending');
+
+ expect(ascendingRadio).toBeInTheDocument();
+ expect(descendingRadio).toBeInTheDocument();
+
+ expect(ascendingRadio).toBeChecked();
+ expect(descendingRadio).not.toBeChecked();
});
});
diff --git a/src/web/pages/reports/__tests__/auditreportslistpage.jsx b/src/web/pages/reports/__tests__/auditreportslistpage.jsx
index 0539914828..d2b8619d92 100644
--- a/src/web/pages/reports/__tests__/auditreportslistpage.jsx
+++ b/src/web/pages/reports/__tests__/auditreportslistpage.jsx
@@ -4,8 +4,13 @@
*/
import {describe, test, expect, testing} from '@gsa/testing';
+import {
+ getPowerFilter,
+ getTextInputs,
+ getSelectElement,
+ testBulkDeleteDialog,
+} from 'web/components/testing';
import React from 'react';
-import {act} from 'react-dom/test-utils';
import CollectionCounts from 'gmp/collection/collectioncounts';
@@ -16,7 +21,13 @@ import {entitiesActions} from 'web/store/entities/auditreports';
import {loadingActions} from 'web/store/usersettings/defaults/actions';
import {defaultFilterLoadingActions} from 'web/store/usersettings/defaultfilters/actions';
-import {rendererWith, waitFor, fireEvent} from 'web/utils/testing';
+import {
+ rendererWith,
+ waitFor,
+ fireEvent,
+ screen,
+ wait,
+} from 'web/utils/testing';
import {getMockAuditReport} from 'web/pages/reports/__mocks__/mockauditreport';
import AuditReportsPage from '../auditreportslistpage';
@@ -135,17 +146,17 @@ describe('AuditReportsPage tests', () => {
entitiesActions.success([entity], filter, loadedFilter, counts),
);
- const {baseElement, getAllByTestId} = render( );
+ const {baseElement, getAllByTestId, within} = render( );
await waitFor(() => baseElement.querySelectorAll('table'));
const display = getAllByTestId('grid-item');
const icons = getAllByTestId('svg-icon');
- const inputs = baseElement.querySelectorAll('input');
const header = baseElement.querySelectorAll('th');
const row = baseElement.querySelectorAll('tr');
- const selects = getAllByTestId('select-selected-value');
-
+ const powerFilter = getPowerFilter();
+ const select = getSelectElement(powerFilter);
+ const inputs = getTextInputs(powerFilter);
// Toolbar Icons
expect(icons[0]).toHaveAttribute('title', 'Help: Audit Reports');
@@ -156,8 +167,8 @@ describe('AuditReportsPage tests', () => {
expect(icons[3]).toHaveAttribute('title', 'Reset to Default Filter');
expect(icons[4]).toHaveAttribute('title', 'Help: Powerfilter');
expect(icons[5]).toHaveAttribute('title', 'Edit Filter');
- expect(selects[0]).toHaveAttribute('title', 'Loaded filter');
- expect(selects[0]).toHaveTextContent('--');
+ const input = within(select).getByTitle('Loaded filter');
+ expect(input).toHaveValue('--');
// // Dashboard
expect(icons[7]).toHaveAttribute('title', 'Add new Dashboard Display');
@@ -254,14 +265,14 @@ describe('AuditReportsPage tests', () => {
const icons = getAllByTestId('svg-icon');
- await act(async () => {
- expect(icons[19]).toHaveAttribute('title', 'Add tag to page contents');
- fireEvent.click(icons[19]);
- expect(getAll).toHaveBeenCalled();
+ expect(icons[19]).toHaveAttribute('title', 'Add tag to page contents');
+ fireEvent.click(icons[19]);
+ expect(getAll).toHaveBeenCalled();
- expect(icons[20]).toHaveAttribute('title', 'Delete page contents');
- fireEvent.click(icons[20]);
- expect(deleteByFilter).toHaveBeenCalled();
- });
+ fireEvent.click(screen.getAllByTitle('Delete page contents')[0]);
+
+ await wait();
+
+ testBulkDeleteDialog(screen, deleteByFilter);
});
});
diff --git a/src/web/pages/reports/__tests__/detailsfilterdialog.jsx b/src/web/pages/reports/__tests__/detailsfilterdialog.jsx
index 4c26cc56bb..38467f8ae9 100644
--- a/src/web/pages/reports/__tests__/detailsfilterdialog.jsx
+++ b/src/web/pages/reports/__tests__/detailsfilterdialog.jsx
@@ -37,7 +37,7 @@ describe('Details Filter Dialog for Audit report', () => {
capabilities: caps,
});
- const {getAllByTestId} = render(
+ const {baseElement, getByText, getByLabelText} = render(
{
onFilterCreated={onFilterCreated}
/>,
);
+ const dialogTitle = getByText('Update Filter');
+ expect(dialogTitle).toBeInTheDocument();
- const formgroups = getAllByTestId('formgroup-title');
- const content = getAllByTestId('formgroup-content');
+ const formGroups = baseElement.querySelectorAll(
+ '[class*="mantine-Text-root"]',
+ );
- expect(formgroups[0]).toHaveTextContent('Filter');
- expect(formgroups[1]).toHaveTextContent(
+ expect(formGroups[0]).toHaveTextContent('Filter');
+ expect(formGroups[1]).toHaveTextContent('QoD');
+ expect(formGroups[2]).toHaveTextContent('Compliance');
+ expect(formGroups[3]).toHaveTextContent('Solution Type');
+ expect(formGroups[4]).toHaveTextContent('Vulnerability');
+ expect(formGroups[5]).toHaveTextContent('Host (IP)');
+ expect(formGroups[6]).toHaveTextContent('Location (eg. port/protocol)');
+ expect(formGroups[7]).toHaveTextContent('First result');
+ expect(formGroups[8]).toHaveTextContent('Results per page');
+
+ const onlyShowHostsCheckbox = getByLabelText(
'Only show hosts that have results',
);
- expect(formgroups[2]).toHaveTextContent('QoD');
- expect(formgroups[3]).toHaveTextContent('Compliance');
- expect(content[3]).toHaveTextContent('YesNoIncompleteUndefined');
- expect(formgroups[4]).toHaveTextContent('Solution Type');
- expect(formgroups[5]).toHaveTextContent('Vulnerability');
- expect(formgroups[6]).toHaveTextContent('Host (IP)');
- expect(formgroups[7]).toHaveTextContent('Location (eg. port/protocol)');
- expect(formgroups[8]).toHaveTextContent('First result');
- expect(formgroups[9]).toHaveTextContent('Results per page');
+ expect(onlyShowHostsCheckbox).toBeInTheDocument();
+
+ const cancelButton = getByText('Cancel');
+ const updateButton = getByText('Update');
+ expect(cancelButton).toBeInTheDocument();
+ expect(updateButton).toBeInTheDocument();
});
test('should render severity levels filter group', () => {
@@ -85,7 +94,7 @@ describe('Details Filter Dialog for Audit report', () => {
capabilities: caps,
});
- const {getAllByTestId} = render(
+ const {getByText, baseElement, getByLabelText} = render(
{
/>,
);
- const formgroups = getAllByTestId('formgroup-title');
- const content = getAllByTestId('formgroup-content');
+ const dialogTitle = getByText('Update Filter');
+ expect(dialogTitle).toBeInTheDocument();
- expect(formgroups[0]).toHaveTextContent('Filter');
- expect(formgroups[1]).toHaveTextContent('Apply Overrides');
- expect(formgroups[2]).toHaveTextContent(
+ const formGroups = baseElement.querySelectorAll(
+ '[class*="mantine-Text-root"]',
+ );
+
+ expect(formGroups[0]).toHaveTextContent('Filter');
+ expect(formGroups[1]).toHaveTextContent('Apply Overrides');
+ expect(formGroups[2]).toHaveTextContent('QoD');
+ expect(formGroups[3]).toHaveTextContent('Severity (Class)');
+ expect(formGroups[4]).toHaveTextContent('Severity');
+ expect(formGroups[5]).toHaveTextContent('Solution Type');
+ expect(formGroups[6]).toHaveTextContent('Vulnerability');
+ expect(formGroups[7]).toHaveTextContent('Host (IP)');
+ expect(formGroups[8]).toHaveTextContent('Location (eg. port/protocol)');
+ expect(formGroups[9]).toHaveTextContent('First result');
+ expect(formGroups[10]).toHaveTextContent('Results per page');
+
+ const onlyShowHostsCheckbox = getByLabelText(
'Only show hosts that have results',
);
- expect(formgroups[3]).toHaveTextContent('QoD');
- expect(formgroups[4]).toHaveTextContent('Severity (Class)');
- expect(content[4]).toHaveTextContent('HighMediumLowLogFalse Pos.');
- expect(formgroups[5]).toHaveTextContent('Severity');
- expect(formgroups[6]).toHaveTextContent('Solution Type');
- expect(formgroups[7]).toHaveTextContent('Vulnerability');
- expect(formgroups[8]).toHaveTextContent('Host (IP)');
- expect(formgroups[9]).toHaveTextContent('Location (eg. port/protocol)');
- expect(formgroups[10]).toHaveTextContent('First result');
- expect(formgroups[11]).toHaveTextContent('Results per page');
+ expect(onlyShowHostsCheckbox).toBeInTheDocument();
+
+ const cancelButton = getByText('Cancel');
+ const updateButton = getByText('Update');
+ expect(cancelButton).toBeInTheDocument();
+ expect(updateButton).toBeInTheDocument();
});
});
From 956c89352e49d90aa83357bb078cdf29c65241c2 Mon Sep 17 00:00:00 2001
From: daniele-mng
Date: Tue, 24 Sep 2024 08:11:15 +0200
Subject: [PATCH 127/130] fixes router v6
---
package-lock.json | 68 ++++------------------
src/web/components/menu/menu.jsx | 11 +---
src/web/components/structure/header.jsx | 12 ++--
src/web/pages/login/loginpage.jsx | 5 +-
src/web/pages/reports/deltadetailspage.jsx | 1 +
src/web/routes.jsx | 2 +-
6 files changed, 24 insertions(+), 75 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 5a000040b6..73d9a8d6e0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5511,7 +5511,6 @@
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
- "dev": true,
"dependencies": {
"es-define-property": "^1.0.0",
"es-errors": "^1.3.0",
@@ -6205,7 +6204,6 @@
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
"integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
- "dev": true,
"dependencies": {
"es-define-property": "^1.0.0",
"es-errors": "^1.3.0",
@@ -6441,7 +6439,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
- "dev": true,
"dependencies": {
"get-intrinsic": "^1.2.4"
},
@@ -6453,7 +6450,6 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "dev": true,
"engines": {
"node": ">= 0.4"
}
@@ -7420,7 +7416,6 @@
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
- "dev": true,
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2",
@@ -7582,7 +7577,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
- "dev": true,
"dependencies": {
"get-intrinsic": "^1.1.3"
},
@@ -7618,7 +7612,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
"integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
- "dev": true,
"dependencies": {
"es-define-property": "^1.0.0"
},
@@ -7630,7 +7623,6 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
"integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
- "dev": true,
"engines": {
"node": ">= 0.4"
},
@@ -7642,7 +7634,6 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
- "dev": true,
"engines": {
"node": ">= 0.4"
},
@@ -8050,6 +8041,14 @@
"node": ">=12"
}
},
+ "node_modules/invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dependencies": {
+ "loose-envify": "^1.0.0"
+ }
+ },
"node_modules/is-array-buffer": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
@@ -9419,7 +9418,6 @@
"version": "1.13.1",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
"integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
- "dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -9689,27 +9687,6 @@
"integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
"dev": true
},
- "node_modules/path-to-regexp": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
- "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
- "dependencies": {
- "lru-cache": "^10.2.0",
- "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
- },
- "engines": {
- "node": ">=16 || 14 >=14.18"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/path-scurry/node_modules/lru-cache": {
- "version": "10.4.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
- "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
- "dev": true
- },
"node_modules/path-type": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
@@ -9989,17 +9966,6 @@
"node": ">=6"
}
},
- "node_modules/qhistory": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/qhistory/-/qhistory-1.1.0.tgz",
- "integrity": "sha512-mb5x+kKmEVSnUAX/loL20Y0kr1l4RZf7Al0Z1aNlwRL7nZo/QE46lRzLDro6CTNKcSUjiTOSQuFGRk4sU+FRUQ==",
- "dependencies": {
- "invariant": "^2.2.2"
- },
- "peerDependencies": {
- "history": ">=4.0.0"
- }
- },
"node_modules/qs": {
"version": "6.13.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
@@ -10275,11 +10241,6 @@
"react-dom": ">=16.8"
}
},
- "node_modules/react-router/node_modules/react-is": {
- "version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
- },
"node_modules/react-select": {
"version": "5.8.0",
"resolved": "https://registry.npmjs.org/react-select/-/react-select-5.8.0.tgz",
@@ -10589,11 +10550,6 @@
"node": ">=4"
}
},
- "node_modules/resolve-pathname": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz",
- "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng=="
- },
"node_modules/restore-cursor": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz",
@@ -10832,7 +10788,6 @@
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
"integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
- "dev": true,
"dependencies": {
"define-data-property": "^1.1.4",
"es-errors": "^1.3.0",
@@ -10890,7 +10845,6 @@
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
"integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.7",
"es-errors": "^1.3.0",
@@ -11908,9 +11862,9 @@
}
},
"node_modules/vite": {
- "version": "5.4.3",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.3.tgz",
- "integrity": "sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==",
+ "version": "5.4.7",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.7.tgz",
+ "integrity": "sha512-5l2zxqMEPVENgvzTuBpHer2awaetimj2BGkhBPdnwKbPNOlHsODU+oiazEZzLK7KhAnOrO+XGYJYn4ZlUhDtDQ==",
"dev": true,
"dependencies": {
"esbuild": "^0.21.3",
diff --git a/src/web/components/menu/menu.jsx b/src/web/components/menu/menu.jsx
index 2deb6f2932..b6e29768a5 100644
--- a/src/web/components/menu/menu.jsx
+++ b/src/web/components/menu/menu.jsx
@@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
import {AppNavigation} from '@greenbone/opensight-ui-components';
@@ -11,7 +10,7 @@ import {AppNavigation} from '@greenbone/opensight-ui-components';
import useTranslation from 'web/hooks/useTranslation';
import useCapabilities from 'web/hooks/useCapabilities';
import useGmp from 'web/hooks/useGmp';
-import {useRouteMatch} from 'react-router-dom';
+import {useMatch} from 'react-router-dom';
import Link from 'web/components/link/link';
import {
@@ -65,7 +64,7 @@ const Menu = () => {
const mayOpAssets = checkCapabilities(['assets', 'tls_certificates']);
- const useIsActive = path => Boolean(useRouteMatch(path));
+ const useIsActive = path => Boolean(useMatch(path));
const isUserActive = useIsActive('/users');
const isGroupsActive = useIsActive('/groups');
@@ -259,11 +258,7 @@ const Menu = () => {
[
{
label: _('Dashboards'),
- to: '/',
- active: useRouteMatch({
- path: '/',
- exact: true,
- }),
+ to: '/dashboards',
icon: BarChart3,
},
],
diff --git a/src/web/components/structure/header.jsx b/src/web/components/structure/header.jsx
index 33b726c547..bc43312aa9 100644
--- a/src/web/components/structure/header.jsx
+++ b/src/web/components/structure/header.jsx
@@ -5,7 +5,7 @@
import {useCallback} from 'react';
-import {useHistory} from 'react-router-dom';
+import {useNavigate} from 'react-router-dom';
import {AppHeader} from '@greenbone/opensight-ui-components';
@@ -24,14 +24,14 @@ const Header = () => {
const gmp = useGmp();
const username = useUserName();
const loggedIn = useUserIsLoggedIn();
- const history = useHistory();
+ const navigate = useNavigate();
const handleSettingsClick = useCallback(
event => {
event.preventDefault();
- history.push('/usersettings');
+ navigate('/usersettings');
},
- [history],
+ [navigate],
);
const handleLogout = useCallback(
@@ -39,10 +39,10 @@ const Header = () => {
event.preventDefault();
gmp.doLogout().then(() => {
- history.push('/login?type=logout');
+ navigate('/login?type=logout');
});
},
- [gmp, history],
+ [gmp, navigate],
);
const menuPoints = [
diff --git a/src/web/pages/login/loginpage.jsx b/src/web/pages/login/loginpage.jsx
index 53629b2d6c..74d867c631 100644
--- a/src/web/pages/login/loginpage.jsx
+++ b/src/web/pages/login/loginpage.jsx
@@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
import {connect} from 'react-redux';
@@ -119,7 +118,7 @@ class LoginPage extends React.Component {
) {
navigate(location.state.next, {replace: true});
} else {
- navigate('/dashboard', {replace: true});
+ navigate('/dashboards', {replace: true});
}
},
rej => {
@@ -134,7 +133,7 @@ class LoginPage extends React.Component {
// redirect user to main page if he is already logged in
if (isLoggedIn) {
- navigate('/dashboard', {replace: true});
+ navigate('/dashboards', {replace: true});
}
}
diff --git a/src/web/pages/reports/deltadetailspage.jsx b/src/web/pages/reports/deltadetailspage.jsx
index 53720b4c31..4b75ecd222 100644
--- a/src/web/pages/reports/deltadetailspage.jsx
+++ b/src/web/pages/reports/deltadetailspage.jsx
@@ -6,6 +6,7 @@
import React from 'react';
import {connect} from 'react-redux';
+import {withRouter} from 'web/utils/withRouter';
import _ from 'gmp/locale';
diff --git a/src/web/routes.jsx b/src/web/routes.jsx
index 7e52638fb2..b12ae1e86e 100644
--- a/src/web/routes.jsx
+++ b/src/web/routes.jsx
@@ -117,7 +117,7 @@ const LoggedInRoutes = () => {
- } />
+ } />
} />
} />
} />
From a6b95068e5d2e1a586cc6a5082018c56f76d7d21 Mon Sep 17 00:00:00 2001
From: daniele-mng
Date: Tue, 24 Sep 2024 10:52:40 +0200
Subject: [PATCH 128/130] fix tests
---
src/web/components/icon/svgicon.jsx | 2 +-
src/web/entities/filterprovider.jsx | 2 +-
src/web/pages/login/__tests__/loginpage.jsx | 2 +-
.../__tests__/auditdeltadetailspage.jsx | 18 -------
src/web/pages/tasks/__tests__/detailspage.jsx | 49 ++++++++++---------
src/web/pages/tasks/detailspage.jsx | 1 -
6 files changed, 28 insertions(+), 46 deletions(-)
diff --git a/src/web/components/icon/svgicon.jsx b/src/web/components/icon/svgicon.jsx
index 85be214403..f115512e92 100644
--- a/src/web/components/icon/svgicon.jsx
+++ b/src/web/components/icon/svgicon.jsx
@@ -144,7 +144,7 @@ const SvgIcon = ({
SvgIcon.propTypes = {
children: PropTypes.func.isRequired,
- color: PropTypes.string.isRequired,
+ color: PropTypes.string,
active: PropTypes.bool,
disabled: PropTypes.bool,
loadingTitle: PropTypes.string,
diff --git a/src/web/entities/filterprovider.jsx b/src/web/entities/filterprovider.jsx
index 786e38cce2..13a80ccacb 100644
--- a/src/web/entities/filterprovider.jsx
+++ b/src/web/entities/filterprovider.jsx
@@ -17,7 +17,7 @@ const FilterProvider = ({
pageName = gmpname,
locationQuery = {},
}) => {
- const [returnedFilter, isLoadingFilter] = usePageFilter(pageName, {
+ const [returnedFilter, isLoadingFilter] = usePageFilter(pageName, gmpname, {
fallbackFilter,
locationQueryFilterString: locationQuery?.filter,
});
diff --git a/src/web/pages/login/__tests__/loginpage.jsx b/src/web/pages/login/__tests__/loginpage.jsx
index 6871cdfbe0..63e0de7034 100644
--- a/src/web/pages/login/__tests__/loginpage.jsx
+++ b/src/web/pages/login/__tests__/loginpage.jsx
@@ -159,6 +159,6 @@ describe('LoginPage tests', () => {
render( );
- expect(window.location.pathname).toMatch(/^\/dashboard$/);
+ expect(window.location.pathname).toMatch(/^\/dashboards$/);
});
});
diff --git a/src/web/pages/reports/__tests__/auditdeltadetailspage.jsx b/src/web/pages/reports/__tests__/auditdeltadetailspage.jsx
index bd7e7e2a34..930e662021 100644
--- a/src/web/pages/reports/__tests__/auditdeltadetailspage.jsx
+++ b/src/web/pages/reports/__tests__/auditdeltadetailspage.jsx
@@ -145,15 +145,6 @@ describe('Audit Detla Report Details Content tests', () => {
const input = within(select).getByTitle('Loaded filter');
expect(input).toHaveValue('foo');
- const selects = getAllByTestId('select-selected-value');
-
- // Toolbar Icons
- expect(icons.length).toEqual(14);
-
- // Powerfilter
- expect(inputs[0]).toHaveAttribute('name', 'userFilterString');
- expect(selects[0]).toHaveAttribute('title', 'Loaded filter');
- expect(selects[0]).toHaveTextContent('foo');
// Header
expect(baseElement).toHaveTextContent(
@@ -334,15 +325,6 @@ describe('Audit Detla Report Details Content tests', () => {
// Powerfilter
expect(inputs[0]).toHaveAttribute('name', 'userFilterString');
- const selects = getAllByTestId('select-selected-value');
-
- // Toolbar Icons
- expect(icons.length).toEqual(24);
-
- // Powerfilter
- expect(inputs[0]).toHaveAttribute('name', 'userFilterString');
- expect(selects[0]).toHaveAttribute('title', 'Loaded filter');
- expect(selects[0]).toHaveTextContent('--');
// Header
expect(baseElement).toHaveTextContent(
diff --git a/src/web/pages/tasks/__tests__/detailspage.jsx b/src/web/pages/tasks/__tests__/detailspage.jsx
index b8db4497d3..ad5f4d31df 100644
--- a/src/web/pages/tasks/__tests__/detailspage.jsx
+++ b/src/web/pages/tasks/__tests__/detailspage.jsx
@@ -697,17 +697,18 @@ describe('Task ToolBarIcons tests', () => {
);
const icons = getAllByTestId('svg-icon');
+
const badgeIcons = getAllByTestId('badge-icon');
const links = baseElement.querySelectorAll('a');
const divs = baseElement.querySelectorAll('div');
- fireEvent.click(divs[9]);
+ fireEvent.click(divs[8]);
expect(handleTaskCreate).toHaveBeenCalled();
- expect(divs[9]).toHaveTextContent('New Task');
+ expect(divs[8]).toHaveTextContent('New Task');
- fireEvent.click(divs[10]);
+ fireEvent.click(divs[9]);
expect(handleContainerTaskCreate).toHaveBeenCalled();
- expect(divs[10]).toHaveTextContent('New Container Task');
+ expect(divs[9]).toHaveTextContent('New Container Task');
fireEvent.click(icons[3]);
expect(handleTaskClone).toHaveBeenCalledWith(task3);
@@ -797,13 +798,13 @@ describe('Task ToolBarIcons tests', () => {
const links = baseElement.querySelectorAll('a');
const divs = baseElement.querySelectorAll('div');
- fireEvent.click(divs[9]);
+ fireEvent.click(divs[8]);
expect(handleTaskCreate).toHaveBeenCalled();
- expect(divs[9]).toHaveTextContent('New Task');
+ expect(divs[8]).toHaveTextContent('New Task');
- fireEvent.click(divs[10]);
+ fireEvent.click(divs[9]);
expect(handleContainerTaskCreate).toHaveBeenCalled();
- expect(divs[10]).toHaveTextContent('New Container Task');
+ expect(divs[9]).toHaveTextContent('New Container Task');
fireEvent.click(icons[3]);
expect(handleTaskClone).toHaveBeenCalledWith(task4);
@@ -900,13 +901,13 @@ describe('Task ToolBarIcons tests', () => {
const links = baseElement.querySelectorAll('a');
const divs = baseElement.querySelectorAll('div');
- fireEvent.click(divs[9]);
+ fireEvent.click(divs[8]);
expect(handleTaskCreate).toHaveBeenCalled();
- expect(divs[9]).toHaveTextContent('New Task');
+ expect(divs[8]).toHaveTextContent('New Task');
- fireEvent.click(divs[10]);
+ fireEvent.click(divs[9]);
expect(handleContainerTaskCreate).toHaveBeenCalled();
- expect(divs[10]).toHaveTextContent('New Container Task');
+ expect(divs[9]).toHaveTextContent('New Container Task');
fireEvent.click(icons[3]);
expect(handleTaskClone).toHaveBeenCalledWith(task5);
@@ -1004,13 +1005,13 @@ describe('Task ToolBarIcons tests', () => {
const links = baseElement.querySelectorAll('a');
const divs = baseElement.querySelectorAll('div');
- fireEvent.click(divs[9]);
+ fireEvent.click(divs[8]);
expect(handleTaskCreate).toHaveBeenCalled();
- expect(divs[9]).toHaveTextContent('New Task');
+ expect(divs[8]).toHaveTextContent('New Task');
- fireEvent.click(divs[10]);
+ fireEvent.click(divs[9]);
expect(handleContainerTaskCreate).toHaveBeenCalled();
- expect(divs[10]).toHaveTextContent('New Container Task');
+ expect(divs[9]).toHaveTextContent('New Container Task');
fireEvent.click(icons[3]);
expect(handleTaskClone).toHaveBeenCalledWith(task2);
@@ -1106,13 +1107,13 @@ describe('Task ToolBarIcons tests', () => {
const links = baseElement.querySelectorAll('a');
const divs = baseElement.querySelectorAll('div');
- fireEvent.click(divs[9]);
+ fireEvent.click(divs[8]);
expect(handleTaskCreate).toHaveBeenCalled();
- expect(divs[9]).toHaveTextContent('New Task');
+ expect(divs[8]).toHaveTextContent('New Task');
- fireEvent.click(divs[10]);
+ fireEvent.click(divs[9]);
expect(handleContainerTaskCreate).toHaveBeenCalled();
- expect(divs[10]).toHaveTextContent('New Container Task');
+ expect(divs[9]).toHaveTextContent('New Container Task');
fireEvent.click(icons[3]);
expect(handleTaskClone).toHaveBeenCalledWith(task6);
@@ -1271,13 +1272,13 @@ describe('Task ToolBarIcons tests', () => {
const links = baseElement.querySelectorAll('a');
const divs = baseElement.querySelectorAll('div');
- fireEvent.click(divs[9]);
+ fireEvent.click(divs[8]);
expect(handleTaskCreate).toHaveBeenCalled();
- expect(divs[9]).toHaveTextContent('New Task');
+ expect(divs[8]).toHaveTextContent('New Task');
- fireEvent.click(divs[10]);
+ fireEvent.click(divs[9]);
expect(handleContainerTaskCreate).toHaveBeenCalled();
- expect(divs[10]).toHaveTextContent('New Container Task');
+ expect(divs[9]).toHaveTextContent('New Container Task');
fireEvent.click(icons[3]);
expect(handleTaskClone).toHaveBeenCalledWith(task8);
diff --git a/src/web/pages/tasks/detailspage.jsx b/src/web/pages/tasks/detailspage.jsx
index ef6587ef32..5fe2c78b47 100644
--- a/src/web/pages/tasks/detailspage.jsx
+++ b/src/web/pages/tasks/detailspage.jsx
@@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
import _ from 'gmp/locale';
From 89efc2975151dfe6b7b462f6d811871a8cccf2dd Mon Sep 17 00:00:00 2001
From: daniele-mng
Date: Tue, 24 Sep 2024 14:05:55 +0200
Subject: [PATCH 129/130] fix audit components and tests
---
src/web/components/form/textarea.jsx | 1 +
.../label/__tests__/severityclass.jsx | 2 +-
src/web/components/label/compliancestate.jsx | 35 ++++++++++------
src/web/components/label/severityclass.jsx | 35 +++++++++++++---
.../powerfilter/compliancelevelsgroup.jsx | 29 ++++++-------
.../powerfilter/severitylevelsgroup.jsx | 5 ++-
.../reports/__tests__/auditfilterdialog.jsx | 21 +++++++++-
.../reports/__tests__/detailsfilterdialog.jsx | 42 +++++++++++++++++--
8 files changed, 129 insertions(+), 41 deletions(-)
diff --git a/src/web/components/form/textarea.jsx b/src/web/components/form/textarea.jsx
index 38d88b9a80..de3710689a 100644
--- a/src/web/components/form/textarea.jsx
+++ b/src/web/components/form/textarea.jsx
@@ -49,6 +49,7 @@ TextArea.propTypes = {
disabled: PropTypes.bool,
errorContent: PropTypes.toString,
minRows: PropTypes.numberOrNumberString,
+ maxRows: PropTypes.numberOrNumberString,
name: PropTypes.string,
placeholder: PropTypes.string,
title: PropTypes.string,
diff --git a/src/web/components/label/__tests__/severityclass.jsx b/src/web/components/label/__tests__/severityclass.jsx
index 5a020bcf58..45c1248449 100644
--- a/src/web/components/label/__tests__/severityclass.jsx
+++ b/src/web/components/label/__tests__/severityclass.jsx
@@ -13,7 +13,7 @@ describe('SeverityClassLabel tests', () => {
test('should render', () => {
const {element} = render( );
- expect(element).toMatchSnapshot();
+ expect(element).toBeVisible();
});
test('should render HighLabel', () => {
diff --git a/src/web/components/label/compliancestate.jsx b/src/web/components/label/compliancestate.jsx
index 065d371f13..ac97b3b575 100644
--- a/src/web/components/label/compliancestate.jsx
+++ b/src/web/components/label/compliancestate.jsx
@@ -25,14 +25,15 @@ const Label = styled.div`
const ComplianceLabel = ({text, color, ...props}) => {
const [_] = useTranslation();
return (
-
- {_(text)}
-
- )
+
+ {_(text)}
+
+ );
};
ComplianceLabel.propTypes = {
@@ -40,10 +41,18 @@ ComplianceLabel.propTypes = {
color: PropTypes.string,
};
-const YesLabel = props => ;
-const NoLabel = props => ;
-const IncompleteLabel = props => ;
-const UndefinedLabel = props => ;
+const YesLabel = props => (
+
+);
+const NoLabel = props => (
+
+);
+const IncompleteLabel = props => (
+
+);
+const UndefinedLabel = props => (
+
+);
export const ComplianceStateLabels = {
Yes: YesLabel,
@@ -52,4 +61,4 @@ export const ComplianceStateLabels = {
Undefined: UndefinedLabel,
};
-export default ComplianceStateLabels;
\ No newline at end of file
+export default ComplianceStateLabels;
diff --git a/src/web/components/label/severityclass.jsx b/src/web/components/label/severityclass.jsx
index 094c4bcdf6..1759509620 100644
--- a/src/web/components/label/severityclass.jsx
+++ b/src/web/components/label/severityclass.jsx
@@ -29,7 +29,12 @@ const Label = styledExcludeProps(styled.div, [
const HighLabel = props => {
return (
-
+
{_('High')}
);
@@ -37,7 +42,12 @@ const HighLabel = props => {
const MediumLabel = props => {
return (
-
+
{_('Medium')}
);
@@ -45,7 +55,12 @@ const MediumLabel = props => {
const LowLabel = props => {
return (
-
+
{_('Low')}
);
@@ -53,7 +68,12 @@ const LowLabel = props => {
const LogLabel = props => {
return (
-
+
{_('Log')}
);
@@ -61,7 +81,12 @@ const LogLabel = props => {
const FalsePositiveLabel = props => {
return (
-
+
{_('False Pos.')}
);
diff --git a/src/web/components/powerfilter/compliancelevelsgroup.jsx b/src/web/components/powerfilter/compliancelevelsgroup.jsx
index 272b4882d6..6dde65d727 100644
--- a/src/web/components/powerfilter/compliancelevelsgroup.jsx
+++ b/src/web/components/powerfilter/compliancelevelsgroup.jsx
@@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
import React from 'react';
import useTranslation from 'web/hooks/useTranslation';
@@ -26,7 +25,6 @@ const ComplianceLevelsFilterGroup = ({
isResult = false,
}) => {
const [_] = useTranslation();
-
const handleComplianceChange = (value, level) => {
const filterName = isResult
? 'compliance_levels'
@@ -60,36 +58,35 @@ const ComplianceLevelsFilterGroup = ({
complianceLevels = '';
}
return (
-
+
-
-
+ />
+
-
-
+ />
+
-
-
+ />
+
-
-
+ />
+
);
@@ -102,4 +99,4 @@ ComplianceLevelsFilterGroup.propTypes = {
onRemove: PropTypes.func.isRequired,
};
-export default ComplianceLevelsFilterGroup;
\ No newline at end of file
+export default ComplianceLevelsFilterGroup;
diff --git a/src/web/components/powerfilter/severitylevelsgroup.jsx b/src/web/components/powerfilter/severitylevelsgroup.jsx
index aae6ebeead..1d2a43d254 100644
--- a/src/web/components/powerfilter/severitylevelsgroup.jsx
+++ b/src/web/components/powerfilter/severitylevelsgroup.jsx
@@ -51,7 +51,10 @@ const SeverityLevelsFilterGroup = ({filter, onChange, onRemove}) => {
levels = '';
}
return (
-
+
{
capabilities: caps,
});
- const {baseElement, getByLabelText} = render(
+ const {baseElement, getByLabelText, getByTestId} = render(
{
expect(formGroups[0]).toHaveTextContent('Filter');
expect(formGroups[1]).toHaveTextContent('Compliance');
+
+ const filterGroup = getByTestId('compliance-levels-filter-group');
+ const {queryByTestId, queryAllByRole} = within(filterGroup);
+
+ const yesCheckbox = queryByTestId('compliance-state-Yes');
+ const noCheckbox = queryByTestId('compliance-state-No');
+ const incompleteCheckbox = queryByTestId('compliance-state-Incomplete');
+ const undefinedCheckbox = queryByTestId('compliance-state-Undefined');
+
+ expect(yesCheckbox).toHaveTextContent('Yes');
+ expect(noCheckbox).toHaveTextContent('No');
+ expect(incompleteCheckbox).toHaveTextContent('Incomplete');
+ expect(undefinedCheckbox).toHaveTextContent('Undefined');
+
+ const checkboxes = queryAllByRole('checkbox');
+ expect(checkboxes).toHaveLength(4);
+
expect(formGroups[2]).toHaveTextContent('QoD');
expect(formGroups[3]).toHaveTextContent('From Task (name)');
expect(formGroups[4]).toHaveTextContent('First result');
diff --git a/src/web/pages/reports/__tests__/detailsfilterdialog.jsx b/src/web/pages/reports/__tests__/detailsfilterdialog.jsx
index 38467f8ae9..df2a228fd2 100644
--- a/src/web/pages/reports/__tests__/detailsfilterdialog.jsx
+++ b/src/web/pages/reports/__tests__/detailsfilterdialog.jsx
@@ -10,7 +10,7 @@ import Capabilities from 'gmp/capabilities/capabilities';
import Filter from 'gmp/models/filter';
-import {rendererWith} from 'web/utils/testing';
+import {rendererWith, within} from 'web/utils/testing';
import FilterDialog from 'web/pages/reports/detailsfilterdialog';
@@ -37,7 +37,7 @@ describe('Details Filter Dialog for Audit report', () => {
capabilities: caps,
});
- const {baseElement, getByText, getByLabelText} = render(
+ const {baseElement, getByText, getByLabelText, getByTestId} = render(
{
expect(formGroups[0]).toHaveTextContent('Filter');
expect(formGroups[1]).toHaveTextContent('QoD');
expect(formGroups[2]).toHaveTextContent('Compliance');
+
+ const filterGroup = getByTestId('compliance-levels-filter-group');
+ const {queryAllByRole} = within(filterGroup);
+
+ const yesCheckbox = getByTestId('compliance-state-Yes');
+ const noCheckbox = getByTestId('compliance-state-No');
+ const incompleteCheckbox = getByTestId('compliance-state-Incomplete');
+ const undefinedCheckbox = getByTestId('compliance-state-Undefined');
+
+ expect(yesCheckbox).toHaveTextContent('Yes');
+ expect(noCheckbox).toHaveTextContent('No');
+ expect(incompleteCheckbox).toHaveTextContent('Incomplete');
+ expect(undefinedCheckbox).toHaveTextContent('Undefined');
+
+ const checkboxes = queryAllByRole('checkbox');
+ expect(checkboxes).toHaveLength(4);
expect(formGroups[3]).toHaveTextContent('Solution Type');
expect(formGroups[4]).toHaveTextContent('Vulnerability');
expect(formGroups[5]).toHaveTextContent('Host (IP)');
@@ -94,7 +110,7 @@ describe('Details Filter Dialog for Audit report', () => {
capabilities: caps,
});
- const {getByText, baseElement, getByLabelText} = render(
+ const {getByText, baseElement, getByLabelText, getByTestId} = render(
{
expect(formGroups[1]).toHaveTextContent('Apply Overrides');
expect(formGroups[2]).toHaveTextContent('QoD');
expect(formGroups[3]).toHaveTextContent('Severity (Class)');
+
+ const filterGroup = getByTestId('severity-levels-filter-group');
+
+ const {queryAllByRole} = within(filterGroup);
+
+ const highCheckbox = getByTestId('severity-class-High');
+ const mediumCheckbox = getByTestId('severity-class-Medium');
+ const lowCheckbox = getByTestId('severity-class-Low');
+ const logCheckbox = getByTestId('severity-class-Log');
+ const falsePositiveCheckbox = getByTestId('severity-class-False-Positive');
+
+ expect(highCheckbox).toHaveTextContent('High');
+ expect(mediumCheckbox).toHaveTextContent('Medium');
+ expect(lowCheckbox).toHaveTextContent('Low');
+ expect(logCheckbox).toHaveTextContent('Log');
+ expect(falsePositiveCheckbox).toHaveTextContent('False Pos.');
+
+ const checkboxes = queryAllByRole('checkbox');
+ expect(checkboxes).toHaveLength(5);
+
expect(formGroups[4]).toHaveTextContent('Severity');
expect(formGroups[5]).toHaveTextContent('Solution Type');
expect(formGroups[6]).toHaveTextContent('Vulnerability');
From 3e4c81e5ef6ac8f6f32da532cd4a4916e637a58f Mon Sep 17 00:00:00 2001
From: daniele-mng
Date: Tue, 24 Sep 2024 16:41:31 +0200
Subject: [PATCH 130/130] address comments
---
src/web/pages/alerts/scpmethodpart.jsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/web/pages/alerts/scpmethodpart.jsx b/src/web/pages/alerts/scpmethodpart.jsx
index 92b4063de7..1ca328b9b3 100644
--- a/src/web/pages/alerts/scpmethodpart.jsx
+++ b/src/web/pages/alerts/scpmethodpart.jsx
@@ -137,7 +137,7 @@ const ScpMethodPart = ({
{capabilities.mayOp('get_report_configs') && (
<>
- Report Config {' '}
+ Report Config