@cryptotaxi247 / CoPilot / commits / c944e477

Delete multiple alerts (#342)

* feat: Add endpoint to delete multiple alerts with response model * feat: Implement delete alerts endpoint with request model * CATO Networks Dashboard * feat: Add initial markdown documentation for CATO integration * feat: Add CATO integration details to available integrations and auth keys * feat: Add provision request and response models for Cato integration * feat: Add Cato integration router and provision endpoint * feat: Add Cato integration router and empty module files * feat: Enhance Cato integration with improved logging and data handling * feat: Remove redundant logging statements in Cato integration routes * feat: Add Cato integration collect function and service module * feat: Update Docker workflow to target delete-multiple-alerts branch and comment out Discord notifications * back to main * push latest * feat: Update Docker workflow to target main branch instead of delete-multiple-alerts * feat: Enhance delete_case function to remove associated CaseDataStore entries * refactor: improve auth handler * refactor: lint * chore: update dependencies in frontend * feat: Add support for loading IoCs in case retrieval functions * feat: Implement case notification creation and handling for customer notifications * refactor: login page route * feat: add case notification button * feat: add cato provision * refactor: embedded cards * feat: multiple alert deletion * refactor: lint * chore: update dependencies in frontend * feat: add VirusTotal API configuration to environment and database population * virustotal logo * verify virstotal connector * feat: add check all button * chore: update dependencies in frontend * precommit fixes --------- Co-authored-by: Davide Di Modica <webmaster.ddm@gmail.com>

taylor_socfortress committed Nov 27, 2024 at 12:56 UTC c944e477b77303f5f40a70336164625427cfc724
72 files changed +7285 -3149
.env.example
+4
@@ -58,3 +58,7 @@ GELF_INPUT_PORT=gelf_port
58 ALERT_CREATION_PROVISIONING_URL=http://127.1.1.1
59
60 HAPROXY_PROVISIONING_URL=http://127.1.1.1
61 +
62 +# VirusTotal
63 +VIRUSTOTAL_URL=https://www.virustotal.com/api/v3
64 +VIRUSTOTAL_API_KEY=REPLACE_ME
backend/app/connectors/grafana/dashboards/Cato/summary.json new
+2314
@@ -0,0 +1,2314 @@
1 +{
2 + "annotations": {
3 + "list": [
4 + {
5 + "builtIn": 1,
6 + "datasource": {
7 + "type": "grafana",
8 + "uid": "-- Grafana --"
9 + },
10 + "enable": true,
11 + "hide": true,
12 + "iconColor": "rgba(0, 211, 255, 1)",
13 + "name": "Annotations & Alerts",
14 + "target": {
15 + "limit": 100,
16 + "matchAny": false,
17 + "tags": [],
18 + "type": "dashboard"
19 + },
20 + "type": "dashboard"
21 + }
22 + ]
23 + },
24 + "description": "CATO NETWORKS - LOGS AND EVENTS",
25 + "editable": false,
26 + "fiscalYearStartMonth": 0,
27 + "graphTooltip": 0,
28 + "id": null,
29 + "links": [],
30 + "liveNow": false,
31 + "panels": [
32 + {
33 + "datasource": {
34 + "type": "grafana-opensearch-datasource",
35 + "uid": "replace_datasource_uid"
36 + },
37 + "fieldConfig": {
38 + "defaults": {
39 + "color": {
40 + "mode": "thresholds"
41 + },
42 + "mappings": [],
43 + "thresholds": {
44 + "mode": "absolute",
45 + "steps": [
46 + {
47 + "color": "orange",
48 + "value": null
49 + }
50 + ]
51 + },
52 + "unit": "short"
53 + },
54 + "overrides": []
55 + },
56 + "gridPos": {
57 + "h": 8,
58 + "w": 4,
59 + "x": 0,
60 + "y": 0
61 + },
62 + "id": 2,
63 + "options": {
64 + "colorMode": "value",
65 + "graphMode": "area",
66 + "justifyMode": "auto",
67 + "orientation": "auto",
68 + "reduceOptions": {
69 + "calcs": [
70 + "sum"
71 + ],
72 + "fields": "",
73 + "values": false
74 + },
75 + "textMode": "auto"
76 + },
77 + "pluginVersion": "10.2.0",
78 + "targets": [
79 + {
80 + "alias": "",
81 + "bucketAggs": [
82 + {
83 + "field": "timestamp",
84 + "id": "2",
85 + "settings": {
86 + "interval": "auto"
87 + },
88 + "type": "date_histogram"
89 + }
90 + ],
91 + "datasource": {
92 + "type": "grafana-opensearch-datasource",
93 + "uid": "replace_datasource_uid"
94 + },
95 + "metrics": [
96 + {
97 + "id": "1",
98 + "type": "count"
99 + }
100 + ],
101 + "query": "source:$firewall",
102 + "refId": "A",
103 + "timeField": "timestamp"
104 + }
105 + ],
106 + "title": "LOGS AND EVENTS",
107 + "type": "stat"
108 + },
109 + {
110 + "datasource": {
111 + "type": "grafana-opensearch-datasource",
112 + "uid": "replace_datasource_uid"
113 + },
114 + "fieldConfig": {
115 + "defaults": {
116 + "color": {
117 + "mode": "thresholds"
118 + },
119 + "mappings": [],
120 + "thresholds": {
121 + "mode": "absolute",
122 + "steps": [
123 + {
124 + "color": "blue",
125 + "value": null
126 + }
127 + ]
128 + },
129 + "unit": "short"
130 + },
131 + "overrides": []
132 + },
133 + "gridPos": {
134 + "h": 8,
135 + "w": 4,
136 + "x": 4,
137 + "y": 0
138 + },
139 + "id": 9,
140 + "options": {
141 + "colorMode": "value",
142 + "graphMode": "area",
143 + "justifyMode": "auto",
144 + "orientation": "auto",
145 + "reduceOptions": {
146 + "calcs": [
147 + "sum"
148 + ],
149 + "fields": "",
150 + "values": false
151 + },
152 + "textMode": "auto"
153 + },
154 + "pluginVersion": "10.2.0",
155 + "targets": [
156 + {
157 + "alias": "",
158 + "bucketAggs": [
159 + {
160 + "field": "timestamp",
161 + "id": "2",
162 + "settings": {
163 + "interval": "365d"
164 + },
165 + "type": "date_histogram"
166 + }
167 + ],
168 + "datasource": {
169 + "type": "grafana-opensearch-datasource",
170 + "uid": "replace_datasource_uid"
171 + },
172 + "metrics": [
173 + {
174 + "field": "source",
175 + "id": "1",
176 + "type": "cardinality"
177 + }
178 + ],
179 + "query": "source:$firewall",
180 + "refId": "A",
181 + "timeField": "timestamp"
182 + }
183 + ],
184 + "title": "LOGS AND EVENTS: FIREWALLS",
185 + "type": "stat"
186 + },
187 + {
188 + "datasource": {
189 + "type": "grafana-opensearch-datasource",
190 + "uid": "replace_datasource_uid"
191 + },
192 + "fieldConfig": {
193 + "defaults": {
194 + "color": {
195 + "mode": "palette-classic"
196 + },
197 + "custom": {
198 + "hideFrom": {
199 + "legend": false,
200 + "tooltip": false,
201 + "viz": false
202 + }
203 + },
204 + "mappings": []
205 + },
206 + "overrides": []
207 + },
208 + "gridPos": {
209 + "h": 8,
210 + "w": 5,
211 + "x": 8,
212 + "y": 0
213 + },
214 + "id": 4,
215 + "options": {
216 + "legend": {
217 + "displayMode": "list",
218 + "placement": "right",
219 + "showLegend": false
220 + },
221 + "pieType": "pie",
222 + "reduceOptions": {
223 + "calcs": [
224 + "sum"
225 + ],
226 + "fields": "",
227 + "values": false
228 + },
229 + "tooltip": {
230 + "mode": "single",
231 + "sort": "none"
232 + }
233 + },
234 + "targets": [
235 + {
236 + "alias": "",
237 + "bucketAggs": [
238 + {
239 + "field": "source",
240 + "id": "3",
241 + "settings": {
242 + "min_doc_count": "1",
243 + "order": "desc",
244 + "orderBy": "_count",
245 + "size": "15"
246 + },
247 + "type": "terms"
248 + },
249 + {
250 + "field": "timestamp",
251 + "id": "2",
252 + "settings": {
253 + "interval": "auto"
254 + },
255 + "type": "date_histogram"
256 + }
257 + ],
258 + "datasource": {
259 + "type": "grafana-opensearch-datasource",
260 + "uid": "replace_datasource_uid"
261 + },
262 + "metrics": [
263 + {
264 + "id": "1",
265 + "type": "count"
266 + }
267 + ],
268 + "query": "source:$firewall",
269 + "refId": "A",
270 + "timeField": "timestamp"
271 + }
272 + ],
273 + "title": "LOGS AND EVENTS BY FIREWALL",
274 + "type": "piechart"
275 + },
276 + {
277 + "datasource": {
278 + "type": "grafana-opensearch-datasource",
279 + "uid": "replace_datasource_uid"
280 + },
281 + "fieldConfig": {
282 + "defaults": {
283 + "color": {
284 + "mode": "thresholds"
285 + },
286 + "custom": {
287 + "align": "auto",
288 + "cellOptions": {
289 + "type": "auto"
290 + },
291 + "inspect": false
292 + },
293 + "mappings": [],
294 + "thresholds": {
295 + "mode": "absolute",
296 + "steps": [
297 + {
298 + "color": "green",
299 + "value": null
300 + },
301 + {
302 + "color": "red",
303 + "value": 80
304 + }
305 + ]
306 + }
307 + },
308 + "overrides": [
309 + {
310 + "matcher": {
311 + "id": "byName",
312 + "options": "source"
313 + },
314 + "properties": [
315 + {
316 + "id": "custom.width",
317 + "value": 473
318 + }
319 + ]
320 + }
321 + ]
322 + },
323 + "gridPos": {
324 + "h": 8,
325 + "w": 11,
326 + "x": 13,
327 + "y": 0
328 + },
329 + "id": 5,
330 + "options": {
331 + "cellHeight": "sm",
332 + "footer": {
333 + "countRows": false,
334 + "fields": "",
335 + "reducer": [
336 + "sum"
337 + ],
338 + "show": false
339 + },
340 + "showHeader": true,
341 + "sortBy": []
342 + },
343 + "pluginVersion": "10.2.0",
344 + "targets": [
345 + {
346 + "alias": "",
347 + "bucketAggs": [
348 + {
349 + "field": "source",
350 + "id": "3",
351 + "settings": {
352 + "min_doc_count": "1",
353 + "order": "desc",
354 + "orderBy": "_count",
355 + "size": "20"
356 + },
357 + "type": "terms"
358 + }
359 + ],
360 + "datasource": {
361 + "type": "grafana-opensearch-datasource",
362 + "uid": "replace_datasource_uid"
363 + },
364 + "metrics": [
365 + {
366 + "id": "1",
367 + "type": "count"
368 + }
369 + ],
370 + "query": "source:$firewall",
371 + "refId": "A",
372 + "timeField": "timestamp"
373 + }
374 + ],
375 + "title": "LOGS AND EVENTS BY FIREWALL",
376 + "transformations": [
377 + {
378 + "id": "organize",
379 + "options": {
380 + "excludeByName": {},
381 + "indexByName": {},
382 + "renameByName": {
383 + "source": "FIREWALL"
384 + }
385 + }
386 + }
387 + ],
388 + "transparent": true,
389 + "type": "table"
390 + },
391 + {
392 + "datasource": {
393 + "type": "grafana-opensearch-datasource",
394 + "uid": "replace_datasource_uid"
395 + },
396 + "fieldConfig": {
397 + "defaults": {
398 + "color": {
399 + "mode": "thresholds"
400 + },
401 + "custom": {
402 + "align": "auto",
403 + "cellOptions": {
404 + "type": "auto"
405 + },
406 + "inspect": false
407 + },
408 + "mappings": [],
409 + "thresholds": {
410 + "mode": "absolute",
411 + "steps": [
412 + {
413 + "color": "green",
414 + "value": null
415 + },
416 + {
417 + "color": "red",
418 + "value": 80
419 + }
420 + ]
421 + }
422 + },
423 + "overrides": [
424 + {
425 + "matcher": {
426 + "id": "byName",
427 + "options": "source"
428 + },
429 + "properties": [
430 + {
431 + "id": "custom.width",
432 + "value": 473
433 + }
434 + ]
435 + },
436 + {
437 + "matcher": {
438 + "id": "byName",
439 + "options": "categories"
440 + },
441 + "properties": [
442 + {
443 + "id": "custom.width",
444 + "value": 728
445 + }
446 + ]
447 + }
448 + ]
449 + },
450 + "gridPos": {
451 + "h": 11,
452 + "w": 9,
453 + "x": 0,
454 + "y": 8
455 + },
456 + "id": 18,
457 + "options": {
458 + "cellHeight": "sm",
459 + "footer": {
460 + "countRows": false,
461 + "fields": "",
462 + "reducer": [
463 + "sum"
464 + ],
465 + "show": false
466 + },
467 + "showHeader": true,
468 + "sortBy": []
469 + },
470 + "pluginVersion": "10.2.0",
471 + "targets": [
472 + {
473 + "alias": "",
474 + "bucketAggs": [
475 + {
476 + "field": "categories",
477 + "id": "3",
478 + "settings": {
479 + "min_doc_count": "1",
480 + "order": "desc",
481 + "orderBy": "_count",
482 + "size": "20"
483 + },
484 + "type": "terms"
485 + }
486 + ],
487 + "datasource": {
488 + "type": "grafana-opensearch-datasource",
489 + "uid": "replace_datasource_uid"
490 + },
491 + "metrics": [
492 + {
493 + "id": "1",
494 + "type": "count"
495 + }
496 + ],
497 + "query": "source:$firewall",
498 + "refId": "A",
499 + "timeField": "timestamp"
500 + }
501 + ],
502 + "title": "LOGS AND EVENTS BY APP CATEGORIES",
503 + "transformations": [
504 + {
505 + "id": "organize",
506 + "options": {
507 + "excludeByName": {},
508 + "indexByName": {},
509 + "renameByName": {
510 + "source": "FIREWALL"
511 + }
512 + }
513 + }
514 + ],
515 + "type": "table"
516 + },
517 + {
518 + "circleMaxSize": 30,
519 + "circleMinSize": 2,
520 + "colors": [
521 + "rgba(245, 54, 54, 0.9)",
522 + "rgba(237, 129, 40, 0.89)",
523 + "rgba(50, 172, 45, 0.97)"
524 + ],
525 + "datasource": {
526 + "type": "grafana-opensearch-datasource",
527 + "uid": "replace_datasource_uid"
528 + },
529 + "decimals": 0,
530 + "esMetric": "Count",
531 + "gridPos": {
532 + "h": 11,
533 + "w": 7,
534 + "x": 9,
535 + "y": 8
536 + },
537 + "hideEmpty": false,
538 + "hideZero": false,
539 + "id": 19,
540 + "initialZoom": 1,
541 + "locationData": "countries",
542 + "mapCenter": "(0°, 0°)",
543 + "mapCenterLatitude": 0,
544 + "mapCenterLongitude": 0,
545 + "maxDataPoints": 1,
546 + "mouseWheelZoom": false,
547 + "showLegend": true,
548 + "stickyLabels": false,
549 + "tableQueryOptions": {
550 + "geohashField": "geohash",
551 + "latitudeField": "latitude",
552 + "longitudeField": "longitude",
553 + "metricField": "metric",
554 + "queryType": "geohash"
555 + },
556 + "targets": [
557 + {
558 + "bucketAggs": [
559 + {
560 + "fake": true,
561 + "field": "dest_ip_country_code",
562 + "id": "3",
563 + "settings": {
564 + "min_doc_count": 1,
565 + "order": "desc",
566 + "orderBy": "_term",
567 + "size": "0"
568 + },
569 + "type": "terms"
570 + },
571 + {
572 + "field": "timestamp",
573 + "id": "2",
574 + "settings": {
575 + "interval": "auto",
576 + "min_doc_count": 0,
577 + "trimEdges": 0
578 + },
579 + "type": "date_histogram"
580 + }
581 + ],
582 + "datasource": {
583 + "type": "grafana-opensearch-datasource",
584 + "uid": "replace_datasource_uid"
585 + },
586 + "metrics": [
587 + {
588 + "field": "select field",
589 + "id": "1",
590 + "type": "count"
591 + }
592 + ],
593 + "query": "source:$firewall",
594 + "refId": "A",
595 + "timeField": "timestamp"
596 + }
597 + ],
598 + "thresholds": "0,10",
599 + "title": "DST GEOIP",
600 + "type": "grafana-worldmap-panel",
601 + "unitPlural": "",
602 + "unitSingle": "",
603 + "valueName": "total"
604 + },
605 + {
606 + "datasource": {
607 + "type": "grafana-opensearch-datasource",
608 + "uid": "replace_datasource_uid"
609 + },
610 + "fieldConfig": {
611 + "defaults": {
612 + "color": {
613 + "mode": "thresholds"
614 + },
615 + "custom": {
616 + "align": "auto",
617 + "cellOptions": {
618 + "type": "auto"
619 + },
620 + "inspect": false
621 + },
622 + "mappings": [],
623 + "thresholds": {
624 + "mode": "absolute",
625 + "steps": [
626 + {
627 + "color": "green",
628 + "value": null
629 + },
630 + {
631 + "color": "red",
632 + "value": 80
633 + }
634 + ]
635 + }
636 + },
637 + "overrides": [
638 + {
639 + "matcher": {
640 + "id": "byName",
641 + "options": "source"
642 + },
643 + "properties": [
644 + {
645 + "id": "custom.width",
646 + "value": 473
647 + }
648 + ]
649 + }
650 + ]
651 + },
652 + "gridPos": {
653 + "h": 11,
654 + "w": 8,
655 + "x": 16,
656 + "y": 8
657 + },
658 + "id": 20,
659 + "options": {
660 + "cellHeight": "sm",
661 + "footer": {
662 + "countRows": false,
663 + "fields": "",
664 + "reducer": [
665 + "sum"
666 + ],
667 + "show": false
668 + },
669 + "showHeader": true,
670 + "sortBy": []
671 + },
672 + "pluginVersion": "10.2.0",
673 + "targets": [
674 + {
675 + "alias": "",
676 + "bucketAggs": [
677 + {
678 + "field": "dest_ip_country_code",
679 + "id": "3",
680 + "settings": {
681 + "min_doc_count": "1",
682 + "order": "desc",
683 + "orderBy": "_count",
684 + "size": "20"
685 + },
686 + "type": "terms"
687 + },
688 + {
689 + "field": "action",
690 + "id": "4",
691 + "settings": {
692 + "min_doc_count": "1",
693 + "order": "desc",
694 + "orderBy": "_count",
695 + "size": "20"
696 + },
697 + "type": "terms"
698 + }
699 + ],
700 + "datasource": {
701 + "type": "grafana-opensearch-datasource",
702 + "uid": "replace_datasource_uid"
703 + },
704 + "metrics": [
705 + {
706 + "id": "1",
707 + "type": "count"
708 + }
709 + ],
710 + "query": "source:$firewall",
711 + "refId": "A",
712 + "timeField": "timestamp"
713 + }
714 + ],
715 + "title": "DST GeoIP AND ACTION",
716 + "transformations": [
717 + {
718 + "id": "organize",
719 + "options": {
720 + "excludeByName": {},
721 + "indexByName": {},
722 + "renameByName": {
723 + "source": "FIREWALL"
724 + }
725 + }
726 + }
727 + ],
728 + "transparent": true,
729 + "type": "table"
730 + },
731 + {
732 + "datasource": {
733 + "type": "grafana-opensearch-datasource",
734 + "uid": "replace_datasource_uid"
735 + },
736 + "fieldConfig": {
737 + "defaults": {
738 + "color": {
739 + "mode": "palette-classic"
740 + },
741 + "custom": {
742 + "hideFrom": {
743 + "legend": false,
744 + "tooltip": false,
745 + "viz": false
746 + }
747 + },
748 + "mappings": []
749 + },
750 + "overrides": []
751 + },
752 + "gridPos": {
753 + "h": 8,
754 + "w": 6,
755 + "x": 0,
756 + "y": 19
757 + },
758 + "id": 8,
759 + "options": {
760 + "legend": {
761 + "displayMode": "table",
762 + "placement": "right",
763 + "showLegend": true
764 + },
765 + "pieType": "donut",
766 + "reduceOptions": {
767 + "calcs": [
768 + "sum"
769 + ],
770 + "fields": "",
771 + "values": false
772 + },
773 + "tooltip": {
774 + "mode": "single",
775 + "sort": "none"
776 + }
777 + },
778 + "targets": [
779 + {
780 + "alias": "",
781 + "bucketAggs": [
782 + {
783 + "field": "event_type",
784 + "id": "3",
785 + "settings": {
786 + "min_doc_count": "1",
787 + "order": "desc",
788 + "orderBy": "_count",
789 + "size": "15"
790 + },
791 + "type": "terms"
792 + },
793 + {
794 + "field": "timestamp",
795 + "id": "2",
796 + "settings": {
797 + "interval": "auto"
798 + },
799 + "type": "date_histogram"
800 + }
801 + ],
802 + "datasource": {
803 + "type": "grafana-opensearch-datasource",
804 + "uid": "replace_datasource_uid"
805 + },
806 + "metrics": [
807 + {
808 + "id": "1",
809 + "type": "count"
810 + }
811 + ],
812 + "query": "source:$firewall",
813 + "refId": "A",
814 + "timeField": "timestamp"
815 + }
816 + ],
817 + "title": "LOGS AND EVENTS BY TYPE",
818 + "type": "piechart"
819 + },
820 + {
821 + "datasource": {
822 + "type": "grafana-opensearch-datasource",
823 + "uid": "replace_datasource_uid"
824 + },
825 + "fieldConfig": {
826 + "defaults": {
827 + "color": {
828 + "mode": "palette-classic"
829 + },
830 + "custom": {
831 + "axisBorderShow": false,
832 + "axisCenteredZero": false,
833 + "axisColorMode": "text",
834 + "axisLabel": "",
835 + "axisPlacement": "auto",
836 + "barAlignment": 0,
837 + "drawStyle": "bars",
838 + "fillOpacity": 0,
839 + "gradientMode": "none",
840 + "hideFrom": {
841 + "legend": false,
842 + "tooltip": false,
843 + "viz": false
844 + },
845 + "insertNulls": false,
846 + "lineInterpolation": "linear",
847 + "lineWidth": 1,
848 + "pointSize": 5,
849 + "scaleDistribution": {
850 + "type": "linear"
851 + },
852 + "showPoints": "auto",
853 + "spanNulls": false,
854 + "stacking": {
855 + "group": "A",
856 + "mode": "none"
857 + },
858 + "thresholdsStyle": {
859 + "mode": "off"
860 + }
861 + },
862 + "mappings": [],
863 + "thresholds": {
864 + "mode": "absolute",
865 + "steps": [
866 + {
867 + "color": "green",
868 + "value": null
869 + },
870 + {
871 + "color": "red",
872 + "value": 80
873 + }
874 + ]
875 + },
876 + "unit": "short"
877 + },
878 + "overrides": []
879 + },
880 + "gridPos": {
881 + "h": 16,
882 + "w": 18,
883 + "x": 6,
884 + "y": 19
885 + },
886 + "id": 7,
887 + "options": {
888 + "legend": {
889 + "calcs": [],
890 + "displayMode": "table",
891 + "placement": "right",
892 + "showLegend": true
893 + },
894 + "tooltip": {
895 + "mode": "single",
896 + "sort": "none"
897 + }
898 + },
899 + "pluginVersion": "8.5.1",
900 + "targets": [
901 + {
902 + "alias": "",
903 + "bucketAggs": [
904 + {
905 + "field": "source",
906 + "id": "3",
907 + "settings": {
908 + "min_doc_count": "1",
909 + "order": "desc",
910 + "orderBy": "_count",
911 + "size": "20"
912 + },
913 + "type": "terms"
914 + },
915 + {
916 + "field": "timestamp",
917 + "id": "4",
918 + "settings": {
919 + "interval": "5m",
920 + "min_doc_count": "1",
921 + "timeZone": "utc",
922 + "trimEdges": "0"
923 + },
924 + "type": "date_histogram"
925 + }
926 + ],
927 + "datasource": {
928 + "type": "grafana-opensearch-datasource",
929 + "uid": "replace_datasource_uid"
930 + },
931 + "metrics": [
932 + {
933 + "id": "1",
934 + "type": "count"
935 + }
936 + ],
937 + "query": "source:$firewall",
938 + "refId": "A",
939 + "timeField": "timestamp"
940 + }
941 + ],
942 + "title": "LOGS AND EVENTS BY FIREWALL - HISTOGRAM (TOP 20)",
943 + "type": "timeseries"
944 + },
945 + {
946 + "datasource": {
947 + "type": "grafana-opensearch-datasource",
948 + "uid": "replace_datasource_uid"
949 + },
950 + "fieldConfig": {
951 + "defaults": {
952 + "color": {
953 + "mode": "palette-classic"
954 + },
955 + "custom": {
956 + "hideFrom": {
957 + "legend": false,
958 + "tooltip": false,
959 + "viz": false
960 + }
961 + },
962 + "mappings": []
963 + },
964 + "overrides": [
965 + {
966 + "matcher": {
967 + "id": "byName",
968 + "options": "information"
969 + },
970 + "properties": [
971 + {
972 + "id": "color",
973 + "value": {
974 + "fixedColor": "blue",
975 + "mode": "fixed"
976 + }
977 + }
978 + ]
979 + },
980 + {
981 + "matcher": {
982 + "id": "byName",
983 + "options": "notice"
984 + },
985 + "properties": [
986 + {
987 + "id": "color",
988 + "value": {
989 + "fixedColor": "green",
990 + "mode": "fixed"
991 + }
992 + }
993 + ]
994 + },
995 + {
996 + "matcher": {
997 + "id": "byName",
998 + "options": "warning"
999 + },
1000 + "properties": [
1001 + {
1002 + "id": "color",
1003 + "value": {
1004 + "fixedColor": "orange",
1005 + "mode": "fixed"
1006 + }
1007 + }
1008 + ]
1009 + },
1010 + {
1011 + "matcher": {
1012 + "id": "byName",
1013 + "options": "error"
1014 + },
1015 + "properties": [
1016 + {
1017 + "id": "color",
1018 + "value": {
1019 + "fixedColor": "red",
1020 + "mode": "fixed"
1021 + }
1022 + }
1023 + ]
1024 + }
1025 + ]
1026 + },
1027 + "gridPos": {
1028 + "h": 8,
1029 + "w": 6,
1030 + "x": 0,
1031 + "y": 27
1032 + },
1033 + "id": 11,
1034 + "options": {
1035 + "legend": {
1036 + "displayMode": "table",
1037 + "placement": "right",
1038 + "showLegend": true
1039 + },
1040 + "pieType": "donut",
1041 + "reduceOptions": {
1042 + "calcs": [
1043 + "sum"
1044 + ],
1045 + "fields": "",
1046 + "values": false
1047 + },
1048 + "tooltip": {
1049 + "mode": "single",
1050 + "sort": "none"
1051 + }
1052 + },
1053 + "targets": [
1054 + {
1055 + "alias": "",
1056 + "bucketAggs": [
1057 + {
1058 + "field": "event_sub_type",
1059 + "id": "3",
1060 + "settings": {
1061 + "min_doc_count": "1",
1062 + "order": "desc",
1063 + "orderBy": "_count",
1064 + "size": "15"
1065 + },
1066 + "type": "terms"
1067 + },
1068 + {
1069 + "field": "timestamp",
1070 + "id": "2",
1071 + "settings": {
1072 + "interval": "auto"
1073 + },
1074 + "type": "date_histogram"
1075 + }
1076 + ],
1077 + "datasource": {
1078 + "type": "grafana-opensearch-datasource",
1079 + "uid": "replace_datasource_uid"
1080 + },
1081 + "metrics": [
1082 + {
1083 + "id": "1",
1084 + "type": "count"
1085 + }
1086 + ],
1087 + "query": "source:$firewall",
1088 + "refId": "A",
1089 + "timeField": "timestamp"
1090 + }
1091 + ],
1092 + "title": "LOGS AND EVENTS BY SUBTYPE",
1093 + "type": "piechart"
1094 + },
1095 + {
1096 + "datasource": {
1097 + "type": "grafana-opensearch-datasource",
1098 + "uid": "replace_datasource_uid"
1099 + },
1100 + "fieldConfig": {
1101 + "defaults": {
1102 + "color": {
1103 + "mode": "palette-classic"
1104 + },
1105 + "custom": {
1106 + "hideFrom": {
1107 + "legend": false,
1108 + "tooltip": false,
1109 + "viz": false
1110 + }
1111 + },
1112 + "mappings": []
1113 + },
1114 + "overrides": [
1115 + {
1116 + "matcher": {
1117 + "id": "byName",
1118 + "options": "information"
1119 + },
1120 + "properties": [
1121 + {
1122 + "id": "color",
1123 + "value": {
1124 + "fixedColor": "blue",
1125 + "mode": "fixed"
1126 + }
1127 + }
1128 + ]
1129 + },
1130 + {
1131 + "matcher": {
1132 + "id": "byName",
1133 + "options": "notice"
1134 + },
1135 + "properties": [
1136 + {
1137 + "id": "color",
1138 + "value": {
1139 + "fixedColor": "green",
1140 + "mode": "fixed"
1141 + }
1142 + }
1143 + ]
1144 + },
1145 + {
1146 + "matcher": {
1147 + "id": "byName",
1148 + "options": "warning"
1149 + },
1150 + "properties": [
1151 + {
1152 + "id": "color",
1153 + "value": {
1154 + "fixedColor": "orange",
1155 + "mode": "fixed"
1156 + }
1157 + }
1158 + ]
1159 + },
1160 + {
1161 + "matcher": {
1162 + "id": "byName",
1163 + "options": "alert"
1164 + },
1165 + "properties": [
1166 + {
1167 + "id": "color",
1168 + "value": {
1169 + "fixedColor": "red",
1170 + "mode": "fixed"
1171 + }
1172 + }
1173 + ]
1174 + },
1175 + {
1176 + "matcher": {
1177 + "id": "byName",
1178 + "options": "block-url"
1179 + },
1180 + "properties": [
1181 + {
1182 + "id": "color",
1183 + "value": {
1184 + "fixedColor": "orange",
1185 + "mode": "fixed"
1186 + }
1187 + }
1188 + ]
1189 + },
1190 + {
1191 + "matcher": {
1192 + "id": "byName",
1193 + "options": "passthrough"
1194 + },
1195 + "properties": [
1196 + {
1197 + "id": "color",
1198 + "value": {
1199 + "fixedColor": "green",
1200 + "mode": "fixed"
1201 + }
1202 + }
1203 + ]
1204 + },
1205 + {
1206 + "matcher": {
1207 + "id": "byName",
1208 + "options": "block"
1209 + },
1210 + "properties": [
1211 + {
1212 + "id": "color",
1213 + "value": {
1214 + "fixedColor": "red",
1215 + "mode": "fixed"
1216 + }
1217 + }
1218 + ]
1219 + },
1220 + {
1221 + "matcher": {
1222 + "id": "byName",
1223 + "options": "Block"
1224 + },
1225 + "properties": [
1226 + {
1227 + "id": "color",
1228 + "value": {
1229 + "fixedColor": "light-red",
1230 + "mode": "fixed"
1231 + }
1232 + }
1233 + ]
1234 + }
1235 + ]
1236 + },
1237 + "gridPos": {
1238 + "h": 8,
1239 + "w": 6,
1240 + "x": 0,
1241 + "y": 35
1242 + },
1243 + "id": 12,
1244 + "options": {
1245 + "legend": {
1246 + "displayMode": "table",
1247 + "placement": "right",
1248 + "showLegend": true
1249 + },
1250 + "pieType": "donut",
1251 + "reduceOptions": {
1252 + "calcs": [
1253 + "sum"
1254 + ],
1255 + "fields": "",
1256 + "values": false
1257 + },
1258 + "tooltip": {
1259 + "mode": "single",
1260 + "sort": "none"
1261 + }
1262 + },
1263 + "targets": [
1264 + {
1265 + "alias": "",
1266 + "bucketAggs": [
1267 + {
1268 + "field": "action",
1269 + "id": "3",
1270 + "settings": {
1271 + "min_doc_count": "1",
1272 + "order": "desc",
1273 + "orderBy": "_count",
1274 + "size": "15"
1275 + },
1276 + "type": "terms"
1277 + },
1278 + {
1279 + "field": "timestamp",
1280 + "id": "2",
1281 + "settings": {
1282 + "interval": "auto"
1283 + },
1284 + "type": "date_histogram"
1285 + }
1286 + ],
1287 + "datasource": {
1288 + "type": "grafana-opensearch-datasource",
1289 + "uid": "replace_datasource_uid"
1290 + },
1291 + "metrics": [
1292 + {
1293 + "id": "1",
1294 + "type": "count"
1295 + }
1296 + ],
1297 + "query": "source:$firewall",
1298 + "refId": "A",
1299 + "timeField": "timestamp"
1300 + }
1301 + ],
1302 + "title": "LOGS AND EVENTS BY ACTION",
1303 + "type": "piechart"
1304 + },
1305 + {
1306 + "datasource": {
1307 + "type": "grafana-opensearch-datasource",
1308 + "uid": "replace_datasource_uid"
1309 + },
1310 + "fieldConfig": {
1311 + "defaults": {
1312 + "color": {
1313 + "mode": "thresholds"
1314 + },
1315 + "custom": {
1316 + "align": "auto",
1317 + "cellOptions": {
1318 + "type": "auto"
1319 + },
1320 + "inspect": false
1321 + },
1322 + "mappings": [],
1323 + "thresholds": {
1324 + "mode": "absolute",
1325 + "steps": [
1326 + {
1327 + "color": "green",
1328 + "value": null
1329 + },
1330 + {
1331 + "color": "red",
1332 + "value": 80
1333 + }
1334 + ]
1335 + }
1336 + },
1337 + "overrides": [
1338 + {
1339 + "matcher": {
1340 + "id": "byName",
1341 + "options": "source"
1342 + },
1343 + "properties": [
1344 + {
1345 + "id": "custom.width",
1346 + "value": 317
1347 + }
1348 + ]
1349 + }
1350 + ]
1351 + },
1352 + "gridPos": {
1353 + "h": 8,
1354 + "w": 18,
1355 + "x": 6,
1356 + "y": 35
1357 + },
1358 + "id": 10,
1359 + "options": {
1360 + "cellHeight": "sm",
1361 + "footer": {
1362 + "countRows": false,
1363 + "fields": "",
1364 + "reducer": [
1365 + "sum"
1366 + ],
1367 + "show": false
1368 + },
1369 + "showHeader": true,
1370 + "sortBy": []
1371 + },
1372 + "pluginVersion": "10.2.0",
1373 + "targets": [
1374 + {
1375 + "alias": "",
1376 + "bucketAggs": [
1377 + {
1378 + "field": "source",
1379 + "id": "3",
1380 + "settings": {
1381 + "min_doc_count": "1",
1382 + "order": "desc",
1383 + "orderBy": "_count",
1384 + "size": "20"
1385 + },
1386 + "type": "terms"
1387 + },
1388 + {
1389 + "field": "action",
1390 + "id": "4",
1391 + "settings": {
1392 + "min_doc_count": "1",
1393 + "order": "desc",
1394 + "orderBy": "_count",
1395 + "size": "10"
1396 + },
1397 + "type": "terms"
1398 + }
1399 + ],
1400 + "datasource": {
1401 + "type": "grafana-opensearch-datasource",
1402 + "uid": "replace_datasource_uid"
1403 + },
1404 + "metrics": [
1405 + {
1406 + "id": "1",
1407 + "type": "count"
1408 + }
1409 + ],
1410 + "query": "source:$firewall",
1411 + "refId": "A",
1412 + "timeField": "timestamp"
1413 + }
1414 + ],
1415 + "title": "LOGS AND EVENTS BY FIREWALL AND ACTION",
1416 + "transformations": [
1417 + {
1418 + "id": "organize",
1419 + "options": {
1420 + "excludeByName": {},
1421 + "indexByName": {},
1422 + "renameByName": {
1423 + "action": "ACTION",
1424 + "source": "FIREWALL"
1425 + }
1426 + }
1427 + }
1428 + ],
1429 + "transparent": true,
1430 + "type": "table"
1431 + },
1432 + {
1433 + "datasource": {
1434 + "type": "grafana-opensearch-datasource",
1435 + "uid": "replace_datasource_uid"
1436 + },
1437 + "fieldConfig": {
1438 + "defaults": {
1439 + "color": {
1440 + "mode": "thresholds"
1441 + },
1442 + "mappings": [],
1443 + "thresholds": {
1444 + "mode": "absolute",
1445 + "steps": [
1446 + {
1447 + "color": "green",
1448 + "value": null
1449 + },
1450 + {
1451 + "color": "red",
1452 + "value": 80
1453 + }
1454 + ]
1455 + }
1456 + },
1457 + "overrides": []
1458 + },
1459 + "gridPos": {
1460 + "h": 9,
1461 + "w": 10,
1462 + "x": 0,
1463 + "y": 43
1464 + },
1465 + "id": 13,
1466 + "options": {
1467 + "displayMode": "gradient",
1468 + "minVizHeight": 10,
1469 + "minVizWidth": 0,
1470 + "namePlacement": "auto",
1471 + "orientation": "horizontal",
1472 + "reduceOptions": {
1473 + "calcs": [
1474 + "sum"
1475 + ],
1476 + "fields": "",
1477 + "values": false
1478 + },
1479 + "showUnfilled": true,
1480 + "valueMode": "color"
1481 + },
1482 + "pluginVersion": "10.2.0",
1483 + "targets": [
1484 + {
1485 + "alias": "",
1486 + "bucketAggs": [
1487 + {
1488 + "field": "application",
1489 + "id": "3",
1490 + "settings": {
1491 + "min_doc_count": "1",
1492 + "order": "desc",
1493 + "orderBy": "_count",
1494 + "size": "10"
1495 + },
1496 + "type": "terms"
1497 + },
1498 + {
1499 + "field": "timestamp",
1500 + "id": "4",
1501 + "settings": {
1502 + "interval": "auto",
1503 + "min_doc_count": "0",
1504 + "timeZone": "utc",
1505 + "trimEdges": "0"
1506 + },
1507 + "type": "date_histogram"
1508 + }
1509 + ],
1510 + "datasource": {
1511 + "type": "grafana-opensearch-datasource",
1512 + "uid": "replace_datasource_uid"
1513 + },
1514 + "metrics": [
1515 + {
1516 + "id": "1",
1517 + "type": "count"
1518 + }
1519 + ],
1520 + "query": "source:$firewall AND action:Block",
1521 + "refId": "A",
1522 + "timeField": "timestamp"
1523 + }
1524 + ],
1525 + "title": "APPs BLOCKED (TOP 10)",
1526 + "transformations": [
1527 + {
1528 + "id": "organize",
1529 + "options": {
1530 + "excludeByName": {},
1531 + "indexByName": {},
1532 + "renameByName": {
1533 + "msg": "INDICATOR"
1534 + }
1535 + }
1536 + }
1537 + ],
1538 + "transparent": true,
1539 + "type": "bargauge"
1540 + },
1541 + {
1542 + "datasource": {
1543 + "type": "grafana-opensearch-datasource",
1544 + "uid": "replace_datasource_uid"
1545 + },
1546 + "fieldConfig": {
1547 + "defaults": {
1548 + "color": {
1549 + "mode": "thresholds"
1550 + },
1551 + "custom": {
1552 + "align": "auto",
1553 + "cellOptions": {
1554 + "type": "auto"
1555 + },
1556 + "inspect": false
1557 + },
1558 + "mappings": [],
1559 + "thresholds": {
1560 + "mode": "absolute",
1561 + "steps": [
1562 + {
1563 + "color": "green",
1564 + "value": null
1565 + },
1566 + {
1567 + "color": "red",
1568 + "value": 80
1569 + }
1570 + ]
1571 + }
1572 + },
1573 + "overrides": [
1574 + {
1575 + "matcher": {
1576 + "id": "byName",
1577 + "options": "source"
1578 + },
1579 + "properties": [
1580 + {
1581 + "id": "custom.width",
1582 + "value": 473
1583 + }
1584 + ]
1585 + },
1586 + {
1587 + "matcher": {
1588 + "id": "byName",
1589 + "options": "catdesc"
1590 + },
1591 + "properties": [
1592 + {
1593 + "id": "custom.width",
1594 + "value": 400
1595 + }
1596 + ]
1597 + },
1598 + {
1599 + "matcher": {
1600 + "id": "byName",
1601 + "options": "URL CATEGORY"
1602 + },
1603 + "properties": [
1604 + {
1605 + "id": "custom.width",
1606 + "value": 372
1607 + }
1608 + ]
1609 + }
1610 + ]
1611 + },
1612 + "gridPos": {
1613 + "h": 9,
1614 + "w": 7,
1615 + "x": 10,
1616 + "y": 43
1617 + },
1618 + "id": 17,
1619 + "options": {
1620 + "cellHeight": "sm",
1621 + "footer": {
1622 + "countRows": false,
1623 + "fields": "",
1624 + "reducer": [
1625 + "sum"
1626 + ],
1627 + "show": false
1628 + },
1629 + "showHeader": true,
1630 + "sortBy": []
1631 + },
1632 + "pluginVersion": "10.2.0",
1633 + "targets": [
1634 + {
1635 + "alias": "",
1636 + "bucketAggs": [
1637 + {
1638 + "field": "categories",
1639 + "id": "3",
1640 + "settings": {
1641 + "min_doc_count": "1",
1642 + "order": "desc",
1643 + "orderBy": "_count",
1644 + "size": "20"
1645 + },
1646 + "type": "terms"
1647 + }
1648 + ],
1649 + "datasource": {
1650 + "type": "grafana-opensearch-datasource",
1651 + "uid": "replace_datasource_uid"
1652 + },
1653 + "metrics": [
1654 + {
1655 + "id": "1",
1656 + "type": "count"
1657 + }
1658 + ],
1659 + "query": "source:$firewall AND action:Block",
1660 + "refId": "A",
1661 + "timeField": "timestamp"
1662 + }
1663 + ],
1664 + "title": "APPs BLOCKED BY CATEGORY",
1665 + "transformations": [
1666 + {
1667 + "id": "organize",
1668 + "options": {
1669 + "excludeByName": {},
1670 + "indexByName": {},
1671 + "renameByName": {
1672 + "catdesc": "URL CATEGORY",
1673 + "msg": "INDICATOR",
1674 + "user": "USER ACCOUNT"
1675 + }
1676 + }
1677 + }
1678 + ],
1679 + "type": "table"
1680 + },
1681 + {
1682 + "datasource": {
1683 + "type": "grafana-opensearch-datasource",
1684 + "uid": "replace_datasource_uid"
1685 + },
1686 + "fieldConfig": {
1687 + "defaults": {
1688 + "color": {
1689 + "mode": "thresholds"
1690 + },
1691 + "custom": {
1692 + "align": "auto",
1693 + "cellOptions": {
1694 + "type": "auto"
1695 + },
1696 + "inspect": false
1697 + },
1698 + "mappings": [],
1699 + "thresholds": {
1700 + "mode": "absolute",
1701 + "steps": [
1702 + {
1703 + "color": "green",
1704 + "value": null
1705 + },
1706 + {
1707 + "color": "red",
1708 + "value": 80
1709 + }
1710 + ]
1711 + }
1712 + },
1713 + "overrides": [
1714 + {
1715 + "matcher": {
1716 + "id": "byName",
1717 + "options": "source"
1718 + },
1719 + "properties": [
1720 + {
1721 + "id": "custom.width",
1722 + "value": 473
1723 + }
1724 + ]
1725 + },
1726 + {
1727 + "matcher": {
1728 + "id": "byName",
1729 + "options": "USER ACCOUNT"
1730 + },
1731 + "properties": [
1732 + {
1733 + "id": "custom.width",
1734 + "value": 422
1735 + }
1736 + ]
1737 + }
1738 + ]
1739 + },
1740 + "gridPos": {
1741 + "h": 9,
1742 + "w": 7,
1743 + "x": 17,
1744 + "y": 43
1745 + },
1746 + "id": 14,
1747 + "options": {
1748 + "cellHeight": "sm",
1749 + "footer": {
1750 + "countRows": false,
1751 + "fields": "",
1752 + "reducer": [
1753 + "sum"
1754 + ],
1755 + "show": false
1756 + },
1757 + "showHeader": true,
1758 + "sortBy": []
1759 + },
1760 + "pluginVersion": "10.2.0",
1761 + "targets": [
1762 + {
1763 + "alias": "",
1764 + "bucketAggs": [
1765 + {
1766 + "field": "src_ip",
1767 + "id": "3",
1768 + "settings": {
1769 + "min_doc_count": "1",
1770 + "order": "desc",
1771 + "orderBy": "_count",
1772 + "size": "20"
1773 + },
1774 + "type": "terms"
1775 + }
1776 + ],
1777 + "datasource": {
1778 + "type": "grafana-opensearch-datasource",
1779 + "uid": "replace_datasource_uid"
1780 + },
1781 + "metrics": [
1782 + {
1783 + "id": "1",
1784 + "type": "count"
1785 + }
1786 + ],
1787 + "query": "source:$firewall AND action:Block",
1788 + "refId": "A",
1789 + "timeField": "timestamp"
1790 + }
1791 + ],
1792 + "title": "APPs BLOCKED BY SRC IP",
1793 + "transformations": [
1794 + {
1795 + "id": "organize",
1796 + "options": {
1797 + "excludeByName": {},
1798 + "indexByName": {},
1799 + "renameByName": {
1800 + "msg": "INDICATOR",
1801 + "user": "USER ACCOUNT"
1802 + }
1803 + }
1804 + }
1805 + ],
1806 + "transparent": true,
1807 + "type": "table"
1808 + },
1809 + {
1810 + "datasource": {
1811 + "type": "grafana-opensearch-datasource",
1812 + "uid": "replace_datasource_uid"
1813 + },
1814 + "fieldConfig": {
1815 + "defaults": {
1816 + "color": {
1817 + "mode": "thresholds"
1818 + },
1819 + "custom": {
1820 + "align": "auto",
1821 + "cellOptions": {
1822 + "type": "auto"
1823 + },
1824 + "filterable": true,
1825 + "inspect": false
1826 + },
1827 + "mappings": [],
1828 + "thresholds": {
1829 + "mode": "absolute",
1830 + "steps": [
1831 + {
1832 + "color": "green",
1833 + "value": null
1834 + },
1835 + {
1836 + "color": "red",
1837 + "value": 80
1838 + }
1839 + ]
1840 + }
1841 + },
1842 + "overrides": [
1843 + {
1844 + "matcher": {
1845 + "id": "byName",
1846 + "options": "FIREWALL"
1847 + },
1848 + "properties": [
1849 + {
1850 + "id": "custom.width",
1851 + "value": 126
1852 + }
1853 + ]
1854 + },
1855 + {
1856 + "matcher": {
1857 + "id": "byName",
1858 + "options": "ACTION"
1859 + },
1860 + "properties": [
1861 + {
1862 + "id": "custom.width",
1863 + "value": 81
1864 + }
1865 + ]
1866 + },
1867 + {
1868 + "matcher": {
1869 + "id": "byName",
1870 + "options": "SEVERITY"
1871 + },
1872 + "properties": [
1873 + {
1874 + "id": "custom.width",
1875 + "value": 109
1876 + },
1877 + {
1878 + "id": "custom.cellOptions",
1879 + "value": {
1880 + "type": "color-text"
1881 + }
1882 + },
1883 + {
1884 + "id": "mappings",
1885 + "value": [
1886 + {
1887 + "options": {
1888 + "alert": {
1889 + "color": "semi-dark-red",
1890 + "index": 5
1891 + },
1892 + "critical": {
1893 + "color": "dark-red",
1894 + "index": 4
1895 + },
1896 + "high": {
1897 + "color": "red",
1898 + "index": 3
1899 + },
1900 + "information": {
1901 + "color": "blue",
1902 + "index": 0
1903 + },
1904 + "notice": {
1905 + "color": "green",
1906 + "index": 1
1907 + },
1908 + "warning": {
1909 + "color": "orange",
1910 + "index": 2
1911 + }
1912 + },
1913 + "type": "value"
1914 + }
1915 + ]
1916 + }
1917 + ]
1918 + },
1919 + {
1920 + "matcher": {
1921 + "id": "byName",
1922 + "options": "SRC IP"
1923 + },
1924 + "properties": [
1925 + {
1926 + "id": "custom.width",
1927 + "value": 127
1928 + }
1929 + ]
1930 + },
1931 + {
1932 + "matcher": {
1933 + "id": "byName",
1934 + "options": "SRC PORT"
1935 + },
1936 + "properties": [
1937 + {
1938 + "id": "custom.width",
1939 + "value": 87
1940 + }
1941 + ]
1942 + },
1943 + {
1944 + "matcher": {
1945 + "id": "byName",
1946 + "options": "IF IN"
1947 + },
1948 + "properties": [
1949 + {
1950 + "id": "custom.width",
1951 + "value": 110
1952 + }
1953 + ]
1954 + },
1955 + {
1956 + "matcher": {
1957 + "id": "byName",
1958 + "options": "APP"
1959 + },
1960 + "properties": [
1961 + {
1962 + "id": "custom.width",
1963 + "value": 131
1964 + }
1965 + ]
1966 + },
1967 + {
1968 + "matcher": {
1969 + "id": "byName",
1970 + "options": "DST IP"
1971 + },
1972 + "properties": [
1973 + {
1974 + "id": "custom.width",
1975 + "value": 134
1976 + }
1977 + ]
1978 + },
1979 + {
1980 + "matcher": {
1981 + "id": "byName",
1982 + "options": "DST PORT"
1983 + },
1984 + "properties": [
1985 + {
1986 + "id": "custom.width",
1987 + "value": 93
1988 + }
1989 + ]
1990 + },
1991 + {
1992 + "matcher": {
1993 + "id": "byName",
1994 + "options": "EVENT ID"
1995 + },
1996 + "properties": [
1997 + {
1998 + "id": "links",
1999 + "value": [
2000 + {
2001 + "targetBlank": true,
2002 + "title": "EVENT DETAILS",
2003 + "url": "https://grafana.company.local/explore?left=%7B%22datasource%22:%22CATO NETWORKS%22,%22queries%22:%5B%7B%22refId%22:%22A%22,%22query%22:%22_id:${__value.text}%22,%22alias%22:%22%22,%22metrics%22:%5B%7B%22id%22:%221%22,%22type%22:%22logs%22,%22settings%22:%7B%22limit%22:%22500%22%7D%7D%5D,%22bucketAggs%22:%5B%5D,%22timeField%22:%22timestamp%22%7D%5D,%22range%22:%7B%22from%22:%22now-1h%22,%22to%22:%22now%22%7D%7D"
2004 + }
2005 + ]
2006 + },
2007 + {
2008 + "id": "custom.width",
2009 + "value": 214
2010 + }
2011 + ]
2012 + },
2013 + {
2014 + "matcher": {
2015 + "id": "byName",
2016 + "options": "SERVICE"
2017 + },
2018 + "properties": [
2019 + {
2020 + "id": "custom.width",
2021 + "value": 95
2022 + }
2023 + ]
2024 + },
2025 + {
2026 + "matcher": {
2027 + "id": "byName",
2028 + "options": "DATE/TIME"
2029 + },
2030 + "properties": [
2031 + {
2032 + "id": "custom.width",
2033 + "value": 188
2034 + }
2035 + ]
2036 + },
2037 + {
2038 + "matcher": {
2039 + "id": "byName",
2040 + "options": "PROFILE"
2041 + },
2042 + "properties": [
2043 + {
2044 + "id": "custom.width",
2045 + "value": 234
2046 + }
2047 + ]
2048 + }
2049 + ]
2050 + },
2051 + "gridPos": {
2052 + "h": 15,
2053 + "w": 24,
2054 + "x": 0,
2055 + "y": 52
2056 + },
2057 + "id": 16,
2058 + "options": {
2059 + "cellHeight": "sm",
2060 + "footer": {
2061 + "countRows": false,
2062 + "enablePagination": true,
2063 + "fields": "",
2064 + "reducer": [
2065 + "sum"
2066 + ],
2067 + "show": false
2068 + },
2069 + "showHeader": true,
2070 + "sortBy": []
2071 + },
2072 + "pluginVersion": "10.2.0",
2073 + "targets": [
2074 + {
2075 + "alias": "",
2076 + "bucketAggs": [],
2077 + "datasource": {
2078 + "type": "grafana-opensearch-datasource",
2079 + "uid": "replace_datasource_uid"
2080 + },
2081 + "metrics": [
2082 + {
2083 + "id": "1",
2084 + "settings": {
2085 + "size": "500"
2086 + },
2087 + "type": "raw_data"
2088 + }
2089 + ],
2090 + "query": "source:$firewall",
2091 + "refId": "A",
2092 + "timeField": "timestamp"
2093 + }
2094 + ],
2095 + "title": "FIREWALL EVENTS",
2096 + "transformations": [
2097 + {
2098 + "id": "filterFieldsByName",
2099 + "options": {
2100 + "include": {
2101 + "names": [
2102 + "ISP_name",
2103 + "application",
2104 + "categories",
2105 + "dest_ip",
2106 + "dest_ip_country_code",
2107 + "dest_port",
2108 + "domain_name",
2109 + "event_type",
2110 + "http_host_name",
2111 + "ip_protocol",
2112 + "os_type",
2113 + "pop_name",
2114 + "rule",
2115 + "src_ip",
2116 + "src_ip_country_code",
2117 + "src_site",
2118 + "subnet_name",
2119 + "_id",
2120 + "timestamp"
2121 + ]
2122 + }
2123 + }
2124 + },
2125 + {
2126 + "id": "organize",
2127 + "options": {
2128 + "excludeByName": {
2129 + "_index": true,
2130 + "_type": true,
2131 + "alert_category": true,
2132 + "alert_definitions_version": true,
2133 + "appid": true,
2134 + "applist": true,
2135 + "apprisk": true,
2136 + "authserver": true,
2137 + "cat": true,
2138 + "catdesc": true,
2139 + "craction": true,
2140 + "crlevel": true,
2141 + "crscore": true,
2142 + "devid": true,
2143 + "direction": true,
2144 + "dstintf": true,
2145 + "dstintfrole": true,
2146 + "dstip_city_name": true,
2147 + "dstip_country_code": true,
2148 + "dstip_geolocation": true,
2149 + "eventtype": true,
2150 + "facility": true,
2151 + "facility_num": true,
2152 + "gl2_accounted_message_size": true,
2153 + "gl2_message_id": true,
2154 + "gl2_remote_ip": true,
2155 + "gl2_remote_port": true,
2156 + "gl2_source_input": true,
2157 + "gl2_source_node": true,
2158 + "group": true,
2159 + "highlight": true,
2160 + "hostname": true,
2161 + "hostname_city_name": true,
2162 + "hostname_country_code": true,
2163 + "hostname_geolocation": true,
2164 + "level": true,
2165 + "logver": true,
2166 + "message": true,
2167 + "method": true,
2168 + "msg": true,
2169 + "policyid": true,
2170 + "proto": true,
2171 + "rcvdbyte": true,
2172 + "reqtype": true,
2173 + "sentbyte": true,
2174 + "sessionid": true,
2175 + "sort": true,
2176 + "source": true,
2177 + "srcintf": true,
2178 + "srcintfrole": true,
2179 + "srcip_city_name": true,
2180 + "srcip_country_code": true,
2181 + "srcip_geolocation": true,
2182 + "srcport": true,
2183 + "streams": true,
2184 + "subtype": true,
2185 + "syslog_type": true,
2186 + "type": true,
2187 + "user": true,
2188 + "vd": true
2189 + },
2190 + "indexByName": {
2191 + "ISP_name": 17,
2192 + "_id": 1,
2193 + "application": 11,
2194 + "categories": 12,
2195 + "dest_ip": 7,
2196 + "dest_ip_country_code": 8,
2197 + "dest_port": 10,
2198 + "domain_name": 13,
2199 + "event_type": 14,
2200 + "http_host_name": 15,
2201 + "ip_protocol": 9,
2202 + "os_type": 4,
2203 + "pop_name": 16,
2204 + "rule": 18,
2205 + "src_ip": 2,
2206 + "src_ip_country_code": 3,
2207 + "src_site": 6,
2208 + "subnet_name": 5,
2209 + "timestamp": 0
2210 + },
2211 + "renameByName": {
2212 + "ISP_name": "ISP",
2213 + "_id": "EVENT ID",
2214 + "action": "ACTION",
2215 + "alert_signature": "SIGNATURE",
2216 + "app": "APP",
2217 + "appcat": "CAT",
2218 + "application": "APP",
2219 + "categories": "CAT",
2220 + "dest_ip": "DST IP",
2221 + "dest_ip_country_code": "DST COUNTRY",
2222 + "dest_port": "DST PORT",
2223 + "destination_location_name": "LOCATION",
2224 + "domain_name": "DOMAIN",
2225 + "dstip": "DST IP",
2226 + "dstport": "DST PORT",
2227 + "event_log_name": "",
2228 + "event_type": "TYPE",
2229 + "http_host_name": "HTTP HOSTNAME",
2230 + "http_method": "METHOD",
2231 + "http_user_agent_name": "HTTP AGENT",
2232 + "ip_protocol": "PROTOCOL",
2233 + "network_interface_in": "IF IN",
2234 + "network_interface_out": "IF OUT",
2235 + "network_transport": "",
2236 + "os_type": "OS TYPE",
2237 + "pop_name": "POP",
2238 + "profile": "PROFILE",
2239 + "rule": "RULE",
2240 + "rule_name": "RULE",
2241 + "service": "SERVICE",
2242 + "source": "",
2243 + "source_port": "SRC PORT",
2244 + "src_ip": "SRC IP",
2245 + "src_ip_country_code": "SRC COUNTRY",
2246 + "src_site": "SITE",
2247 + "srcip": "SRC IP",
2248 + "subnet_name": "SUBNET",
2249 + "syslog_level": "SEVERITY",
2250 + "timestamp": "DATE/TIME",
2251 + "url": "URL"
2252 + }
2253 + }
2254 + }
2255 + ],
2256 + "transparent": true,
2257 + "type": "table"
2258 + }
2259 + ],
2260 + "refresh": "",
2261 + "schemaVersion": 38,
2262 + "tags": [
2263 + "CATO NETWORKS"
2264 + ],
2265 + "templating": {
2266 + "list": [
2267 + {
2268 + "datasource": {
2269 + "type": "grafana-opensearch-datasource",
2270 + "uid": "replace_datasource_uid"
2271 + },
2272 + "filters": [],
2273 + "hide": 0,
2274 + "label": "Filters",
2275 + "name": "Filters",
2276 + "skipUrlSync": false,
2277 + "type": "adhoc"
2278 + },
2279 + {
2280 + "current": {
2281 + "selected": false,
2282 + "text": "All",
2283 + "value": "$__all"
2284 + },
2285 + "datasource": {
2286 + "type": "grafana-opensearch-datasource",
2287 + "uid": "replace_datasource_uid"
2288 + },
2289 + "definition": "{ \"find\": \"terms\", \"field\": \"source\", \"query\": \"*\"}",
2290 + "description": "FIREWALL",
2291 + "hide": 0,
2292 + "includeAll": true,
2293 + "label": "Firewall",
2294 + "multi": false,
2295 + "name": "firewall",
2296 + "options": [],
2297 + "query": "{ \"find\": \"terms\", \"field\": \"source\", \"query\": \"*\"}",
2298 + "refresh": 1,
2299 + "regex": "",
2300 + "skipUrlSync": false,
2301 + "sort": 0,
2302 + "type": "query"
2303 + }
2304 + ]
2305 + },
2306 + "time": {
2307 + "from": "now-6h",
2308 + "to": "now"
2309 + },
2310 + "timepicker": {},
2311 + "timezone": "",
2312 + "title": "CATO NETWORKS - LOGS AND EVENTS",
2313 + "weekStart": ""
2314 +}
backend/app/connectors/grafana/schema/dashboards.py
+5
@@ -110,6 +110,10 @@ class BitdefenderDashboard(Enum):
110 BITDEFENDER_SUMMARY = ("Bitdefender", "summary.json")
111
112
113 +class CatoDashboard(Enum):
114 + CATO_SUMMARY = ("Cato", "summary.json")
115 +
116 +
117 class DashboardProvisionRequest(BaseModel):
118 dashboards: List[str] = Field(
119 ...,
@@ -144,6 +148,7 @@ class DashboardProvisionRequest(BaseModel):
148 + list(DuoDashboard)
149 + list(DarktraceDashboard)
150 + list(BitdefenderDashboard)
151 + + list(CatoDashboard)
152 }
153 if e not in valid_dashboards:
154 raise ValueError(f'Dashboard identifier "{e}" is not recognized.')
backend/app/connectors/grafana/services/dashboards.py
+2
@@ -6,6 +6,7 @@ from loguru import logger
6
7 from app.connectors.grafana.schema.dashboards import BitdefenderDashboard
8 from app.connectors.grafana.schema.dashboards import CarbonBlackDashboard
9 +from app.connectors.grafana.schema.dashboards import CatoDashboard
10 from app.connectors.grafana.schema.dashboards import CrowdstrikeDashboard
11 from app.connectors.grafana.schema.dashboards import DarktraceDashboard
12 from app.connectors.grafana.schema.dashboards import DashboardProvisionRequest
@@ -187,6 +188,7 @@ async def provision_dashboards(
188 + list(DuoDashboard)
189 + list(DarktraceDashboard)
190 + list(BitdefenderDashboard)
191 + + list(CatoDashboard)
192 }
193
194 for dashboard_name in dashboard_request.dashboards:
backend/app/connectors/services.py
+11
@@ -27,6 +27,7 @@ from app.connectors.wazuh_manager.utils.universal import verify_wazuh_manager_co
27 from app.integrations.utils.event_shipper import verify_event_shipper_connection
28 from app.utils import verify_alert_creation_provisioning_connection
29 from app.utils import verify_haproxy_provisioning_connection
30 +from app.utils import verify_virustotal_connection
31 from app.utils import verify_wazuh_worker_provisioning_connection
32
33 UPLOAD_FOLDER = "data"
@@ -169,6 +170,15 @@ class AlertCreationService(ConnectorServiceInterface):
170 )
171
172
173 +# Virustotal Service
174 +class VirustotalService(ConnectorServiceInterface):
175 + async def verify_authentication(
176 + self,
177 + connector: ConnectorResponse,
178 + ) -> Optional[ConnectorResponse]:
179 + return await verify_virustotal_connection(connector.connector_name)
180 +
181 +
182 # Factory function to create a service instance based on connector name
183 def get_connector_service(connector_name: str) -> Type[ConnectorServiceInterface]:
184 """
@@ -194,6 +204,7 @@ def get_connector_service(connector_name: str) -> Type[ConnectorServiceInterface
204 "HAProxy Provisioning": HAProxyProvisioningService,
205 "Event Shipper": EventShipperService,
206 "Alert Creation Provisioning": AlertCreationService,
207 + "VirusTotal": VirustotalService,
208 }
209 return service_map.get(connector_name, None)
210
backend/app/connectors/shuffle/services/integrations.py
+8 -4
@@ -31,7 +31,11 @@ async def execute_workflow(request: ExecuteWorkflowRequest) -> dict:
31 Returns:
32 dict: The response containing the execution ID.
33 """
34 - logger.info(f"Executing workflow: {request}")
35 - response = await send_post_request(f"/api/v1/workflows/{request.workflow_id}/execute", request.dict())
36 - logger.info(f"Response: {response}")
37 - return response
34 + logger.info(f"Executing workflow: {request.dict()}")
35 + try:
36 + response = await send_post_request(f"/api/v1/workflows/{request.workflow_id}/execute", request.dict())
37 + logger.info(f"Response: {response}")
38 + return response
39 + except Exception as e:
40 + logger.error(f"Error executing workflow: {e}")
41 + return {"error": str(e)}
backend/app/db/db_populate.py
+11
@@ -143,6 +143,12 @@ def get_connectors_list():
143 "SOCFortress: https://github.com/socfortress/Customer-Provisioning-Worker"
144 ),
145 ),
146 + (
147 + "VirusTotal",
148 + "3",
149 + "api_key",
150 + "Connection to VirusTotal. Make sure you have created an API key.",
151 + ),
152 # ... Add more connectors as needed ...
153 ]
154
@@ -323,6 +329,7 @@ def get_available_integrations_list():
329 ("DUO", "Integrate DUO with SOCFortress."),
330 ("Darktrace", "Integrate Darktrace with SOCFortress."),
331 ("BitDefender", "Integrate BitDefender with SOCFortress."),
332 + ("CATO", "Integrate CATO NETWORKS with SOCFortress."),
333 # ... Add more available integrations as needed ...
334 ]
335
@@ -457,6 +464,10 @@ async def get_available_integrations_auth_keys_list(session: AsyncSession):
464 ("BitDefender", "WEBSERVER_PORT"),
465 ("BitDefender", "GRAYLOG_PORT"),
466 ("BitDefender", "API_KEY"),
467 + ("CATO", "API_KEY"),
468 + ("CATO", "ACCOUNT_ID"),
469 + ("CATO", "EVENT_TYPES"),
470 + ("CATO", "EVENT_SUB_TYPES"),
471 # ... Add more available integrations auth keys as needed ...
472 ]
473 logger.info("Getting available integrations auth keys.")
backend/app/incidents/routes/db_operations.py
+82
@@ -52,6 +52,8 @@ from app.incidents.schema.db_operations import CaseAlertLinkResponse
52 from app.incidents.schema.db_operations import CaseCreate
53 from app.incidents.schema.db_operations import CaseCreateFromAlert
54 from app.incidents.schema.db_operations import CaseDataStoreResponse
55 +from app.incidents.schema.db_operations import CaseNotificationCreate
56 +from app.incidents.schema.db_operations import CaseNotificationResponse
57 from app.incidents.schema.db_operations import CaseOutResponse
58 from app.incidents.schema.db_operations import CaseReportTemplateDataStoreListResponse
59 from app.incidents.schema.db_operations import CaseReportTemplateDataStoreResponse
@@ -60,6 +62,8 @@ from app.incidents.schema.db_operations import CommentCreate
62 from app.incidents.schema.db_operations import CommentResponse
63 from app.incidents.schema.db_operations import ConfiguredSourcesResponse
64 from app.incidents.schema.db_operations import DefaultReportTemplateFileNames
65 +from app.incidents.schema.db_operations import DeleteAlertsRequest
66 +from app.incidents.schema.db_operations import DeleteAlertsResponse
67 from app.incidents.schema.db_operations import FieldAndAssetNames
68 from app.incidents.schema.db_operations import FieldAndAssetNamesResponse
69 from app.incidents.schema.db_operations import ListCaseDataStoreResponse
@@ -74,6 +78,8 @@ from app.incidents.schema.db_operations import SocfortressRecommendsWazuhRespons
78 from app.incidents.schema.db_operations import SocfortressRecommendsWazuhTimeFieldName
79 from app.incidents.schema.db_operations import UpdateAlertStatus
80 from app.incidents.schema.db_operations import UpdateCaseStatus
81 +from app.incidents.schema.incident_alert import CreatedAlertPayload
82 +from app.incidents.schema.incident_alert import CreatedCaseNotificationPayload
83 from app.incidents.services.db_operations import add_alert_title_name
84 from app.incidents.services.db_operations import add_asset_name
85 from app.incidents.services.db_operations import add_field_name
@@ -181,6 +187,7 @@ from app.incidents.services.db_operations import upload_file_to_case
187 from app.incidents.services.db_operations import upload_report_template
188 from app.incidents.services.db_operations import upload_report_template_to_data_store
189 from app.incidents.services.db_operations import validate_source_exists
190 +from app.incidents.services.incident_case import handle_customer_notifications_case
191
192 incidents_db_operations_router = APIRouter()
193
@@ -560,6 +567,44 @@ async def delete_alert_endpoint(alert_id: int, db: AsyncSession = Depends(get_db
567 return {"message": "Alert deleted successfully", "success": True}
568
569
570 +@incidents_db_operations_router.delete("/alerts", response_model=DeleteAlertsResponse)
571 +async def delete_alerts_endpoint(request: DeleteAlertsRequest, db: AsyncSession = Depends(get_db)):
572 + """
573 + Endpoint to delete alerts.
574 +
575 + This endpoint deletes alerts based on the provided list of alert IDs. If an alert is linked to a case, it will not be deleted and will be skipped.
576 +
577 + Args:
578 + request (DeleteAlertsRequest): Request object containing the list of alert IDs to be deleted.
579 + db (AsyncSession, optional): Database session dependency.
580 +
581 + Returns:
582 + DeleteAlertsResponse: Response object containing the status of the deletion process, including lists of successfully deleted alert IDs and those that were not deleted.
583 +
584 + Raises:
585 + HTTPException: If an error occurs during the deletion process that is not related to an alert being linked to a case.
586 + """
587 + deleted_alert_ids = []
588 + not_deleted_alert_ids = []
589 + for alert_id in request.alert_ids:
590 + try:
591 + await is_alert_linked_to_case(alert_id, db)
592 + await delete_alert(alert_id, db)
593 + deleted_alert_ids.append(alert_id)
594 + except HTTPException as e:
595 + if e.status_code == 400:
596 + logger.info(f"Alert {alert_id} is linked to a case and cannot be deleted. Skipping.")
597 + not_deleted_alert_ids.append(alert_id)
598 + else:
599 + raise e
600 + return DeleteAlertsResponse(
601 + message="Alerts processed successfully",
602 + deleted_alert_ids=deleted_alert_ids,
603 + not_deleted_alert_ids=not_deleted_alert_ids,
604 + success=True,
605 + )
606 +
607 +
608 @incidents_db_operations_router.get("/alerts/status/{status}", response_model=AlertOutResponse)
609 async def list_alerts_by_status_endpoint(
610 status: AlertStatus,
@@ -893,6 +938,43 @@ async def get_case_by_id_endpoint(case_id: int, db: AsyncSession = Depends(get_d
938 return CaseOutResponse(cases=[await get_case_by_id(case_id, db)], success=True, message="Case retrieved successfully")
939
940
941 +@incidents_db_operations_router.post("/case/notification", response_model=CaseNotificationResponse)
942 +async def create_case_notification_endpoint(request: CaseNotificationCreate, db: AsyncSession = Depends(get_db)):
943 + """
944 + This function collects the case details and then invokes the create_case_notification function to create a new case notification within the Shuffle Workflow.
945 +
946 + Args:
947 + request (CaseNotificationCreate): The request object containing the case details.
948 + db (AsyncSession, optional): The database session dependency.
949 +
950 + Returns:
951 + CaseNotificationResponse: The response object containing the created case notification.
952 + """
953 + case_details = await get_case_by_id(request.case_id, db)
954 + case_notification_payload = CreatedCaseNotificationPayload(
955 + case_name=case_details.case_name,
956 + case_description=case_details.case_description,
957 + case_creation_time=case_details.case_creation_time,
958 + alerts=[
959 + CreatedAlertPayload(
960 + alert_context_payload=(await get_alert_context_by_id(alert.assets[0].alert_context_id, db)).context
961 + if alert.assets
962 + else None, # Populate with actual alert context data
963 + asset_payload=alert.assets[0].asset_name if alert.assets else "", # Populate with actual asset data
964 + timefield_payload="", # Populate with actual timefield data
965 + alert_title_payload=alert.alert_name, # Populate with actual alert title data
966 + ioc_payload={ioc.value: ioc.type for ioc in alert.iocs} if alert.iocs else {}, # Populate with actual IoC data if available
967 + source=alert.source,
968 + )
969 + for alert in case_details.alerts
970 + ],
971 + )
972 +
973 + logger.info(f"Creating case notification for case {case_notification_payload}")
974 + await handle_customer_notifications_case(customer_code=case_details.customer_code, case_payload=case_notification_payload, session=db)
975 + return CaseNotificationResponse(success=True, message="Case notification created successfully")
976 +
977 +
978 @incidents_db_operations_router.get("/case-report-template", response_model=CaseReportTemplateDataStoreListResponse)
979 async def list_case_report_template_data_store_files_endpoint(db: AsyncSession = Depends(get_db)):
980 logger.info("Listing all files in the data store")
backend/app/incidents/schema/db_operations.py
+20
@@ -20,6 +20,10 @@ from app.incidents.models import CaseReportTemplateDataStore
20 from app.incidents.models import Comment
21
22
23 +class DeleteAlertsRequest(BaseModel):
24 + alert_ids: List[int]
25 +
26 +
27 class SocfortressRecommendsWazuhFieldNames(Enum):
28 # ! Windows Events
29 data_win_eventdata_commandLine = "data_win_eventdata_commandLine"
@@ -42,6 +46,13 @@ class SocfortressRecommendsWazuhFieldNames(Enum):
46 sha256 = "sha256"
47
48
49 +class DeleteAlertsResponse(BaseModel):
50 + message: str
51 + deleted_alert_ids: List[int]
52 + not_deleted_alert_ids: List[int]
53 + success: bool
54 +
55 +
56 class SocfortressRecommendsWazuhAssetName(Enum):
57 agent_name = "agent_name"
58
@@ -372,6 +383,15 @@ class CaseOutResponse(BaseModel):
383 message: str
384
385
386 +class CaseNotificationCreate(BaseModel):
387 + case_id: int
388 +
389 +
390 +class CaseNotificationResponse(BaseModel):
391 + success: bool
392 + message: str
393 +
394 +
395 class Notification(BaseModel):
396 id: int
397 customer_code: str
backend/app/incidents/schema/incident_alert.py
+8
@@ -1,3 +1,4 @@
1 +from datetime import datetime
2 from enum import Enum
3 from typing import Any
4 from typing import Dict
@@ -135,6 +136,13 @@ class CreatedAlertPayload(BaseModel):
136 index_id: Optional[str] = None
137
138
139 +class CreatedCaseNotificationPayload(BaseModel):
140 + case_name: str
141 + case_description: str
142 + case_creation_time: datetime
143 + alerts: List[CreatedAlertPayload]
144 +
145 +
146 class AlertTimelineResponse(BaseModel):
147 alert_timeline: List[Dict[str, Any]]
148 success: bool
backend/app/incidents/services/db_operations.py
+16 -2
@@ -1091,6 +1091,7 @@ async def get_case_by_id(case_id: int, db: AsyncSession) -> CaseOut:
1091 selectinload(Case.alerts).selectinload(CaseAlertLink.alert).selectinload(Alert.assets),
1092 selectinload(Case.alerts).selectinload(CaseAlertLink.alert).selectinload(Alert.tags).selectinload(AlertToTag.tag),
1093 selectinload(Case.alerts).selectinload(CaseAlertLink.alert).selectinload(Alert.cases).selectinload(CaseAlertLink.case),
1094 + selectinload(Case.alerts).selectinload(CaseAlertLink.alert).selectinload(Alert.iocs).selectinload(AlertToIoC.ioc),
1095 ),
1096 )
1097 case = result.scalars().first()
@@ -1103,6 +1104,7 @@ async def get_case_by_id(case_id: int, db: AsyncSession) -> CaseOut:
1104 assets = [AssetBase(**asset.__dict__) for asset in alert.assets]
1105 tags = [AlertTagBase(**alert_to_tag.tag.__dict__) for alert_to_tag in alert.tags]
1106 linked_cases = [LinkedCaseCreate(**case_alert_link.case.__dict__) for case_alert_link in alert.cases]
1107 + iocs = [IoCBase(**alert_to_ioc.ioc.__dict__) for alert_to_ioc in alert.iocs]
1108 alert_out = AlertOut(
1109 id=alert.id,
1110 alert_creation_time=alert.alert_creation_time,
@@ -1117,6 +1119,7 @@ async def get_case_by_id(case_id: int, db: AsyncSession) -> CaseOut:
1119 assets=assets,
1120 tags=tags,
1121 linked_cases=linked_cases,
1122 + iocs=iocs,
1123 )
1124 alerts_out.append(alert_out)
1125 case_out = CaseOut(
@@ -1138,6 +1141,7 @@ async def list_cases(db: AsyncSession) -> List[CaseOut]:
1141 selectinload(Case.alerts).selectinload(CaseAlertLink.alert).selectinload(Alert.assets),
1142 selectinload(Case.alerts).selectinload(CaseAlertLink.alert).selectinload(Alert.tags).selectinload(AlertToTag.tag),
1143 selectinload(Case.alerts).selectinload(CaseAlertLink.alert).selectinload(Alert.cases).selectinload(CaseAlertLink.case),
1144 + selectinload(Case.alerts).selectinload(CaseAlertLink.alert).selectinload(Alert.iocs).selectinload(AlertToIoC.ioc),
1145 ),
1146 )
1147 cases = result.scalars().all()
@@ -1150,6 +1154,7 @@ async def list_cases(db: AsyncSession) -> List[CaseOut]:
1154 assets = [AssetBase(**asset.__dict__) for asset in alert.assets]
1155 tags = [AlertTagBase(**alert_to_tag.tag.__dict__) for alert_to_tag in alert.tags]
1156 linked_cases = [LinkedCaseCreate(**case_alert_link.case.__dict__) for case_alert_link in alert.cases]
1157 + iocs = [IoCBase(**alert_to_ioc.ioc.__dict__) for alert_to_ioc in alert.iocs]
1158 alert_out = AlertOut(
1159 id=alert.id,
1160 alert_creation_time=alert.alert_creation_time,
@@ -1164,6 +1169,7 @@ async def list_cases(db: AsyncSession) -> List[CaseOut]:
1169 assets=assets,
1170 tags=tags,
1171 linked_cases=linked_cases,
1172 + iocs=iocs,
1173 )
1174 alerts_out.append(alert_out)
1175 case_out = CaseOut(
@@ -1188,6 +1194,8 @@ async def list_cases_by_status(status: str, db: AsyncSession) -> List[CaseOut]:
1194 selectinload(Case.alerts).selectinload(CaseAlertLink.alert).selectinload(Alert.comments),
1195 selectinload(Case.alerts).selectinload(CaseAlertLink.alert).selectinload(Alert.assets),
1196 selectinload(Case.alerts).selectinload(CaseAlertLink.alert).selectinload(Alert.tags).selectinload(AlertToTag.tag),
1197 + selectinload(Case.alerts).selectinload(CaseAlertLink.alert).selectinload(Alert.cases).selectinload(CaseAlertLink.case),
1198 + selectinload(Case.alerts).selectinload(CaseAlertLink.alert).selectinload(Alert.iocs).selectinload(AlertToIoC.ioc),
1199 ),
1200 )
1201 cases = result.scalars().all()
@@ -1199,6 +1207,8 @@ async def list_cases_by_status(status: str, db: AsyncSession) -> List[CaseOut]:
1207 comments = [CommentBase(**comment.__dict__) for comment in alert.comments]
1208 assets = [AssetBase(**asset.__dict__) for asset in alert.assets]
1209 tags = [AlertTagBase(**alert_to_tag.tag.__dict__) for alert_to_tag in alert.tags]
1210 + linked_cases = [LinkedCaseCreate(**case_alert_link.case.__dict__) for case_alert_link in alert.cases]
1211 + iocs = [IoCBase(**alert_to_ioc.ioc.__dict__) for alert_to_ioc in alert.iocs]
1212 alert_out = AlertOut(
1213 id=alert.id,
1214 alert_creation_time=alert.alert_creation_time,
@@ -1212,6 +1222,8 @@ async def list_cases_by_status(status: str, db: AsyncSession) -> List[CaseOut]:
1222 comments=comments,
1223 assets=assets,
1224 tags=tags,
1225 + linked_cases=linked_cases,
1226 + iocs=iocs,
1227 )
1228 alerts_out.append(alert_out)
1229 case_out = CaseOut(
@@ -1932,10 +1944,9 @@ async def delete_case(case_id: int, db: AsyncSession):
1944
1945 Raises:
1946 HTTPException: If the case is not found or there is an error deleting the case.
1935 -
1947 """
1948 result = await db.execute(
1938 - select(Case).options(selectinload(Case.alerts)).where(Case.id == case_id),
1949 + select(Case).options(selectinload(Case.alerts), selectinload(Case.data_store)).where(Case.id == case_id),
1950 )
1951 case = result.scalars().first()
1952 if not case:
@@ -1944,6 +1955,9 @@ async def delete_case(case_id: int, db: AsyncSession):
1955 # Delete entries from CaseAlertLink table
1956 await db.execute(delete(CaseAlertLink).where(CaseAlertLink.case_id == case_id))
1957
1958 + # Delete entries from CaseDataStore table
1959 + await db.execute(delete(CaseDataStore).where(CaseDataStore.case_id == case_id))
1960 +
1961 # Delete the case
1962 await db.execute(delete(Case).where(Case.id == case.id))
1963
backend/app/incidents/services/incident_case.py new
+31
@@ -0,0 +1,31 @@
1 +from loguru import logger
2 +from sqlalchemy.ext.asyncio import AsyncSession
3 +
4 +from app.connectors.shuffle.schema.integrations import ExecuteWorkflowRequest
5 +from app.connectors.shuffle.services.integrations import execute_workflow
6 +from app.incidents.schema.incident_alert import CreatedCaseNotificationPayload
7 +from app.incidents.services.db_operations import get_customer_notification
8 +
9 +
10 +async def handle_customer_notifications_case(
11 + customer_code: str,
12 + case_payload: CreatedCaseNotificationPayload,
13 + session: AsyncSession,
14 + type: str = "case",
15 +) -> None:
16 + customer_notifications = await get_customer_notification(customer_code, session)
17 + logger.info(f"Sending case_payload {case_payload} to customer code {customer_code}")
18 + if customer_notifications and customer_notifications[0].enabled:
19 + logger.info(f"Executing workflow for customer code {customer_code}")
20 + await execute_workflow(
21 + ExecuteWorkflowRequest(
22 + workflow_id=customer_notifications[0].shuffle_workflow_id,
23 + execution_arguments={
24 + "type": type,
25 + "customer_code": customer_code,
26 + "case_name": case_payload.case_name,
27 + "alerts": case_payload.alerts,
28 + },
29 + start="",
30 + ),
31 + )
backend/app/integrations/cato/routes/provision.py new
+51
@@ -0,0 +1,51 @@
1 +from fastapi import APIRouter
2 +from fastapi import Depends
3 +from sqlalchemy.ext.asyncio import AsyncSession
4 +
5 +from app.db.db_session import get_db
6 +from app.integrations.cato.schema.provision import ProvisionCatoRequest
7 +from app.integrations.cato.schema.provision import ProvisionCatoResponse
8 +from app.integrations.cato.services.provision import provision_cato
9 +from app.integrations.utils.utils import get_customer_integration_response
10 +from app.schedulers.models.scheduler import CreateSchedulerRequest
11 +from app.schedulers.scheduler import add_scheduler_jobs
12 +
13 +integration_cato_provision_scheduler_router = APIRouter()
14 +
15 +
16 +@integration_cato_provision_scheduler_router.post(
17 + "/provision",
18 + response_model=ProvisionCatoResponse,
19 + description="Provision a Cato integration.",
20 +)
21 +async def provision_Cato_route(
22 + provision_cato_request: ProvisionCatoRequest,
23 + session: AsyncSession = Depends(get_db),
24 +) -> ProvisionCatoResponse:
25 + """
26 + Provisions a Cato integration.
27 +
28 + Args:
29 + provision_Cato_request (ProvisionCatoRequest): The request object containing the necessary data for provisioning.
30 + session (AsyncSession, optional): The database session. Defaults to Depends(get_db).
31 +
32 + Returns:
33 + ProvisionCatoResponse: The response object indicating the success or failure of the provisioning process.
34 + """
35 + # Check if the customer integration settings are available and can be provisioned
36 + await get_customer_integration_response(
37 + provision_cato_request.customer_code,
38 + session,
39 + )
40 + await provision_cato(provision_cato_request, session)
41 + await add_scheduler_jobs(
42 + CreateSchedulerRequest(
43 + function_name="invoke_cato_integration_collect",
44 + time_interval=provision_cato_request.time_interval,
45 + job_id="invoke_cato_integration_collect",
46 + ),
47 + )
48 + return ProvisionCatoResponse(
49 + success=True,
50 + message="Cato integration provisioned successfully.",
51 + )
backend/app/integrations/cato/schema/provision.py new
+87
@@ -0,0 +1,87 @@
1 +from typing import Any
2 +from typing import Dict
3 +from typing import List
4 +from typing import Optional
5 +
6 +from pydantic import BaseModel
7 +from pydantic import Field
8 +from pydantic import root_validator
9 +
10 +
11 +class ProvisionCatoRequest(BaseModel):
12 + customer_code: str = Field(
13 + ...,
14 + description="The customer code.",
15 + examples=["00002"],
16 + )
17 + time_interval: int = Field(
18 + ...,
19 + description="The time interval for the scheduler.",
20 + examples=[15],
21 + )
22 + integration_name: str = Field(
23 + "Cato",
24 + description="The integration name.",
25 + examples=["Cato"],
26 + )
27 +
28 + # ensure the `integration_name` is always set to "Mimecast"
29 + @root_validator(pre=True)
30 + def set_integration_name(cls, values: Dict[str, Any]) -> Dict[str, Any]:
31 + values["integration_name"] = "Cato"
32 + return values
33 +
34 +
35 +class ProvisionCatoResponse(BaseModel):
36 + success: bool
37 + message: str
38 +
39 +
40 +# ! STREAMS ! #
41 +class StreamRule(BaseModel):
42 + field: str
43 + type: int
44 + inverted: bool
45 + value: str
46 +
47 +
48 +class CatoEventStream(BaseModel):
49 + title: str = Field(..., description="Title of the stream")
50 + description: str = Field(..., description="Description of the stream")
51 + index_set_id: str = Field(..., description="ID of the associated index set")
52 + rules: List[StreamRule] = Field(..., description="List of rules for the stream")
53 + matching_type: str = Field(..., description="Matching type for the rules")
54 + remove_matches_from_default_stream: bool = Field(
55 + ...,
56 + description="Whether to remove matches from the default stream",
57 + )
58 + content_pack: Optional[str] = Field(
59 + None,
60 + description="Associated content pack, if any",
61 + )
62 +
63 + class Config:
64 + schema_extra = {
65 + "example": {
66 + "title": "Cato SIEM EVENTS - Example Company",
67 + "description": "Cato SIEM EVENTS - Example Company",
68 + "index_set_id": "12345",
69 + "rules": [
70 + {
71 + "field": "customer_code",
72 + "type": 1,
73 + "inverted": False,
74 + "value": "ExampleCode",
75 + },
76 + {
77 + "field": "integration",
78 + "type": 1,
79 + "inverted": False,
80 + "value": "cato",
81 + },
82 + ],
83 + "matching_type": "AND",
84 + "remove_matches_from_default_stream": True,
85 + "content_pack": None,
86 + },
87 + }
backend/app/integrations/cato/services/provision.py new
+397
@@ -0,0 +1,397 @@
1 +import json
2 +from datetime import datetime
3 +
4 +from loguru import logger
5 +from sqlalchemy import and_
6 +from sqlalchemy import update
7 +from sqlalchemy.ext.asyncio import AsyncSession
8 +
9 +from app.connectors.grafana.schema.dashboards import CatoDashboard
10 +from app.connectors.grafana.schema.dashboards import DashboardProvisionRequest
11 +from app.connectors.grafana.services.dashboards import provision_dashboards
12 +from app.connectors.grafana.utils.universal import create_grafana_client
13 +from app.connectors.graylog.services.management import start_stream
14 +from app.connectors.graylog.utils.universal import send_post_request
15 +from app.connectors.wazuh_indexer.services.monitoring import (
16 + output_shard_number_to_be_set_based_on_nodes,
17 +)
18 +from app.customer_provisioning.schema.grafana import GrafanaDatasource
19 +from app.customer_provisioning.schema.grafana import GrafanaDataSourceCreationResponse
20 +from app.customer_provisioning.schema.graylog import GraylogIndexSetCreationResponse
21 +from app.customer_provisioning.schema.graylog import StreamCreationResponse
22 +from app.customer_provisioning.schema.graylog import TimeBasedIndexSet
23 +from app.customer_provisioning.services.grafana import create_grafana_folder
24 +from app.customer_provisioning.services.grafana import get_opensearch_version
25 +from app.customers.routes.customers import get_customer
26 +from app.customers.routes.customers import get_customer_meta
27 +from app.integrations.cato.schema.provision import CatoEventStream
28 +from app.integrations.cato.schema.provision import ProvisionCatoRequest
29 +from app.integrations.cato.schema.provision import ProvisionCatoResponse
30 +from app.integrations.models.customer_integration_settings import CustomerIntegrations
31 +from app.integrations.routes import create_integration_meta
32 +from app.integrations.schema import CustomerIntegrationsMetaSchema
33 +from app.utils import get_connector_attribute
34 +
35 +
36 +################## ! GRAYLOG ! ##################
37 +async def build_index_set_config(
38 + customer_code: str,
39 + session: AsyncSession,
40 +) -> TimeBasedIndexSet:
41 + """
42 + Build the configuration for a time-based index set.
43 +
44 + Args:
45 + request (ProvisionNewCustomer): The request object containing customer information.
46 +
47 + Returns:
48 + TimeBasedIndexSet: The configured time-based index set.
49 + """
50 + return TimeBasedIndexSet(
51 + title=f"{(await get_customer(customer_code, session)).customer.customer_name} - Cato",
52 + description=f"{customer_code} - CATO",
53 + index_prefix=f"cato_{customer_code}",
54 + rotation_strategy_class="org.graylog2.indexer.rotation.strategies.TimeBasedRotationStrategy",
55 + rotation_strategy={
56 + "type": "org.graylog2.indexer.rotation.strategies.TimeBasedRotationStrategyConfig",
57 + "rotation_period": "P1D",
58 + "rotate_empty_index_set": False,
59 + "max_rotation_period": None,
60 + },
61 + retention_strategy_class="org.graylog2.indexer.retention.strategies.DeletionRetentionStrategy",
62 + retention_strategy={
63 + "type": "org.graylog2.indexer.retention.strategies.DeletionRetentionStrategyConfig",
64 + "max_number_of_indices": 30,
65 + },
66 + creation_date=datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
67 + index_analyzer="standard",
68 + shards=await output_shard_number_to_be_set_based_on_nodes(),
69 + replicas=0,
70 + index_optimization_max_num_segments=1,
71 + index_optimization_disabled=False,
72 + writable=True,
73 + field_type_refresh_interval=5000,
74 + )
75 +
76 +
77 +# Function to send the POST request and handle the response
78 +async def send_index_set_creation_request(
79 + index_set: TimeBasedIndexSet,
80 +) -> GraylogIndexSetCreationResponse:
81 + """
82 + Sends a request to create an index set in Graylog.
83 +
84 + Args:
85 + index_set (TimeBasedIndexSet): The index set to be created.
86 +
87 + Returns:
88 + GraylogIndexSetCreationResponse: The response from Graylog after creating the index set.
89 + """
90 + json_index_set = json.dumps(index_set.dict())
91 + logger.info(f"json_index_set set: {json_index_set}")
92 + response_json = await send_post_request(
93 + endpoint="/api/system/indices/index_sets",
94 + data=index_set.dict(),
95 + )
96 + return GraylogIndexSetCreationResponse(**response_json)
97 +
98 +
99 +async def create_index_set(
100 + customer_code: str,
101 + session: AsyncSession,
102 +) -> GraylogIndexSetCreationResponse:
103 + """
104 + Creates an index set for a new customer.
105 +
106 + Args:
107 + request (ProvisionNewCustomer): The request object containing the customer information.
108 +
109 + Returns:
110 + GraylogIndexSetCreationResponse: The response object containing the result of the index set creation.
111 + """
112 + logger.info(f"Creating index set for customer {customer_code}")
113 + index_set_config = await build_index_set_config(customer_code, session)
114 + return await send_index_set_creation_request(index_set_config)
115 +
116 +
117 +# ! Event STREAMS ! #
118 +# Function to create event stream configuration
119 +async def build_event_stream_config(
120 + customer_code: str,
121 + index_set_id: str,
122 + session: AsyncSession,
123 +) -> CatoEventStream:
124 + """
125 + Builds the configuration for the Cato event stream.
126 +
127 + Args:
128 + customer_code (str): The customer code.
129 + index_set_id (str): The index set ID.
130 + session (AsyncSession): The async session.
131 +
132 + Returns:
133 + CatoEventStream: The configured Cato event stream.
134 + """
135 + return CatoEventStream(
136 + title=f"{(await get_customer(customer_code, session)).customer.customer_name} - CATO",
137 + description=f"{(await get_customer(customer_code, session)).customer.customer_name} - CATO",
138 + index_set_id=index_set_id,
139 + rules=[
140 + {
141 + "field": "integration",
142 + "type": 1,
143 + "inverted": False,
144 + "value": "cato",
145 + },
146 + {
147 + "field": "customer_code",
148 + "type": 1,
149 + "inverted": False,
150 + "value": f"{customer_code}",
151 + },
152 + ],
153 + matching_type="AND",
154 + remove_matches_from_default_stream=True,
155 + content_pack=None,
156 + )
157 +
158 +
159 +async def send_event_stream_creation_request(
160 + event_stream: CatoEventStream,
161 +) -> StreamCreationResponse:
162 + """
163 + Sends a request to create an event stream.
164 +
165 + Args:
166 + event_stream (SapSiemEventStream): The event stream to be created.
167 +
168 + Returns:
169 + StreamCreationResponse: The response containing the created event stream.
170 + """
171 + json_event_stream = json.dumps(event_stream.dict())
172 + logger.info(f"json_event_stream set: {json_event_stream}")
173 + response_json = await send_post_request(
174 + endpoint="/api/streams",
175 + data=event_stream.dict(),
176 + )
177 + return StreamCreationResponse(**response_json)
178 +
179 +
180 +async def create_event_stream(
181 + customer_code: str,
182 + index_set_id: str,
183 + session: AsyncSession,
184 +) -> StreamCreationResponse:
185 + """
186 + Creates an event stream for a customer.
187 +
188 + Args:
189 + request (ProvisionNewCustomer): The request object containing customer information.
190 + index_set_id (str): The ID of the index set.
191 +
192 + Returns:
193 + The result of the event stream creation request.
194 + """
195 + event_stream_config = await build_event_stream_config(
196 + customer_code,
197 + index_set_id,
198 + session,
199 + )
200 + return await send_event_stream_creation_request(event_stream_config)
201 +
202 +
203 +#### ! GRAFANA ! ####
204 +async def create_grafana_datasource(
205 + customer_code: str,
206 + session: AsyncSession,
207 +) -> GrafanaDataSourceCreationResponse:
208 + """
209 + Creates a Grafana datasource for the specified customer.
210 +
211 + Args:
212 + customer_code (str): The customer code.
213 + session (AsyncSession): The async session.
214 +
215 + Returns:
216 + GrafanaDataSourceCreationResponse: The response containing the created datasource details.
217 + """
218 + logger.info("Creating Grafana datasource")
219 + grafana_client = await create_grafana_client("Grafana")
220 + # Switch to the newly created organization
221 + grafana_client.user.switch_actual_user_organisation(
222 + (await get_customer_meta(customer_code, session)).customer_meta.customer_meta_grafana_org_id,
223 + )
224 + datasource_payload = GrafanaDatasource(
225 + name="CATO NETWORKS",
226 + type="grafana-opensearch-datasource",
227 + typeName="OpenSearch",
228 + access="proxy",
229 + url=await get_connector_attribute(
230 + connector_id=1,
231 + column_name="connector_url",
232 + session=session,
233 + ),
234 + database=f"cato_{customer_code}*",
235 + basicAuth=True,
236 + basicAuthUser=await get_connector_attribute(
237 + connector_id=1,
238 + column_name="connector_username",
239 + session=session,
240 + ),
241 + secureJsonData={
242 + "basicAuthPassword": await get_connector_attribute(
243 + connector_id=1,
244 + column_name="connector_password",
245 + session=session,
246 + ),
247 + },
248 + isDefault=False,
249 + jsonData={
250 + "database": f"cato_{customer_code}*",
251 + "flavor": "opensearch",
252 + "includeFrozen": False,
253 + "logLevelField": "severity",
254 + "logMessageField": "summary",
255 + "maxConcurrentShardRequests": 5,
256 + "pplEnabled": True,
257 + "timeField": "timestamp",
258 + "tlsSkipVerify": True,
259 + "version": await get_opensearch_version(),
260 + },
261 + readOnly=True,
262 + )
263 + results = grafana_client.datasource.create_datasource(
264 + datasource=datasource_payload.dict(),
265 + )
266 + return GrafanaDataSourceCreationResponse(**results)
267 +
268 +
269 +async def provision_cato(
270 + provision_cato_request: ProvisionCatoRequest,
271 + session: AsyncSession,
272 +) -> ProvisionCatoResponse:
273 + logger.info(
274 + f"Provisioning Cato integration for customer {provision_cato_request.customer_code}.",
275 + )
276 +
277 + # Create Index Set
278 + index_set_id = (
279 + await create_index_set(
280 + customer_code=provision_cato_request.customer_code,
281 + session=session,
282 + )
283 + ).data.id
284 + logger.info(f"Index set: {index_set_id}")
285 + # Create event stream
286 + stream_id = (
287 + await create_event_stream(
288 + provision_cato_request.customer_code,
289 + index_set_id,
290 + session,
291 + )
292 + ).data.stream_id
293 + # Start stream
294 + await start_stream(stream_id=stream_id)
295 +
296 + # Grafana Deployment
297 + Cato_datasource_uid = (
298 + await create_grafana_datasource(
299 + customer_code=provision_cato_request.customer_code,
300 + session=session,
301 + )
302 + ).datasource.uid
303 + grafana_Cato_folder_id = (
304 + await create_grafana_folder(
305 + organization_id=(
306 + await get_customer_meta(
307 + provision_cato_request.customer_code,
308 + session,
309 + )
310 + ).customer_meta.customer_meta_grafana_org_id,
311 + folder_title="CATO",
312 + )
313 + ).id
314 + await provision_dashboards(
315 + DashboardProvisionRequest(
316 + dashboards=[dashboard.name for dashboard in CatoDashboard],
317 + organizationId=(
318 + await get_customer_meta(
319 + provision_cato_request.customer_code,
320 + session,
321 + )
322 + ).customer_meta.customer_meta_grafana_org_id,
323 + folderId=grafana_Cato_folder_id,
324 + datasourceUid=Cato_datasource_uid,
325 + ),
326 + )
327 + await create_integration_meta_entry(
328 + CustomerIntegrationsMetaSchema(
329 + customer_code=provision_cato_request.customer_code,
330 + integration_name="CATO",
331 + graylog_input_id=None,
332 + graylog_index_id=index_set_id,
333 + graylog_stream_id=stream_id,
334 + grafana_org_id=(
335 + await get_customer_meta(
336 + provision_cato_request.customer_code,
337 + session,
338 + )
339 + ).customer_meta.customer_meta_grafana_org_id,
340 + grafana_dashboard_folder_id=grafana_Cato_folder_id,
341 + ),
342 + session,
343 + )
344 + await update_customer_integration_table(
345 + provision_cato_request.customer_code,
346 + session,
347 + )
348 +
349 + return ProvisionCatoResponse(
350 + success=True,
351 + message="Cato integration provisioned successfully.",
352 + )
353 +
354 +
355 +############## ! WRITE TO DB ! ##############
356 +async def create_integration_meta_entry(
357 + customer_integration_meta: CustomerIntegrationsMetaSchema,
358 + session: AsyncSession,
359 +) -> None:
360 + """
361 + Creates an entry for the customer integration meta in the database.
362 +
363 + Args:
364 + customer_integration_meta (CustomerIntegrationsMetaSchema): The customer integration meta object.
365 + session (AsyncSession): The async session object for database operations.
366 + """
367 + await create_integration_meta(customer_integration_meta, session)
368 + logger.info(
369 + f"Integration meta entry created for customer {customer_integration_meta.customer_code}.",
370 + )
371 +
372 +
373 +async def update_customer_integration_table(
374 + customer_code: str,
375 + session: AsyncSession,
376 +) -> None:
377 + """
378 + Updates the `customer_integrations` table to set the `deployed` column to True where the `customer_code`
379 + matches the given customer code and the `integration_service_name` is "CATO".
380 +
381 + Args:
382 + customer_code (str): The customer code.
383 + session (AsyncSession): The async session object for making HTTP requests.
384 + """
385 + await session.execute(
386 + update(CustomerIntegrations)
387 + .where(
388 + and_(
389 + CustomerIntegrations.customer_code == customer_code,
390 + CustomerIntegrations.integration_service_name == "CATO",
391 + ),
392 + )
393 + .values(deployed=True),
394 + )
395 + await session.commit()
396 +
397 + return None
backend/app/integrations/markdown/cato.md new
+50
@@ -0,0 +1,50 @@
1 +# [CATO NETWORKS](https://api.catonetworks.com/documentation/)
2 +
3 +Cato Networks offers a comprehensive Secure Access Service Edge (SASE) platform that combines networking and security services into a single cloud-based solution. This integration allows you to ingest CATO NETWORK events into the SOCFortress SIEM stack.
4 +
5 +# Overview of Cato API Keys
6 +
7 +The **API Keys** page in the Cato Management Application allows you to generate keys for authenticating API clients or scripts. Cato supports two types of API permissions:
8 +
9 +- **View permissions**: Perform read-only API calls to retrieve data from your account.
10 +- **Edit permissions**: Perform write API calls to make changes to your account.
11 +
12 +**Important**: After generating an API key, copy it immediately from the pop-up window. Once closed, the key cannot be retrieved.
13 +
14 +**Note**: If you’re using the `eventsFeed` API to ingest event data, ensure that you enable integration with Cato events in the **Administration > Event Integrations** page.
15 +
16 +## Managing API Keys
17 +
18 +The **API Keys** page displays all keys associated with your account. You can generate new keys or revoke existing ones as needed. The **Name** assigned to an API key is solely for identification and isn’t used in the authentication process.
19 +
20 +## Generating an API Key
21 +
22 +To generate an API key:
23 +
24 +1. In the navigation menu, click **Administration > API Management**.
25 +2. On the **API Keys** tab, click **New**. The **Create API Key** panel will open.
26 +3. Enter a **Key Name**.
27 +4. Select the desired **API Permission** for this key.
28 +5. (Optional) Set an **Expiration Date** for the API key. For keys with **Edit permissions**, it’s recommended to set an expiration date.
29 +6. (Optional) For additional security, under **Allow access from IPs**, select **Specific IP list** and define the IP addresses permitted to use this API key. By default, the key is allowed for any IP address.
30 +7. Click **Apply**. A pop-up window containing the new API key will appear.
31 +8. Click the **Copy** icon and save the API key to a secure location. Once you close this window, the key cannot be accessed again.
32 +9. Click **OK** to close the pop-up window.
33 +
34 +For more detailed information, refer to **Cato Networks’ official documentation** on [Generating API Keys for the Cato API](https://support.catonetworks.com/hc/en-us/articles/4413280536081-Generating-API-Keys-for-the-Cato-API).
35 +
36 +## Obtain Your Account ID from Cato Networks
37 +
38 +1. **Log in** to your Cato Networks Editors Account.
39 +2. **Record the Account ID** that appears in the Cato Networks URL to a temporary text file.
40 + - If you have multiple account IDs you wish to monitor, repeat this step for each.
41 + - For example, if your Account ID is `1234`, the URL should look like:
42 + `https://socfortress.catonetworks.com/#!/1234/topology`
43 +
44 +3. Open the **Navigation Menu** and click **Administration > API Management**.
45 +4. Enter the **Name** of the key and click **Apply**.
46 + - If the API key has been successfully added, a window will appear displaying the new API key.
47 +5. Click the **Copy Icon** to copy your API key and ensure you **save it to a secure location**.
48 + - **Note**: Once you close the window, you can no longer access the value of the API key.
49 +6. Click **OK** to close the API window.
50 +7. On the **API Management** page, click the **Event Feed Enabled** toggle to enable your account to send events to the Cato API servers.
backend/app/integrations/modules/routes/cato.py new
+90
@@ -0,0 +1,90 @@
1 +from fastapi import APIRouter
2 +from fastapi import Depends
3 +from loguru import logger
4 +from sqlalchemy.ext.asyncio import AsyncSession
5 +
6 +from app.db.db_session import get_db
7 +from app.integrations.modules.schema.cato import CatoAuthKeys
8 +from app.integrations.modules.schema.cato import CollectCato
9 +from app.integrations.modules.schema.cato import InvokeCatoRequest
10 +from app.integrations.modules.schema.cato import InvokeCatoResponse
11 +from app.integrations.modules.services.cato import post_to_copilot_cato_module
12 +from app.integrations.routes import find_customer_integration
13 +from app.integrations.utils.utils import extract_auth_keys
14 +from app.integrations.utils.utils import get_customer_integration_response
15 +from app.utils import get_connector_attribute
16 +
17 +module_cato_router = APIRouter()
18 +
19 +
20 +async def get_cato_auth_keys(customer_integration) -> CatoAuthKeys:
21 + """
22 + Extract the cato authentication keys from the CustomerIntegration.
23 +
24 + Args:
25 + customer_integration (CustomerIntegration): The CustomerIntegration containing the
26 + cato authentication keys.
27 +
28 + Returns:
29 + catoAuthKeys: The extracted cato authentication keys.
30 + """
31 + cato_auth_keys = extract_auth_keys(
32 + customer_integration,
33 + service_name="CATO",
34 + )
35 +
36 + return CatoAuthKeys(**cato_auth_keys)
37 +
38 +
39 +async def get_collect_cato_data(cato_request, session, auth_keys):
40 + return CollectCato(
41 + integration="cato",
42 + customer_code=cato_request.customer_code,
43 + graylog_host=await get_connector_attribute(
44 + connector_id=10,
45 + column_name="connector_url",
46 + session=session,
47 + ),
48 + graylog_port=await get_connector_attribute(
49 + connector_id=10,
50 + column_name="connector_extra_data",
51 + session=session,
52 + ),
53 + api_key=auth_keys.API_KEY,
54 + account_id=int(auth_keys.ACCOUNT_ID),
55 + event_types=auth_keys.EVENT_TYPES,
56 + event_sub_types=auth_keys.EVENT_SUB_TYPES,
57 + )
58 +
59 +
60 +@module_cato_router.post(
61 + "",
62 + response_model=InvokeCatoResponse,
63 + description="Invoke the cato module.",
64 +)
65 +async def collect_cato_route(cato_request: InvokeCatoRequest, session: AsyncSession = Depends(get_db)):
66 + """Pull down cato Events."""
67 + logger.info(f"Collecting Cato Events for {cato_request.customer_code}")
68 + try:
69 + customer_integration_response = await get_customer_integration_response(
70 + cato_request.customer_code,
71 + session,
72 + )
73 +
74 + customer_integration = await find_customer_integration(
75 + cato_request.customer_code,
76 + cato_request.integration_name,
77 + customer_integration_response,
78 + )
79 +
80 + auth_keys = await get_cato_auth_keys(customer_integration)
81 +
82 + collect_cato_data = await get_collect_cato_data(cato_request, session, auth_keys)
83 +
84 + await post_to_copilot_cato_module(data=collect_cato_data)
85 +
86 + except Exception as e:
87 + logger.error(f"Error during DB session: {str(e)}")
88 + return InvokeCatoResponse(success=False, message=str(e))
89 +
90 + return InvokeCatoResponse(success=True, message="Cato Events collected successfully.")
backend/app/integrations/modules/schema/cato.py new
+74
@@ -0,0 +1,74 @@
1 +from fastapi import HTTPException
2 +from pydantic import BaseModel
3 +from pydantic import Field
4 +from pydantic import validator
5 +
6 +
7 +class InvokeCatoRequest(BaseModel):
8 + customer_code: str = Field(
9 + ...,
10 + description="The customer code.",
11 + examples=["00002"],
12 + )
13 + # ! CASE SENSITIVE ! #
14 + integration_name: str = Field(
15 + "CATO",
16 + description="The integration name.",
17 + examples=["CATO"],
18 + )
19 +
20 +
21 +class CatoAuthKeys(BaseModel):
22 + API_KEY: str = Field(
23 + ...,
24 + description="The API key.",
25 + examples=["123456"],
26 + )
27 + ACCOUNT_ID: int = Field(
28 + ...,
29 + description="The account ID.",
30 + examples=[123456],
31 + )
32 + EVENT_TYPES: str = Field(
33 + ...,
34 + description="The event types.",
35 + examples=["Security"],
36 + )
37 + EVENT_SUB_TYPES: str = Field(
38 + ...,
39 + description="The event sub types.",
40 + examples=["NG Anti Malware,Anti Malware,IPS"],
41 + )
42 +
43 +
44 +class InvokeCatoResponse(BaseModel):
45 + success: bool = Field(
46 + ...,
47 + description="The success status.",
48 + examples=[True],
49 + )
50 + message: str = Field(
51 + ...,
52 + description="The message.",
53 + examples=["cato Events collected successfully."],
54 + )
55 +
56 +
57 +class CollectCato(BaseModel):
58 + integration: str = Field(..., example="cato")
59 + customer_code: str = Field(..., example="socfortress")
60 + graylog_host: str = Field(..., example="127.0.0.1")
61 + graylog_port: str = Field(..., example=12201)
62 + api_key: str = Field(..., example="1234567890")
63 + account_id: int = Field(..., example=123456)
64 + event_types: str = Field(..., example="Security")
65 + event_sub_types: str = Field(..., example="NG Anti Malware,Anti Malware,IPS")
66 +
67 + @validator("integration")
68 + def check_integration(cls, v):
69 + if v != "cato":
70 + raise HTTPException(
71 + status_code=400,
72 + detail="Invalid integration. Only 'cato' is supported.",
73 + )
74 + return v
backend/app/integrations/modules/services/cato.py new
+21
@@ -0,0 +1,21 @@
1 +import httpx
2 +from loguru import logger
3 +
4 +from app.integrations.modules.schema.cato import CollectCato
5 +
6 +
7 +async def post_to_copilot_cato_module(data: CollectCato, license_key: str = None) -> None:
8 + """
9 + Send a POST request to the copilot-cato-module Docker container.
10 +
11 + Args:
12 + data (CollectCato): The data to send to the copilot-cato-module Docker container.
13 + """
14 + logger.info(f"Sending POST request to http://copilot-cato-module/collect with data: {data.dict()}")
15 + async with httpx.AsyncClient() as client:
16 + await client.post(
17 + "http://copilot-cato-module/collect",
18 + json=data.dict(),
19 + timeout=120,
20 + )
21 + return None
backend/app/routers/cato.py new
+15
@@ -0,0 +1,15 @@
1 +from fastapi import APIRouter
2 +
3 +from app.integrations.cato.routes.provision import (
4 + integration_cato_provision_scheduler_router,
5 +)
6 +
7 +# Instantiate the APIRouter
8 +router = APIRouter()
9 +
10 +# Include the Cato Provision APIRouter
11 +router.include_router(
12 + integration_cato_provision_scheduler_router,
13 + prefix="/cato",
14 + tags=["cato"],
15 +)
backend/app/routers/modules.py
+7
@@ -1,5 +1,6 @@
1 from fastapi import APIRouter
2
3 +from app.integrations.modules.routes.cato import module_cato_router
4 from app.integrations.modules.routes.duo import module_duo_router
5 from app.integrations.modules.routes.huntress import module_huntress_router
6 from app.integrations.modules.routes.mimecast import module_mimecast_router
@@ -30,3 +31,9 @@ router.include_router(
31 prefix="/integrations/modules/duo",
32 tags=["DUO"],
33 )
34 +
35 +router.include_router(
36 + module_cato_router,
37 + prefix="/integrations/modules/cato",
38 + tags=["Cato"],
39 +)
backend/app/schedulers/scheduler.py
+2
@@ -18,6 +18,7 @@ from app.schedulers.services.invoke_alert_creation import invoke_alert_creation_
18 from app.schedulers.services.invoke_carbonblack import (
19 invoke_carbonblack_integration_collect,
20 )
21 +from app.schedulers.services.invoke_cato import invoke_cato_integration_collect
22 from app.schedulers.services.invoke_darktrace import (
23 invoke_darktrace_integration_collect,
24 )
@@ -266,6 +267,7 @@ def get_function_by_name(function_name: str):
267 "invoke_sap_siem_integration_brute_force_failed_logins_same_ip": invoke_sap_siem_integration_brute_force_failed_logins_same_ip,
268 "invoke_sap_siem_integration_successful_login_after_multiple_failed_logins": invoke_sap_siem_integration_successful_login_after_multiple_failed_logins,
269 "invoke_huntress_integration_collect": invoke_huntress_integration_collect,
270 + "invoke_cato_integration_collect": invoke_cato_integration_collect,
271 "invoke_duo_integration_collect": invoke_duo_integration_collect,
272 "invoke_darktrace_integration_collect": invoke_darktrace_integration_collect,
273 "invoke_carbonblack_integration_collection": invoke_carbonblack_integration_collect,
backend/app/schedulers/services/invoke_cato.py new
+54
@@ -0,0 +1,54 @@
1 +from datetime import datetime
2 +
3 +from dotenv import load_dotenv
4 +from loguru import logger
5 +from sqlalchemy import select
6 +
7 +from app.db.db_session import get_db_session
8 +from app.db.db_session import get_sync_db_session
9 +from app.integrations.models.customer_integration_settings import CustomerIntegrations
10 +from app.integrations.modules.routes.cato import collect_cato_route
11 +from app.integrations.modules.schema.cato import InvokeCatoRequest
12 +from app.integrations.modules.schema.cato import InvokeCatoResponse
13 +from app.schedulers.models.scheduler import JobMetadata
14 +from app.schedulers.utils.universal import get_scheduled_job_metadata
15 +
16 +load_dotenv()
17 +
18 +
19 +async def invoke_cato_integration_collect() -> InvokeCatoResponse:
20 + """
21 + Invokes the cato integration collection.
22 + """
23 + logger.info("Invoking cato integration collection.")
24 + customer_codes = []
25 + async with get_db_session() as session:
26 + stmt = select(CustomerIntegrations).where(
27 + CustomerIntegrations.integration_service_name == "CATO",
28 + )
29 + result = await session.execute(stmt)
30 + customer_codes = [row.customer_code for row in result.scalars()]
31 + logger.info(f"customer_codes: {customer_codes}")
32 + for customer_code in customer_codes:
33 + await collect_cato_route(
34 + InvokeCatoRequest(
35 + customer_code=customer_code,
36 + integration_name="CATO",
37 + time_range=f"{(await get_scheduled_job_metadata('invoke_cato_integration_collect')).time_interval}m",
38 + ),
39 + session,
40 + )
41 + # Close the session
42 + await session.close()
43 + with get_sync_db_session() as session:
44 + # Synchronous ORM operations
45 + job_metadata = session.query(JobMetadata).filter_by(job_id="invoke_cato_integration_collect").one_or_none()
46 + if job_metadata:
47 + job_metadata.last_success = datetime.utcnow()
48 + session.add(job_metadata)
49 + session.commit()
50 + else:
51 + # Handle the case where job_metadata does not exist
52 + print("JobMetadata for 'invoke_cato_integration_collect' not found.")
53 +
54 + return InvokeCatoResponse(success=True, message="cato integration invoked.")
backend/app/utils.py
+60
@@ -958,3 +958,63 @@ async def verify_alert_creation_provisioning_connection(connector_name: str) ->
958 logger.error("No Alert Creation Provisioning connector found in the database")
959 return None
960 return await verify_alert_creation_provisioning_healtcheck(attributes)
961 +
962 +
963 +################## ! VIRUSTOTAL ! ##################
964 +
965 +
966 +async def verify_virustotal_healtcheck(
967 + attributes: Dict[str, Any],
968 +) -> Dict[str, Any]:
969 + """
970 + Verifies the connection to VirusTotal service.
971 +
972 + Returns:
973 + dict: A dictionary containing 'connectionSuccessful' status.
974 + """
975 + logger.info(
976 + f"Verifying the VirusTotal connection to {attributes['connector_url']} and API key {attributes['connector_api_key']}",
977 + )
978 +
979 + try:
980 + virustotal_healthcheck = requests.get(
981 + f"{attributes['connector_url']}/files/99017f6eebbac24f351415dd410d522d",
982 + verify=False,
983 + headers={"x-apikey": attributes["connector_api_key"]},
984 + )
985 +
986 + if virustotal_healthcheck.status_code == 200:
987 + return {
988 + "connectionSuccessful": True,
989 + "message": "VirusTotal healthcheck successful",
990 + }
991 + else:
992 + logger.error(
993 + f"Connection to {attributes['connector_url']} failed with error: {virustotal_healthcheck.text}",
994 + )
995 +
996 + return {
997 + "connectionSuccessful": False,
998 + "message": f"Connection to {attributes['connector_url']} failed",
999 + }
1000 + except Exception as e:
1001 + logger.error(
1002 + f"Connection to {attributes['connector_url']} failed with error: {e}",
1003 + )
1004 +
1005 + return {
1006 + "connectionSuccessful": False,
1007 + "message": f"Connection to {attributes['connector_url']} failed with error.",
1008 + }
1009 +
1010 +
1011 +async def verify_virustotal_connection(connector_name: str) -> str:
1012 + """
1013 + Returns the status of the connection to VirusTotal service.
1014 + """
1015 + async with get_db_session() as session: # This will correctly enter the context manager
1016 + attributes = await get_connector_info_from_db(connector_name, session)
1017 + if attributes is None:
1018 + logger.error("No VirusTotal connector found in the database")
1019 + return None
1020 + return await verify_virustotal_healtcheck(attributes)
backend/copilot.py
+2
@@ -36,6 +36,7 @@ from app.routers import alert_creation_settings
36 from app.routers import auth
37 from app.routers import bitdefender
38 from app.routers import carbonblack
39 +from app.routers import cato
40 from app.routers import connectors
41 from app.routers import cortex
42 from app.routers import crowdstrike
@@ -118,6 +119,7 @@ app.add_exception_handler(ValueError, value_error_handler)
119 api_router.include_router(connectors.router)
120 api_router.include_router(wazuh_indexer.router)
121 api_router.include_router(auth.router)
122 +api_router.include_router(cato.router)
123 api_router.include_router(wazuh_manager.router)
124 api_router.include_router(agents.router)
125 api_router.include_router(graylog.router)
frontend/package-lock.json
+3381 -2877
@@ -15,8 +15,8 @@
15 "@fontsource/public-sans": "^5.1.1",
16 "@shikijs/markdown-it": "^1.23.1",
17 "@tailwindcss/container-queries": "^0.1.1",
18 - "@vueuse/core": "^11.3.0",
19 - "axios": "^1.7.7",
18 + "@vueuse/core": "^12.0.0",
19 + "axios": "^1.7.8",
20 "bytes": "^3.1.2",
21 "colord": "^2.9.3",
22 "dayjs": "^1.11.13",
@@ -28,10 +28,10 @@
28 "js-md5": "^0.8.3",
29 "lodash": "^4.17.21",
30 "mitt": "^3.0.1",
31 - "naive-ui": "^2.40.1",
32 - "nanoid": "^5.0.8",
31 + "naive-ui": "^2.40.2",
32 + "nanoid": "^5.0.9",
33 "password-validator": "^5.3.0",
34 - "pinia": "^2.2.6",
34 + "pinia": "^2.2.7",
35 "pinia-plugin-persistedstate": "^4.1.3",
36 "secure-ls": "^2.0.0",
37 "shiki": "^1.23.1",
@@ -40,15 +40,15 @@
40 "vue-advanced-cropper": "^2.8.9",
41 "vue-highlight-words": "^3.0.1",
42 "vue-i18n": "^10.0.4",
43 - "vue-router": "^4.4.5",
43 + "vue-router": "^4.5.0",
44 "vue-sjv": "^0.0.6",
45 - "vue3-apexcharts": "^1.7.0",
45 + "vue3-apexcharts": "^1.8.0",
46 "vue3-marquee": "^4.2.2",
47 "vuedraggable": "^4.1.0"
48 },
49 "devDependencies": {
50 - "@antfu/eslint-config": "^3.9.2",
51 - "@clack/prompts": "^0.8.1",
50 + "@antfu/eslint-config": "^3.11.0",
51 + "@clack/prompts": "^0.8.2",
52 "@iconify/vue": "^4.1.2",
53 "@tsconfig/node20": "^20.1.4",
54 "@types/bytes": "^3.1.4",
@@ -56,10 +56,10 @@
56 "@types/fs-extra": "^11.0.4",
57 "@types/jsdom": "^21.1.7",
58 "@types/lodash": "^4.17.13",
59 - "@types/node": "^22.9.1",
59 + "@types/node": "^22.10.0",
60 "@types/validator": "^13.12.2",
61 - "@vitejs/plugin-vue": "^5.2.0",
62 - "@vitejs/plugin-vue-jsx": "^4.1.0",
61 + "@vitejs/plugin-vue": "^5.2.1",
62 + "@vitejs/plugin-vue-jsx": "^4.1.1",
63 "@vue/test-utils": "^2.4.6",
64 "@vue/tsconfig": "^0.6.0",
65 "autoprefixer": "^10.4.20",
@@ -71,34 +71,35 @@
71 "jsdom": "^25.0.1",
72 "npm-run-all2": "^7.0.1",
73 "postcss": "^8.4.49",
74 - "prettier": "^3.3.3",
74 + "prettier": "^3.4.1",
75 "prettier-plugin-tailwindcss": "^0.6.9",
76 "sass": "^1.81.0",
77 "start-server-and-test": "^2.0.8",
78 "tailwind-config-viewer": "^2.0.4",
79 "tailwindcss": "^3.4.15",
80 "taze": "^0.18.0",
81 - "type-fest": "^4.27.0",
81 + "type-fest": "^4.29.0",
82 "typescript": "~5.6.3",
83 - "unplugin-vue-components": "^0.27.4",
83 + "unplugin-vue-components": "^0.27.5",
84 "vite": "^5.4.11",
85 "vite-bundle-visualizer": "^1.2.1",
86 - "vite-plugin-vue-devtools": "^7.6.4",
86 + "vite-plugin-vue-devtools": "^7.6.5",
87 "vite-svg-loader": "^5.1.0",
88 - "vitest": "^2.1.5",
88 + "vitest": "^2.1.6",
89 "vue-tsc": "^2.1.10"
90 },
91 "engines": {
92 "node": ">=18.0.0"
93 },
94 "optionalDependencies": {
95 - "@rollup/rollup-linux-x64-gnu": "^4.27.3"
95 + "@rollup/rollup-linux-x64-gnu": "^4.27.4"
96 }
97 },
98 "node_modules/@ajoelp/json-to-formdata": {
99 "version": "1.5.0",
100 "resolved": "https://registry.npmjs.org/@ajoelp/json-to-formdata/-/json-to-formdata-1.5.0.tgz",
101 "integrity": "sha512-nrlfeTSL0X0dtx5r2KpzPiqLSIQquiiJjUKsQAKzWaCmO2QoYZCyb5ENZwF3YoffKronOCJr25mxaD8JRJmK8w==",
102 + "license": "MIT",
103 "dependencies": {
104 "lodash": "4.17.21"
105 }
@@ -107,6 +108,7 @@
108 "version": "5.2.0",
109 "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
110 "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
111 + "license": "MIT",
112 "engines": {
113 "node": ">=10"
114 },
@@ -118,6 +120,7 @@
120 "version": "2.3.0",
121 "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
122 "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
123 + "license": "Apache-2.0",
124 "dependencies": {
125 "@jridgewell/gen-mapping": "^0.3.5",
126 "@jridgewell/trace-mapping": "^0.3.24"
@@ -127,41 +130,41 @@
130 }
131 },
132 "node_modules/@antfu/eslint-config": {
130 - "version": "3.9.2",
131 - "resolved": "https://registry.npmjs.org/@antfu/eslint-config/-/eslint-config-3.9.2.tgz",
132 - "integrity": "sha512-a1I1CXmtQdTL9jxcb2RzKjuYYAzjdKK3ktVpQGd/1S/aUdhKgcEEi3DRXYgnB8xdpYLqracETxEMDf9PQlmyBg==",
133 + "version": "3.11.0",
134 + "resolved": "https://registry.npmjs.org/@antfu/eslint-config/-/eslint-config-3.11.0.tgz",
135 + "integrity": "sha512-yJ8xkY7qtSoZpTOEOo3gMRsiYYvhNXHaWWh1APN0brDZsmRSjSPJBxMgq+JG+6hjeToJh9koZQxzDiwCbmirEg==",
136 "dev": true,
137 "license": "MIT",
138 "dependencies": {
136 - "@antfu/install-pkg": "^0.4.1",
137 - "@clack/prompts": "^0.8.1",
139 + "@antfu/install-pkg": "^0.5.0",
140 + "@clack/prompts": "^0.8.2",
141 "@eslint-community/eslint-plugin-eslint-comments": "^4.4.1",
142 "@eslint/markdown": "^6.2.1",
140 - "@stylistic/eslint-plugin": "^2.10.1",
141 - "@typescript-eslint/eslint-plugin": "^8.15.0",
142 - "@typescript-eslint/parser": "^8.15.0",
143 - "@vitest/eslint-plugin": "^1.1.10",
143 + "@stylistic/eslint-plugin": "^2.11.0",
144 + "@typescript-eslint/eslint-plugin": "^8.16.0",
145 + "@typescript-eslint/parser": "^8.16.0",
146 + "@vitest/eslint-plugin": "^1.1.11",
147 "eslint-config-flat-gitignore": "^0.3.0",
148 "eslint-flat-config-utils": "^0.4.0",
149 "eslint-merge-processors": "^0.1.0",
150 "eslint-plugin-antfu": "^2.7.0",
151 "eslint-plugin-command": "^0.2.6",
149 - "eslint-plugin-import-x": "^4.4.2",
150 - "eslint-plugin-jsdoc": "^50.5.0",
152 + "eslint-plugin-import-x": "^4.4.3",
153 + "eslint-plugin-jsdoc": "^50.6.0",
154 "eslint-plugin-jsonc": "^2.18.2",
152 - "eslint-plugin-n": "^17.13.2",
155 + "eslint-plugin-n": "^17.14.0",
156 "eslint-plugin-no-only-tests": "^3.3.0",
154 - "eslint-plugin-perfectionist": "^3.9.1",
157 + "eslint-plugin-perfectionist": "^4.1.2",
158 "eslint-plugin-regexp": "^2.7.0",
159 "eslint-plugin-toml": "^0.11.1",
157 - "eslint-plugin-unicorn": "^56.0.0",
160 + "eslint-plugin-unicorn": "^56.0.1",
161 "eslint-plugin-unused-imports": "^4.1.4",
162 "eslint-plugin-vue": "^9.31.0",
163 "eslint-plugin-yml": "^1.15.0",
164 "eslint-processor-vue-blocks": "^0.1.2",
165 "globals": "^15.12.0",
166 "jsonc-eslint-parser": "^2.4.0",
164 - "local-pkg": "^0.5.0",
167 + "local-pkg": "^0.5.1",
168 "parse-gitignore": "^2.0.0",
169 "picocolors": "^1.1.1",
170 "toml-eslint-parser": "^0.10.0",
@@ -187,7 +190,7 @@
190 "eslint-plugin-react-refresh": "^0.4.4",
191 "eslint-plugin-solid": "^0.14.3",
192 "eslint-plugin-svelte": ">=2.35.1",
190 - "prettier-plugin-astro": "^0.13.0",
193 + "prettier-plugin-astro": "^0.14.0",
194 "prettier-plugin-slidev": "^1.0.5",
195 "svelte-eslint-parser": ">=0.37.0"
196 },
@@ -233,36 +236,26 @@
236 }
237 }
238 },
236 - "node_modules/@antfu/eslint-config/node_modules/globals": {
237 - "version": "15.12.0",
238 - "resolved": "https://registry.npmjs.org/globals/-/globals-15.12.0.tgz",
239 - "integrity": "sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==",
240 - "dev": true,
241 - "engines": {
242 - "node": ">=18"
243 - },
244 - "funding": {
245 - "url": "https://github.com/sponsors/sindresorhus"
246 - }
247 - },
239 "node_modules/@antfu/install-pkg": {
249 - "version": "0.4.1",
250 - "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.4.1.tgz",
251 - "integrity": "sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==",
240 + "version": "0.5.0",
241 + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.5.0.tgz",
242 + "integrity": "sha512-dKnk2xlAyC7rvTkpkHmu+Qy/2Zc3Vm/l8PtNyIOGDBtXPY3kThfU4ORNEp3V7SXw5XSOb+tOJaUYpfquPzL/Tg==",
243 "dev": true,
244 + "license": "MIT",
245 "dependencies": {
254 - "package-manager-detector": "^0.2.0",
255 - "tinyexec": "^0.3.0"
246 + "package-manager-detector": "^0.2.5",
247 + "tinyexec": "^0.3.1"
248 },
249 "funding": {
250 "url": "https://github.com/sponsors/antfu"
251 }
252 },
253 "node_modules/@antfu/ni": {
262 - "version": "0.23.0",
263 - "resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-0.23.0.tgz",
264 - "integrity": "sha512-R5/GkA3PfGewAXLzz6lN5XagunF6PKeDtWt8dbZQXvHfebLS0qEczV+Azg/d+tKgSh6kRBpxvu8oSjARdPtw0A==",
254 + "version": "0.23.1",
255 + "resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-0.23.1.tgz",
256 + "integrity": "sha512-VFAvMTJhjP6L7CuBKT5FioDCSpdmZxJ4POKTJOrFNicI2CK6mlaRwVEBGWLGm2V6BtQgdbBn9X68piHSbw5wQQ==",
257 "dev": true,
258 + "license": "MIT",
259 "bin": {
260 "na": "bin/na.mjs",
261 "nci": "bin/nci.mjs",
@@ -278,14 +271,16 @@
271 "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz",
272 "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==",
273 "dev": true,
274 + "license": "MIT",
275 "funding": {
276 "url": "https://github.com/sponsors/antfu"
277 }
278 },
279 "node_modules/@babel/code-frame": {
286 - "version": "7.26.0",
287 - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.0.tgz",
288 - "integrity": "sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==",
280 + "version": "7.26.2",
281 + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
282 + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
283 + "license": "MIT",
284 "dependencies": {
285 "@babel/helper-validator-identifier": "^7.25.9",
286 "js-tokens": "^4.0.0",
@@ -296,9 +291,10 @@
291 }
292 },
293 "node_modules/@babel/compat-data": {
299 - "version": "7.26.0",
300 - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.0.tgz",
301 - "integrity": "sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA==",
294 + "version": "7.26.2",
295 + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz",
296 + "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==",
297 + "license": "MIT",
298 "engines": {
299 "node": ">=6.9.0"
300 }
@@ -307,6 +303,7 @@
303 "version": "7.26.0",
304 "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz",
305 "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==",
306 + "license": "MIT",
307 "dependencies": {
308 "@ampproject/remapping": "^2.2.0",
309 "@babel/code-frame": "^7.26.0",
@@ -336,16 +333,18 @@
333 "version": "6.3.1",
334 "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
335 "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
336 + "license": "ISC",
337 "bin": {
338 "semver": "bin/semver.js"
339 }
340 },
341 "node_modules/@babel/generator": {
344 - "version": "7.26.0",
345 - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.0.tgz",
346 - "integrity": "sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w==",
342 + "version": "7.26.2",
343 + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz",
344 + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==",
345 + "license": "MIT",
346 "dependencies": {
348 - "@babel/parser": "^7.26.0",
347 + "@babel/parser": "^7.26.2",
348 "@babel/types": "^7.26.0",
349 "@jridgewell/gen-mapping": "^0.3.5",
350 "@jridgewell/trace-mapping": "^0.3.25",
@@ -360,6 +359,7 @@
359 "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz",
360 "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
361 "dev": true,
362 + "license": "MIT",
363 "dependencies": {
364 "@babel/types": "^7.25.9"
365 },
@@ -371,6 +371,7 @@
371 "version": "7.25.9",
372 "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz",
373 "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==",
374 + "license": "MIT",
375 "dependencies": {
376 "@babel/compat-data": "^7.25.9",
377 "@babel/helper-validator-option": "^7.25.9",
@@ -386,6 +387,7 @@
387 "version": "6.3.1",
388 "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
389 "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
390 + "license": "ISC",
391 "bin": {
392 "semver": "bin/semver.js"
393 }
@@ -395,6 +397,7 @@
397 "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz",
398 "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==",
399 "dev": true,
400 + "license": "MIT",
401 "dependencies": {
402 "@babel/helper-annotate-as-pure": "^7.25.9",
403 "@babel/helper-member-expression-to-functions": "^7.25.9",
@@ -416,6 +419,7 @@
419 "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
420 "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
421 "dev": true,
422 + "license": "ISC",
423 "bin": {
424 "semver": "bin/semver.js"
425 }
@@ -425,6 +429,7 @@
429 "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz",
430 "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==",
431 "dev": true,
432 + "license": "MIT",
433 "dependencies": {
434 "@babel/traverse": "^7.25.9",
435 "@babel/types": "^7.25.9"
@@ -437,6 +442,7 @@
442 "version": "7.25.9",
443 "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
444 "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
445 + "license": "MIT",
446 "dependencies": {
447 "@babel/traverse": "^7.25.9",
448 "@babel/types": "^7.25.9"
@@ -449,6 +455,7 @@
455 "version": "7.26.0",
456 "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
457 "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
458 + "license": "MIT",
459 "dependencies": {
460 "@babel/helper-module-imports": "^7.25.9",
461 "@babel/helper-validator-identifier": "^7.25.9",
@@ -466,6 +473,7 @@
473 "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz",
474 "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==",
475 "dev": true,
476 + "license": "MIT",
477 "dependencies": {
478 "@babel/types": "^7.25.9"
479 },
@@ -478,6 +486,7 @@
486 "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz",
487 "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==",
488 "dev": true,
489 + "license": "MIT",
490 "engines": {
491 "node": ">=6.9.0"
492 }
@@ -487,6 +496,7 @@
496 "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz",
497 "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==",
498 "dev": true,
499 + "license": "MIT",
500 "dependencies": {
501 "@babel/helper-member-expression-to-functions": "^7.25.9",
502 "@babel/helper-optimise-call-expression": "^7.25.9",
@@ -504,6 +514,7 @@
514 "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz",
515 "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==",
516 "dev": true,
517 + "license": "MIT",
518 "dependencies": {
519 "@babel/traverse": "^7.25.9",
520 "@babel/types": "^7.25.9"
@@ -516,6 +527,7 @@
527 "version": "7.25.9",
528 "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
529 "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
530 + "license": "MIT",
531 "engines": {
532 "node": ">=6.9.0"
533 }
@@ -524,6 +536,7 @@
536 "version": "7.25.9",
537 "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
538 "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
539 + "license": "MIT",
540 "engines": {
541 "node": ">=6.9.0"
542 }
@@ -532,6 +545,7 @@
545 "version": "7.25.9",
546 "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
547 "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
548 + "license": "MIT",
549 "engines": {
550 "node": ">=6.9.0"
551 }
@@ -540,6 +554,7 @@
554 "version": "7.26.0",
555 "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz",
556 "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==",
557 + "license": "MIT",
558 "dependencies": {
559 "@babel/template": "^7.25.9",
560 "@babel/types": "^7.26.0"
@@ -549,9 +564,10 @@
564 }
565 },
566 "node_modules/@babel/parser": {
552 - "version": "7.26.0",
553 - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.0.tgz",
554 - "integrity": "sha512-aP8x5pIw3xvYr/sXT+SEUwyhrXT8rUJRZltK/qN3Db80dcKpTett8cJxHyjk+xYSVXvNnl2SfcJVjbwxpOSscA==",
567 + "version": "7.26.2",
568 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz",
569 + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==",
570 + "license": "MIT",
571 "dependencies": {
572 "@babel/types": "^7.26.0"
573 },
@@ -567,6 +583,7 @@
583 "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz",
584 "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==",
585 "dev": true,
586 + "license": "MIT",
587 "dependencies": {
588 "@babel/helper-create-class-features-plugin": "^7.25.9",
589 "@babel/helper-plugin-utils": "^7.25.9",
@@ -584,6 +601,7 @@
601 "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz",
602 "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==",
603 "dev": true,
604 + "license": "MIT",
605 "dependencies": {
606 "@babel/helper-plugin-utils": "^7.25.9"
607 },
@@ -599,6 +617,7 @@
617 "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz",
618 "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==",
619 "dev": true,
620 + "license": "MIT",
621 "dependencies": {
622 "@babel/helper-plugin-utils": "^7.25.9"
623 },
@@ -614,6 +633,7 @@
633 "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
634 "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
635 "dev": true,
636 + "license": "MIT",
637 "dependencies": {
638 "@babel/helper-plugin-utils": "^7.10.4"
639 },
@@ -626,6 +646,7 @@
646 "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz",
647 "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==",
648 "dev": true,
649 + "license": "MIT",
650 "dependencies": {
651 "@babel/helper-plugin-utils": "^7.25.9"
652 },
@@ -641,6 +662,7 @@
662 "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz",
663 "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==",
664 "dev": true,
665 + "license": "MIT",
666 "dependencies": {
667 "@babel/helper-plugin-utils": "^7.25.9"
668 },
@@ -656,6 +678,7 @@
678 "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz",
679 "integrity": "sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==",
680 "dev": true,
681 + "license": "MIT",
682 "dependencies": {
683 "@babel/helper-annotate-as-pure": "^7.25.9",
684 "@babel/helper-create-class-features-plugin": "^7.25.9",
@@ -671,9 +694,10 @@
694 }
695 },
696 "node_modules/@babel/standalone": {
674 - "version": "7.26.0",
675 - "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.26.0.tgz",
676 - "integrity": "sha512-jy7XdZWcJ24PTNy0l86eXQeCNryrtiWm/VUopiCtHoWe8v4TIg9mLoMPIRqY/AAVWzKt9ajpEtKZyg9YZJvxPA==",
697 + "version": "7.26.2",
698 + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.26.2.tgz",
699 + "integrity": "sha512-i2VbegsRfwa9yq3xmfDX3tG2yh9K0cCqwpSyVG2nPxifh0EOnucAZUeO/g4lW2Zfg03aPJNtPfxQbDHzXc7H+w==",
700 + "license": "MIT",
701 "engines": {
702 "node": ">=6.9.0"
703 }
@@ -682,6 +706,7 @@
706 "version": "7.25.9",
707 "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
708 "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
709 + "license": "MIT",
710 "dependencies": {
711 "@babel/code-frame": "^7.25.9",
712 "@babel/parser": "^7.25.9",
@@ -695,6 +720,7 @@
720 "version": "7.25.9",
721 "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz",
722 "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==",
723 + "license": "MIT",
724 "dependencies": {
725 "@babel/code-frame": "^7.25.9",
726 "@babel/generator": "^7.25.9",
@@ -712,6 +738,7 @@
738 "version": "11.12.0",
739 "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
740 "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
741 + "license": "MIT",
742 "engines": {
743 "node": ">=4"
744 }
@@ -720,6 +747,7 @@
747 "version": "7.26.0",
748 "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz",
749 "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
750 + "license": "MIT",
751 "dependencies": {
752 "@babel/helper-string-parser": "^7.25.9",
753 "@babel/helper-validator-identifier": "^7.25.9"
@@ -729,47 +757,34 @@
757 }
758 },
759 "node_modules/@clack/core": {
732 - "version": "0.3.4",
733 - "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.3.4.tgz",
734 - "integrity": "sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw==",
760 + "version": "0.3.5",
761 + "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.3.5.tgz",
762 + "integrity": "sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ==",
763 "dev": true,
764 + "license": "MIT",
765 "dependencies": {
766 "picocolors": "^1.0.0",
767 "sisteransi": "^1.0.5"
768 }
769 },
770 "node_modules/@clack/prompts": {
742 - "version": "0.8.1",
743 - "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.8.1.tgz",
744 - "integrity": "sha512-I263nEUNbX4lPTX93trl1fkIvGrGlz6nUYkqOddF0ZmjqcxUgUlXmpUIUqfapirRKJrFddvwF+qdZgg8cSqF7g==",
745 - "bundleDependencies": [
746 - "is-unicode-supported"
747 - ],
771 + "version": "0.8.2",
772 + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.8.2.tgz",
773 + "integrity": "sha512-6b9Ab2UiZwJYA9iMyboYyW9yJvAO9V753ZhS+DHKEjZRKAxPPOb7MXXu84lsPFG+vZt6FRFniZ8rXi+zCIw4yQ==",
774 "dev": true,
775 + "license": "MIT",
776 "dependencies": {
750 - "@clack/core": "0.3.4",
751 - "is-unicode-supported": "*",
777 + "@clack/core": "0.3.5",
778 "picocolors": "^1.0.0",
779 "sisteransi": "^1.0.5"
780 }
781 },
756 - "node_modules/@clack/prompts/node_modules/is-unicode-supported": {
757 - "version": "1.3.0",
758 - "dev": true,
759 - "inBundle": true,
760 - "license": "MIT",
761 - "engines": {
762 - "node": ">=12"
763 - },
764 - "funding": {
765 - "url": "https://github.com/sponsors/sindresorhus"
766 - }
767 - },
782 "node_modules/@colors/colors": {
783 "version": "1.5.0",
784 "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
785 "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
786 "dev": true,
787 + "license": "MIT",
788 "optional": true,
789 "engines": {
790 "node": ">=0.1.90"
@@ -779,6 +794,7 @@
794 "version": "0.15.14",
795 "resolved": "https://registry.npmjs.org/@css-render/plugin-bem/-/plugin-bem-0.15.14.tgz",
796 "integrity": "sha512-QK513CJ7yEQxm/P3EwsI+d+ha8kSOcjGvD6SevM41neEMxdULE+18iuQK6tEChAWMOQNQPLG/Rw3Khb69r5neg==",
797 + "license": "MIT",
798 "peerDependencies": {
799 "css-render": "~0.15.14"
800 }
@@ -787,6 +803,7 @@
803 "version": "0.15.14",
804 "resolved": "https://registry.npmjs.org/@css-render/vue3-ssr/-/vue3-ssr-0.15.14.tgz",
805 "integrity": "sha512-//8027GSbxE9n3QlD73xFY6z4ZbHbvrOVB7AO6hsmrEzGbg+h2A09HboUyDgu+xsmj7JnvJD39Irt+2D0+iV8g==",
806 + "license": "MIT",
807 "peerDependencies": {
808 "vue": "^3.0.11"
809 }
@@ -796,6 +813,7 @@
813 "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.6.tgz",
814 "integrity": "sha512-fi0eVdCOtKu5Ed6+E8mYxUF6ZTFJDZvHogCBelM0xVXmrDEkyM22gRArQzq1YcHPm1V47Vf/iAD+WgVdUlJCGg==",
815 "dev": true,
816 + "license": "Apache-2.0",
817 "dependencies": {
818 "aws-sign2": "~0.7.0",
819 "aws4": "^1.8.0",
@@ -825,6 +843,7 @@
843 "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz",
844 "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==",
845 "dev": true,
846 + "license": "MIT",
847 "dependencies": {
848 "debug": "^3.1.0",
849 "lodash.once": "^4.1.1"
@@ -835,6 +854,7 @@
854 "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
855 "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
856 "dev": true,
857 + "license": "MIT",
858 "dependencies": {
859 "ms": "^2.1.1"
860 }
@@ -842,13 +862,15 @@
862 "node_modules/@emotion/hash": {
863 "version": "0.8.0",
864 "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
845 - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="
865 + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==",
866 + "license": "MIT"
867 },
868 "node_modules/@es-joy/jsdoccomment": {
869 "version": "0.48.0",
870 "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.48.0.tgz",
871 "integrity": "sha512-G6QUWIcC+KvSwXNsJyDTHvqUdNoAVJPPgkc3+Uk4WBKqZvoXhlvazOgm9aL0HwihJLQf0l+tOE2UFzXBqCqgDw==",
872 "dev": true,
873 + "license": "MIT",
874 "dependencies": {
875 "comment-parser": "1.4.1",
876 "esquery": "^1.6.0",
@@ -859,291 +881,309 @@
881 }
882 },
883 "node_modules/@esbuild/aix-ppc64": {
862 - "version": "0.21.5",
863 - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
864 - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
884 + "version": "0.23.1",
885 + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz",
886 + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==",
887 "cpu": [
888 "ppc64"
889 ],
890 "dev": true,
891 + "license": "MIT",
892 "optional": true,
893 "os": [
894 "aix"
895 ],
896 "engines": {
874 - "node": ">=12"
897 + "node": ">=18"
898 }
899 },
900 "node_modules/@esbuild/android-arm": {
878 - "version": "0.21.5",
879 - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
880 - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
901 + "version": "0.23.1",
902 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz",
903 + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==",
904 "cpu": [
905 "arm"
906 ],
907 "dev": true,
908 + "license": "MIT",
909 "optional": true,
910 "os": [
911 "android"
912 ],
913 "engines": {
890 - "node": ">=12"
914 + "node": ">=18"
915 }
916 },
917 "node_modules/@esbuild/android-arm64": {
894 - "version": "0.21.5",
895 - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
896 - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
918 + "version": "0.23.1",
919 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz",
920 + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==",
921 "cpu": [
922 "arm64"
923 ],
924 "dev": true,
925 + "license": "MIT",
926 "optional": true,
927 "os": [
928 "android"
929 ],
930 "engines": {
906 - "node": ">=12"
931 + "node": ">=18"
932 }
933 },
934 "node_modules/@esbuild/android-x64": {
910 - "version": "0.21.5",
911 - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
912 - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
935 + "version": "0.23.1",
936 + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz",
937 + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==",
938 "cpu": [
939 "x64"
940 ],
941 "dev": true,
942 + "license": "MIT",
943 "optional": true,
944 "os": [
945 "android"
946 ],
947 "engines": {
922 - "node": ">=12"
948 + "node": ">=18"
949 }
950 },
951 "node_modules/@esbuild/darwin-arm64": {
926 - "version": "0.21.5",
927 - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
928 - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
952 + "version": "0.23.1",
953 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz",
954 + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==",
955 "cpu": [
956 "arm64"
957 ],
958 "dev": true,
959 + "license": "MIT",
960 "optional": true,
961 "os": [
962 "darwin"
963 ],
964 "engines": {
938 - "node": ">=12"
965 + "node": ">=18"
966 }
967 },
968 "node_modules/@esbuild/darwin-x64": {
942 - "version": "0.21.5",
943 - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
944 - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
969 + "version": "0.23.1",
970 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz",
971 + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==",
972 "cpu": [
973 "x64"
974 ],
975 "dev": true,
976 + "license": "MIT",
977 "optional": true,
978 "os": [
979 "darwin"
980 ],
981 "engines": {
954 - "node": ">=12"
982 + "node": ">=18"
983 }
984 },
985 "node_modules/@esbuild/freebsd-arm64": {
958 - "version": "0.21.5",
959 - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
960 - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
986 + "version": "0.23.1",
987 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz",
988 + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==",
989 "cpu": [
990 "arm64"
991 ],
992 "dev": true,
993 + "license": "MIT",
994 "optional": true,
995 "os": [
996 "freebsd"
997 ],
998 "engines": {
970 - "node": ">=12"
999 + "node": ">=18"
1000 }
1001 },
1002 "node_modules/@esbuild/freebsd-x64": {
974 - "version": "0.21.5",
975 - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
976 - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
1003 + "version": "0.23.1",
1004 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz",
1005 + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==",
1006 "cpu": [
1007 "x64"
1008 ],
1009 "dev": true,
1010 + "license": "MIT",
1011 "optional": true,
1012 "os": [
1013 "freebsd"
1014 ],
1015 "engines": {
986 - "node": ">=12"
1016 + "node": ">=18"
1017 }
1018 },
1019 "node_modules/@esbuild/linux-arm": {
990 - "version": "0.21.5",
991 - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
992 - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
1020 + "version": "0.23.1",
1021 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz",
1022 + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==",
1023 "cpu": [
1024 "arm"
1025 ],
1026 "dev": true,
1027 + "license": "MIT",
1028 "optional": true,
1029 "os": [
1030 "linux"
1031 ],
1032 "engines": {
1002 - "node": ">=12"
1033 + "node": ">=18"
1034 }
1035 },
1036 "node_modules/@esbuild/linux-arm64": {
1006 - "version": "0.21.5",
1007 - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
1008 - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
1037 + "version": "0.23.1",
1038 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz",
1039 + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==",
1040 "cpu": [
1041 "arm64"
1042 ],
1043 "dev": true,
1044 + "license": "MIT",
1045 "optional": true,
1046 "os": [
1047 "linux"
1048 ],
1049 "engines": {
1018 - "node": ">=12"
1050 + "node": ">=18"
1051 }
1052 },
1053 "node_modules/@esbuild/linux-ia32": {
1022 - "version": "0.21.5",
1023 - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
1024 - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
1054 + "version": "0.23.1",
1055 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz",
1056 + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==",
1057 "cpu": [
1058 "ia32"
1059 ],
1060 "dev": true,
1061 + "license": "MIT",
1062 "optional": true,
1063 "os": [
1064 "linux"
1065 ],
1066 "engines": {
1034 - "node": ">=12"
1067 + "node": ">=18"
1068 }
1069 },
1070 "node_modules/@esbuild/linux-loong64": {
1038 - "version": "0.21.5",
1039 - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
1040 - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
1071 + "version": "0.23.1",
1072 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz",
1073 + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==",
1074 "cpu": [
1075 "loong64"
1076 ],
1077 "dev": true,
1078 + "license": "MIT",
1079 "optional": true,
1080 "os": [
1081 "linux"
1082 ],
1083 "engines": {
1050 - "node": ">=12"
1084 + "node": ">=18"
1085 }
1086 },
1087 "node_modules/@esbuild/linux-mips64el": {
1054 - "version": "0.21.5",
1055 - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
1056 - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
1088 + "version": "0.23.1",
1089 + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz",
1090 + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==",
1091 "cpu": [
1092 "mips64el"
1093 ],
1094 "dev": true,
1095 + "license": "MIT",
1096 "optional": true,
1097 "os": [
1098 "linux"
1099 ],
1100 "engines": {
1066 - "node": ">=12"
1101 + "node": ">=18"
1102 }
1103 },
1104 "node_modules/@esbuild/linux-ppc64": {
1070 - "version": "0.21.5",
1071 - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
1072 - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
1105 + "version": "0.23.1",
1106 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz",
1107 + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==",
1108 "cpu": [
1109 "ppc64"
1110 ],
1111 "dev": true,
1112 + "license": "MIT",
1113 "optional": true,
1114 "os": [
1115 "linux"
1116 ],
1117 "engines": {
1082 - "node": ">=12"
1118 + "node": ">=18"
1119 }
1120 },
1121 "node_modules/@esbuild/linux-riscv64": {
1086 - "version": "0.21.5",
1087 - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
1088 - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
1122 + "version": "0.23.1",
1123 + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz",
1124 + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==",
1125 "cpu": [
1126 "riscv64"
1127 ],
1128 "dev": true,
1129 + "license": "MIT",
1130 "optional": true,
1131 "os": [
1132 "linux"
1133 ],
1134 "engines": {
1098 - "node": ">=12"
1135 + "node": ">=18"
1136 }
1137 },
1138 "node_modules/@esbuild/linux-s390x": {
1102 - "version": "0.21.5",
1103 - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
1104 - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
1139 + "version": "0.23.1",
1140 + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz",
1141 + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==",
1142 "cpu": [
1143 "s390x"
1144 ],
1145 "dev": true,
1146 + "license": "MIT",
1147 "optional": true,
1148 "os": [
1149 "linux"
1150 ],
1151 "engines": {
1114 - "node": ">=12"
1152 + "node": ">=18"
1153 }
1154 },
1155 "node_modules/@esbuild/linux-x64": {
1118 - "version": "0.21.5",
1119 - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
1120 - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
1156 + "version": "0.23.1",
1157 + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz",
1158 + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==",
1159 "cpu": [
1160 "x64"
1161 ],
1162 "dev": true,
1163 + "license": "MIT",
1164 "optional": true,
1165 "os": [
1166 "linux"
1167 ],
1168 "engines": {
1130 - "node": ">=12"
1169 + "node": ">=18"
1170 }
1171 },
1172 "node_modules/@esbuild/netbsd-x64": {
1134 - "version": "0.21.5",
1135 - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
1136 - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
1173 + "version": "0.23.1",
1174 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz",
1175 + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==",
1176 "cpu": [
1177 "x64"
1178 ],
1179 "dev": true,
1180 + "license": "MIT",
1181 "optional": true,
1182 "os": [
1183 "netbsd"
1184 ],
1185 "engines": {
1146 - "node": ">=12"
1186 + "node": ">=18"
1187 }
1188 },
1189 "node_modules/@esbuild/openbsd-arm64": {
@@ -1154,6 +1194,7 @@
1194 "arm64"
1195 ],
1196 "dev": true,
1197 + "license": "MIT",
1198 "optional": true,
1199 "os": [
1200 "openbsd"
@@ -1163,83 +1204,88 @@
1204 }
1205 },
1206 "node_modules/@esbuild/openbsd-x64": {
1166 - "version": "0.21.5",
1167 - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
1168 - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
1207 + "version": "0.23.1",
1208 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz",
1209 + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==",
1210 "cpu": [
1211 "x64"
1212 ],
1213 "dev": true,
1214 + "license": "MIT",
1215 "optional": true,
1216 "os": [
1217 "openbsd"
1218 ],
1219 "engines": {
1178 - "node": ">=12"
1220 + "node": ">=18"
1221 }
1222 },
1223 "node_modules/@esbuild/sunos-x64": {
1182 - "version": "0.21.5",
1183 - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
1184 - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
1224 + "version": "0.23.1",
1225 + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz",
1226 + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==",
1227 "cpu": [
1228 "x64"
1229 ],
1230 "dev": true,
1231 + "license": "MIT",
1232 "optional": true,
1233 "os": [
1234 "sunos"
1235 ],
1236 "engines": {
1194 - "node": ">=12"
1237 + "node": ">=18"
1238 }
1239 },
1240 "node_modules/@esbuild/win32-arm64": {
1198 - "version": "0.21.5",
1199 - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
1200 - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
1241 + "version": "0.23.1",
1242 + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz",
1243 + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==",
1244 "cpu": [
1245 "arm64"
1246 ],
1247 "dev": true,
1248 + "license": "MIT",
1249 "optional": true,
1250 "os": [
1251 "win32"
1252 ],
1253 "engines": {
1210 - "node": ">=12"
1254 + "node": ">=18"
1255 }
1256 },
1257 "node_modules/@esbuild/win32-ia32": {
1214 - "version": "0.21.5",
1215 - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
1216 - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
1258 + "version": "0.23.1",
1259 + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz",
1260 + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==",
1261 "cpu": [
1262 "ia32"
1263 ],
1264 "dev": true,
1265 + "license": "MIT",
1266 "optional": true,
1267 "os": [
1268 "win32"
1269 ],
1270 "engines": {
1226 - "node": ">=12"
1271 + "node": ">=18"
1272 }
1273 },
1274 "node_modules/@esbuild/win32-x64": {
1230 - "version": "0.21.5",
1231 - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
1232 - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
1275 + "version": "0.23.1",
1276 + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz",
1277 + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==",
1278 "cpu": [
1279 "x64"
1280 ],
1281 "dev": true,
1282 + "license": "MIT",
1283 "optional": true,
1284 "os": [
1285 "win32"
1286 ],
1287 "engines": {
1242 - "node": ">=12"
1288 + "node": ">=18"
1289 }
1290 },
1291 "node_modules/@eslint-community/eslint-plugin-eslint-comments": {
@@ -1247,6 +1293,7 @@
1293 "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.4.1.tgz",
1294 "integrity": "sha512-lb/Z/MzbTf7CaVYM9WCFNQZ4L1yi3ev2fsFPF99h31ljhSEyUoyEsKsNWiU+qD1glbYTDJdqgyaLKtyTkkqtuQ==",
1295 "dev": true,
1296 + "license": "MIT",
1297 "dependencies": {
1298 "escape-string-regexp": "^4.0.0",
1299 "ignore": "^5.2.4"
@@ -1266,6 +1313,7 @@
1313 "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
1314 "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
1315 "dev": true,
1316 + "license": "MIT",
1317 "dependencies": {
1318 "eslint-visitor-keys": "^3.4.3"
1319 },
@@ -1284,6 +1332,7 @@
1332 "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
1333 "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
1334 "dev": true,
1335 + "license": "Apache-2.0",
1336 "engines": {
1337 "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
1338 },
@@ -1296,15 +1345,17 @@
1345 "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
1346 "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
1347 "dev": true,
1348 + "license": "MIT",
1349 "engines": {
1350 "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
1351 }
1352 },
1353 "node_modules/@eslint/compat": {
1304 - "version": "1.2.1",
1305 - "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.1.tgz",
1306 - "integrity": "sha512-JbHG2TWuCeNzh87fXo+/46Z1LEo9DBA9T188d0fZgGxAD+cNyS6sx9fdiyxjGPBMyQVRlCutTByZ6a5+YMkF7g==",
1354 + "version": "1.2.3",
1355 + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.3.tgz",
1356 + "integrity": "sha512-wlZhwlDFxkxIZ571aH0FoK4h4Vwx7P3HJx62Gp8hTc10bfpwT2x0nULuAHmQSJBOWPgPeVf+9YtnD4j50zVHmA==",
1357 "dev": true,
1358 + "license": "Apache-2.0",
1359 "engines": {
1360 "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1361 },
@@ -1322,6 +1373,7 @@
1373 "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz",
1374 "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==",
1375 "dev": true,
1376 + "license": "Apache-2.0",
1377 "dependencies": {
1378 "@eslint/object-schema": "^2.1.4",
1379 "debug": "^4.3.1",
@@ -1336,6 +1388,7 @@
1388 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
1389 "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
1390 "dev": true,
1391 + "license": "MIT",
1392 "dependencies": {
1393 "balanced-match": "^1.0.0",
1394 "concat-map": "0.0.1"
@@ -1346,6 +1399,7 @@
1399 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1400 "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1401 "dev": true,
1402 + "license": "ISC",
1403 "dependencies": {
1404 "brace-expansion": "^1.1.7"
1405 },
@@ -1358,6 +1412,7 @@
1412 "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz",
1413 "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==",
1414 "dev": true,
1415 + "license": "Apache-2.0",
1416 "engines": {
1417 "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1418 }
@@ -1367,6 +1422,7 @@
1422 "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz",
1423 "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==",
1424 "dev": true,
1425 + "license": "MIT",
1426 "dependencies": {
1427 "ajv": "^6.12.4",
1428 "debug": "^4.3.2",
@@ -1389,13 +1445,15 @@
1445 "version": "2.0.1",
1446 "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
1447 "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
1392 - "dev": true
1448 + "dev": true,
1449 + "license": "Python-2.0"
1450 },
1451 "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
1452 "version": "1.1.11",
1453 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
1454 "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
1455 "dev": true,
1456 + "license": "MIT",
1457 "dependencies": {
1458 "balanced-match": "^1.0.0",
1459 "concat-map": "0.0.1"
@@ -1406,6 +1464,7 @@
1464 "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
1465 "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
1466 "dev": true,
1467 + "license": "MIT",
1468 "engines": {
1469 "node": ">=18"
1470 },
@@ -1418,6 +1477,7 @@
1477 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
1478 "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
1479 "dev": true,
1480 + "license": "MIT",
1481 "dependencies": {
1482 "argparse": "^2.0.1"
1483 },
@@ -1430,6 +1490,7 @@
1490 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1491 "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1492 "dev": true,
1493 + "license": "ISC",
1494 "dependencies": {
1495 "brace-expansion": "^1.1.7"
1496 },
@@ -1438,14 +1499,13 @@
1499 }
1500 },
1501 "node_modules/@eslint/js": {
1441 - "version": "8.57.1",
1442 - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
1443 - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
1502 + "version": "9.15.0",
1503 + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz",
1504 + "integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==",
1505 "dev": true,
1445 - "optional": true,
1446 - "peer": true,
1506 + "license": "MIT",
1507 "engines": {
1448 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
1508 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1509 }
1510 },
1511 "node_modules/@eslint/markdown": {
@@ -1453,6 +1513,7 @@
1513 "resolved": "https://registry.npmjs.org/@eslint/markdown/-/markdown-6.2.1.tgz",
1514 "integrity": "sha512-cKVd110hG4ICHmWhIwZJfKmmJBvbiDWyrHODJknAtudKgZtlROGoLX9UEOA0o746zC0hCY4UV4vR+aOGW9S6JQ==",
1515 "dev": true,
1516 + "license": "MIT",
1517 "dependencies": {
1518 "@eslint/plugin-kit": "^0.2.0",
1519 "mdast-util-from-markdown": "^2.0.1",
@@ -1468,6 +1529,7 @@
1529 "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz",
1530 "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==",
1531 "dev": true,
1532 + "license": "Apache-2.0",
1533 "engines": {
1534 "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1535 }
@@ -1477,6 +1539,7 @@
1539 "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz",
1540 "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==",
1541 "dev": true,
1542 + "license": "Apache-2.0",
1543 "dependencies": {
1544 "levn": "^0.4.1"
1545 },
@@ -1488,6 +1551,7 @@
1551 "version": "0.2.3",
1552 "resolved": "https://registry.npmjs.org/@f3ve/vue-markdown-it/-/vue-markdown-it-0.2.3.tgz",
1553 "integrity": "sha512-v0VNd7wb55kwsUUy3n6DLI9+0FYSG0PrCTD3bWuSRo6WS3OHD5wghh/aHzebVdsVkSBXfVpiEUlMA3DrxLs7Lw==",
1554 + "license": "MIT",
1555 "dependencies": {
1556 "markdown-it": "^14.1.0"
1557 },
@@ -1498,29 +1562,34 @@
1562 "node_modules/@fontsource/jetbrains-mono": {
1563 "version": "5.1.1",
1564 "resolved": "https://registry.npmjs.org/@fontsource/jetbrains-mono/-/jetbrains-mono-5.1.1.tgz",
1501 - "integrity": "sha512-5rwvmdQQpXev4LlBX1P+7h2dguu6iwW/9Npjde4+DEq+HgpVJI/7QY8DI1NVVFdvLtXZNP+vO2L/5BQED6FUhA=="
1565 + "integrity": "sha512-5rwvmdQQpXev4LlBX1P+7h2dguu6iwW/9Npjde4+DEq+HgpVJI/7QY8DI1NVVFdvLtXZNP+vO2L/5BQED6FUhA==",
1566 + "license": "OFL-1.1"
1567 },
1568 "node_modules/@fontsource/lexend": {
1569 "version": "5.1.1",
1570 "resolved": "https://registry.npmjs.org/@fontsource/lexend/-/lexend-5.1.1.tgz",
1506 - "integrity": "sha512-92A96vmx5xk1NgNphB62w5PKhW53Ruo74ki3UsUrV1q7/tbhJ73k2podhCNmldUlpUeO6rrCUWpRM20WloiNXA=="
1571 + "integrity": "sha512-92A96vmx5xk1NgNphB62w5PKhW53Ruo74ki3UsUrV1q7/tbhJ73k2podhCNmldUlpUeO6rrCUWpRM20WloiNXA==",
1572 + "license": "OFL-1.1"
1573 },
1574 "node_modules/@fontsource/public-sans": {
1575 "version": "5.1.1",
1576 "resolved": "https://registry.npmjs.org/@fontsource/public-sans/-/public-sans-5.1.1.tgz",
1511 - "integrity": "sha512-BEJEc9kpLBowHLqeOlex1lMJPZ/6mzKn3ArhbvWY9dvMcjSqH7jzJyTN44j0H78FTOrVjIW1g4A8nDdbx8VV5Q=="
1577 + "integrity": "sha512-BEJEc9kpLBowHLqeOlex1lMJPZ/6mzKn3ArhbvWY9dvMcjSqH7jzJyTN44j0H78FTOrVjIW1g4A8nDdbx8VV5Q==",
1578 + "license": "OFL-1.1"
1579 },
1580 "node_modules/@hapi/hoek": {
1581 "version": "9.3.0",
1582 "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
1583 "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==",
1517 - "dev": true
1584 + "dev": true,
1585 + "license": "BSD-3-Clause"
1586 },
1587 "node_modules/@hapi/topo": {
1588 "version": "5.1.0",
1589 "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
1590 "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
1591 "dev": true,
1592 + "license": "BSD-3-Clause",
1593 "dependencies": {
1594 "@hapi/hoek": "^9.0.0"
1595 }
@@ -1530,6 +1599,7 @@
1599 "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
1600 "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
1601 "dev": true,
1602 + "license": "Apache-2.0",
1603 "engines": {
1604 "node": ">=18.18.0"
1605 }
@@ -1539,6 +1609,7 @@
1609 "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
1610 "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
1611 "dev": true,
1612 + "license": "Apache-2.0",
1613 "dependencies": {
1614 "@humanfs/core": "^0.19.1",
1615 "@humanwhocodes/retry": "^0.3.0"
@@ -1552,6 +1623,7 @@
1623 "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
1624 "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
1625 "dev": true,
1626 + "license": "Apache-2.0",
1627 "engines": {
1628 "node": ">=18.18"
1629 },
@@ -1560,54 +1632,12 @@
1632 "url": "https://github.com/sponsors/nzakas"
1633 }
1634 },
1563 - "node_modules/@humanwhocodes/config-array": {
1564 - "version": "0.13.0",
1565 - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
1566 - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
1567 - "deprecated": "Use @eslint/config-array instead",
1568 - "dev": true,
1569 - "optional": true,
1570 - "peer": true,
1571 - "dependencies": {
1572 - "@humanwhocodes/object-schema": "^2.0.3",
1573 - "debug": "^4.3.1",
1574 - "minimatch": "^3.0.5"
1575 - },
1576 - "engines": {
1577 - "node": ">=10.10.0"
1578 - }
1579 - },
1580 - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": {
1581 - "version": "1.1.11",
1582 - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
1583 - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
1584 - "dev": true,
1585 - "optional": true,
1586 - "peer": true,
1587 - "dependencies": {
1588 - "balanced-match": "^1.0.0",
1589 - "concat-map": "0.0.1"
1590 - }
1591 - },
1592 - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": {
1593 - "version": "3.1.2",
1594 - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1595 - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1596 - "dev": true,
1597 - "optional": true,
1598 - "peer": true,
1599 - "dependencies": {
1600 - "brace-expansion": "^1.1.7"
1601 - },
1602 - "engines": {
1603 - "node": "*"
1604 - }
1605 - },
1635 "node_modules/@humanwhocodes/module-importer": {
1636 "version": "1.0.1",
1637 "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
1638 "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
1639 "dev": true,
1640 + "license": "Apache-2.0",
1641 "engines": {
1642 "node": ">=12.22"
1643 },
@@ -1616,20 +1646,12 @@
1646 "url": "https://github.com/sponsors/nzakas"
1647 }
1648 },
1619 - "node_modules/@humanwhocodes/object-schema": {
1620 - "version": "2.0.3",
1621 - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
1622 - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
1623 - "deprecated": "Use @eslint/object-schema instead",
1624 - "dev": true,
1625 - "optional": true,
1626 - "peer": true
1627 - },
1649 "node_modules/@humanwhocodes/retry": {
1650 "version": "0.4.1",
1651 "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz",
1652 "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==",
1653 "dev": true,
1654 + "license": "Apache-2.0",
1655 "engines": {
1656 "node": ">=18.18"
1657 },
@@ -1642,13 +1664,15 @@
1664 "version": "2.0.0",
1665 "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
1666 "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
1645 - "dev": true
1667 + "dev": true,
1668 + "license": "MIT"
1669 },
1670 "node_modules/@iconify/vue": {
1671 "version": "4.1.2",
1672 "resolved": "https://registry.npmjs.org/@iconify/vue/-/vue-4.1.2.tgz",
1673 "integrity": "sha512-CQnYqLiQD5LOAaXhBrmj1mdL2/NCJvwcC4jtW2Z8ukhThiFkLDkutarTOV2trfc9EXqUqRs0KqXOL9pZ/IyysA==",
1674 "dev": true,
1675 + "license": "MIT",
1676 "dependencies": {
1677 "@iconify/types": "^2.0.0"
1678 },
@@ -1663,6 +1687,7 @@
1687 "version": "10.0.4",
1688 "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-10.0.4.tgz",
1689 "integrity": "sha512-GG428DkrrWCMhxRMRQZjuS7zmSUzarYcaHJqG9VB8dXAxw4iQDoKVQ7ChJRB6ZtsCsX3Jse1PEUlHrJiyQrOTg==",
1690 + "license": "MIT",
1691 "dependencies": {
1692 "@intlify/message-compiler": "10.0.4",
1693 "@intlify/shared": "10.0.4"
@@ -1678,6 +1703,7 @@
1703 "version": "10.0.4",
1704 "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-10.0.4.tgz",
1705 "integrity": "sha512-AFbhEo10DP095/45EauinQJ5hJ3rJUmuuqltGguvc3WsvezZN+g8qNHLGWKu60FHQVizMrQY7VJ+zVlBXlQQkQ==",
1706 + "license": "MIT",
1707 "dependencies": {
1708 "@intlify/shared": "10.0.4",
1709 "source-map-js": "^1.0.2"
@@ -1693,6 +1719,7 @@
1719 "version": "10.0.4",
1720 "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-10.0.4.tgz",
1721 "integrity": "sha512-ukFn0I01HsSgr3VYhYcvkTCLS7rGa0gw4A4AMpcy/A9xx/zRJy7PS2BElMXLwUazVFMAr5zuiTk3MQeoeGXaJg==",
1722 + "license": "MIT",
1723 "engines": {
1724 "node": ">= 16"
1725 },
@@ -1704,6 +1731,7 @@
1731 "version": "8.0.2",
1732 "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
1733 "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
1734 + "license": "ISC",
1735 "dependencies": {
1736 "string-width": "^5.1.2",
1737 "string-width-cjs": "npm:string-width@^4.2.0",
@@ -1720,6 +1748,7 @@
1748 "version": "6.1.0",
1749 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
1750 "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
1751 + "license": "MIT",
1752 "engines": {
1753 "node": ">=12"
1754 },
@@ -1730,12 +1759,14 @@
1759 "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
1760 "version": "9.2.2",
1761 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
1733 - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
1762 + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
1763 + "license": "MIT"
1764 },
1765 "node_modules/@isaacs/cliui/node_modules/string-width": {
1766 "version": "5.1.2",
1767 "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
1768 "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
1769 + "license": "MIT",
1770 "dependencies": {
1771 "eastasianwidth": "^0.2.0",
1772 "emoji-regex": "^9.2.2",
@@ -1752,6 +1783,7 @@
1783 "version": "7.1.0",
1784 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
1785 "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
1786 + "license": "MIT",
1787 "dependencies": {
1788 "ansi-regex": "^6.0.1"
1789 },
@@ -1766,6 +1798,7 @@
1798 "version": "0.3.5",
1799 "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
1800 "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
1801 + "license": "MIT",
1802 "dependencies": {
1803 "@jridgewell/set-array": "^1.2.1",
1804 "@jridgewell/sourcemap-codec": "^1.4.10",
@@ -1779,6 +1812,7 @@
1812 "version": "3.1.2",
1813 "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
1814 "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
1815 + "license": "MIT",
1816 "engines": {
1817 "node": ">=6.0.0"
1818 }
@@ -1787,6 +1821,7 @@
1821 "version": "1.2.1",
1822 "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
1823 "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
1824 + "license": "MIT",
1825 "engines": {
1826 "node": ">=6.0.0"
1827 }
@@ -1794,12 +1829,14 @@
1829 "node_modules/@jridgewell/sourcemap-codec": {
1830 "version": "1.5.0",
1831 "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
1797 - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
1832 + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
1833 + "license": "MIT"
1834 },
1835 "node_modules/@jridgewell/trace-mapping": {
1836 "version": "0.3.25",
1837 "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
1838 "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
1839 + "license": "MIT",
1840 "dependencies": {
1841 "@jridgewell/resolve-uri": "^3.1.0",
1842 "@jridgewell/sourcemap-codec": "^1.4.14"
@@ -1808,13 +1845,15 @@
1845 "node_modules/@juggle/resize-observer": {
1846 "version": "3.4.0",
1847 "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz",
1811 - "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA=="
1848 + "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==",
1849 + "license": "Apache-2.0"
1850 },
1851 "node_modules/@koa/router": {
1852 "version": "12.0.2",
1853 "resolved": "https://registry.npmjs.org/@koa/router/-/router-12.0.2.tgz",
1854 "integrity": "sha512-sYcHglGKTxGF+hQ6x67xDfkE9o+NhVlRHBqq6gLywaMc6CojK/5vFZByphdonKinYlMLkEkacm+HEse9HzwgTA==",
1855 "dev": true,
1856 + "license": "MIT",
1857 "dependencies": {
1858 "debug": "^4.3.4",
1859 "http-errors": "^2.0.0",
@@ -1830,6 +1869,7 @@
1869 "version": "2.1.5",
1870 "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
1871 "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
1872 + "license": "MIT",
1873 "dependencies": {
1874 "@nodelib/fs.stat": "2.0.5",
1875 "run-parallel": "^1.1.9"
@@ -1842,6 +1882,7 @@
1882 "version": "2.0.5",
1883 "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
1884 "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
1885 + "license": "MIT",
1886 "engines": {
1887 "node": ">= 8"
1888 }
@@ -1850,6 +1891,7 @@
1891 "version": "1.2.8",
1892 "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
1893 "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
1894 + "license": "MIT",
1895 "dependencies": {
1896 "@nodelib/fs.scandir": "2.1.5",
1897 "fastq": "^1.6.0"
@@ -1859,52 +1901,64 @@
1901 }
1902 },
1903 "node_modules/@nuxt/kit": {
1862 - "version": "3.13.2",
1863 - "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.13.2.tgz",
1864 - "integrity": "sha512-KvRw21zU//wdz25IeE1E5m/aFSzhJloBRAQtv+evcFeZvuroIxpIQuUqhbzuwznaUwpiWbmwlcsp5uOWmi4vwA==",
1904 + "version": "3.14.1592",
1905 + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.14.1592.tgz",
1906 + "integrity": "sha512-r9r8bISBBisvfcNgNL3dSIQHSBe0v5YkX5zwNblIC2T0CIEgxEVoM5rq9O5wqgb5OEydsHTtT2hL57vdv6VT2w==",
1907 + "license": "MIT",
1908 "dependencies": {
1866 - "@nuxt/schema": "3.13.2",
1867 - "c12": "^1.11.2",
1909 + "@nuxt/schema": "3.14.1592",
1910 + "c12": "^2.0.1",
1911 "consola": "^3.2.3",
1912 "defu": "^6.1.4",
1913 "destr": "^2.0.3",
1914 "globby": "^14.0.2",
1915 "hash-sum": "^2.0.0",
1873 - "ignore": "^5.3.2",
1874 - "jiti": "^1.21.6",
1916 + "ignore": "^6.0.2",
1917 + "jiti": "^2.4.0",
1918 "klona": "^2.0.6",
1919 "knitwork": "^1.1.0",
1877 - "mlly": "^1.7.1",
1920 + "mlly": "^1.7.3",
1921 "pathe": "^1.1.2",
1879 - "pkg-types": "^1.2.0",
1922 + "pkg-types": "^1.2.1",
1923 "scule": "^1.3.0",
1924 "semver": "^7.6.3",
1925 "ufo": "^1.5.4",
1926 "unctx": "^2.3.1",
1884 - "unimport": "^3.12.0",
1885 - "untyped": "^1.4.2"
1927 + "unimport": "^3.13.2",
1928 + "untyped": "^1.5.1"
1929 },
1930 "engines": {
1931 "node": "^14.18.0 || >=16.10.0"
1932 }
1933 },
1934 + "node_modules/@nuxt/kit/node_modules/ignore": {
1935 + "version": "6.0.2",
1936 + "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz",
1937 + "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==",
1938 + "license": "MIT",
1939 + "engines": {
1940 + "node": ">= 4"
1941 + }
1942 + },
1943 "node_modules/@nuxt/schema": {
1892 - "version": "3.13.2",
1893 - "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.13.2.tgz",
1894 - "integrity": "sha512-CCZgpm+MkqtOMDEgF9SWgGPBXlQ01hV/6+2reDEpJuqFPGzV8HYKPBcIFvn7/z5ahtgutHLzjP71Na+hYcqSpw==",
1944 + "version": "3.14.1592",
1945 + "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.14.1592.tgz",
1946 + "integrity": "sha512-A1d/08ueX8stTXNkvGqnr1eEXZgvKn+vj6s7jXhZNWApUSqMgItU4VK28vrrdpKbjIPwq2SwhnGOHUYvN9HwCQ==",
1947 + "license": "MIT",
1948 "dependencies": {
1949 + "c12": "^2.0.1",
1950 "compatx": "^0.1.8",
1951 "consola": "^3.2.3",
1952 "defu": "^6.1.4",
1953 "hookable": "^5.5.3",
1954 "pathe": "^1.1.2",
1901 - "pkg-types": "^1.2.0",
1955 + "pkg-types": "^1.2.1",
1956 "scule": "^1.3.0",
1903 - "std-env": "^3.7.0",
1957 + "std-env": "^3.8.0",
1958 "ufo": "^1.5.4",
1959 "uncrypto": "^0.1.3",
1906 - "unimport": "^3.12.0",
1907 - "untyped": "^1.4.2"
1960 + "unimport": "^3.13.2",
1961 + "untyped": "^1.5.1"
1962 },
1963 "engines": {
1964 "node": "^14.18.0 || >=16.10.0"
@@ -1914,13 +1968,16 @@
1968 "version": "0.1.1",
1969 "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz",
1970 "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==",
1917 - "dev": true
1971 + "dev": true,
1972 + "license": "MIT"
1973 },
1974 "node_modules/@parcel/watcher": {
1920 - "version": "2.4.1",
1921 - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz",
1922 - "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==",
1975 + "version": "2.5.0",
1976 + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz",
1977 + "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==",
1978 "dev": true,
1979 + "hasInstallScript": true,
1980 + "license": "MIT",
1981 "optional": true,
1982 "dependencies": {
1983 "detect-libc": "^1.0.3",
@@ -1936,28 +1993,30 @@
1993 "url": "https://opencollective.com/parcel"
1994 },
1995 "optionalDependencies": {
1939 - "@parcel/watcher-android-arm64": "2.4.1",
1940 - "@parcel/watcher-darwin-arm64": "2.4.1",
1941 - "@parcel/watcher-darwin-x64": "2.4.1",
1942 - "@parcel/watcher-freebsd-x64": "2.4.1",
1943 - "@parcel/watcher-linux-arm-glibc": "2.4.1",
1944 - "@parcel/watcher-linux-arm64-glibc": "2.4.1",
1945 - "@parcel/watcher-linux-arm64-musl": "2.4.1",
1946 - "@parcel/watcher-linux-x64-glibc": "2.4.1",
1947 - "@parcel/watcher-linux-x64-musl": "2.4.1",
1948 - "@parcel/watcher-win32-arm64": "2.4.1",
1949 - "@parcel/watcher-win32-ia32": "2.4.1",
1950 - "@parcel/watcher-win32-x64": "2.4.1"
1996 + "@parcel/watcher-android-arm64": "2.5.0",
1997 + "@parcel/watcher-darwin-arm64": "2.5.0",
1998 + "@parcel/watcher-darwin-x64": "2.5.0",
1999 + "@parcel/watcher-freebsd-x64": "2.5.0",
2000 + "@parcel/watcher-linux-arm-glibc": "2.5.0",
2001 + "@parcel/watcher-linux-arm-musl": "2.5.0",
2002 + "@parcel/watcher-linux-arm64-glibc": "2.5.0",
2003 + "@parcel/watcher-linux-arm64-musl": "2.5.0",
2004 + "@parcel/watcher-linux-x64-glibc": "2.5.0",
2005 + "@parcel/watcher-linux-x64-musl": "2.5.0",
2006 + "@parcel/watcher-win32-arm64": "2.5.0",
2007 + "@parcel/watcher-win32-ia32": "2.5.0",
2008 + "@parcel/watcher-win32-x64": "2.5.0"
2009 }
2010 },
2011 "node_modules/@parcel/watcher-android-arm64": {
1954 - "version": "2.4.1",
1955 - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz",
1956 - "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==",
2012 + "version": "2.5.0",
2013 + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz",
2014 + "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==",
2015 "cpu": [
2016 "arm64"
2017 ],
2018 "dev": true,
2019 + "license": "MIT",
2020 "optional": true,
2021 "os": [
2022 "android"
@@ -1971,13 +2030,14 @@
2030 }
2031 },
2032 "node_modules/@parcel/watcher-darwin-arm64": {
1974 - "version": "2.4.1",
1975 - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz",
1976 - "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==",
2033 + "version": "2.5.0",
2034 + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz",
2035 + "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==",
2036 "cpu": [
2037 "arm64"
2038 ],
2039 "dev": true,
2040 + "license": "MIT",
2041 "optional": true,
2042 "os": [
2043 "darwin"
@@ -1991,13 +2051,14 @@
2051 }
2052 },
2053 "node_modules/@parcel/watcher-darwin-x64": {
1994 - "version": "2.4.1",
1995 - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz",
1996 - "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==",
2054 + "version": "2.5.0",
2055 + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz",
2056 + "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==",
2057 "cpu": [
2058 "x64"
2059 ],
2060 "dev": true,
2061 + "license": "MIT",
2062 "optional": true,
2063 "os": [
2064 "darwin"
@@ -2011,13 +2072,14 @@
2072 }
2073 },
2074 "node_modules/@parcel/watcher-freebsd-x64": {
2014 - "version": "2.4.1",
2015 - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz",
2016 - "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==",
2075 + "version": "2.5.0",
2076 + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz",
2077 + "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==",
2078 "cpu": [
2079 "x64"
2080 ],
2081 "dev": true,
2082 + "license": "MIT",
2083 "optional": true,
2084 "os": [
2085 "freebsd"
@@ -2031,13 +2093,35 @@
2093 }
2094 },
2095 "node_modules/@parcel/watcher-linux-arm-glibc": {
2034 - "version": "2.4.1",
2035 - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz",
2036 - "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==",
2096 + "version": "2.5.0",
2097 + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz",
2098 + "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==",
2099 + "cpu": [
2100 + "arm"
2101 + ],
2102 + "dev": true,
2103 + "license": "MIT",
2104 + "optional": true,
2105 + "os": [
2106 + "linux"
2107 + ],
2108 + "engines": {
2109 + "node": ">= 10.0.0"
2110 + },
2111 + "funding": {
2112 + "type": "opencollective",
2113 + "url": "https://opencollective.com/parcel"
2114 + }
2115 + },
2116 + "node_modules/@parcel/watcher-linux-arm-musl": {
2117 + "version": "2.5.0",
2118 + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz",
2119 + "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==",
2120 "cpu": [
2121 "arm"
2122 ],
2123 "dev": true,
2124 + "license": "MIT",
2125 "optional": true,
2126 "os": [
2127 "linux"
@@ -2051,13 +2135,14 @@
2135 }
2136 },
2137 "node_modules/@parcel/watcher-linux-arm64-glibc": {
2054 - "version": "2.4.1",
2055 - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz",
2056 - "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==",
2138 + "version": "2.5.0",
2139 + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz",
2140 + "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==",
2141 "cpu": [
2142 "arm64"
2143 ],
2144 "dev": true,
2145 + "license": "MIT",
2146 "optional": true,
2147 "os": [
2148 "linux"
@@ -2071,13 +2156,14 @@
2156 }
2157 },
2158 "node_modules/@parcel/watcher-linux-arm64-musl": {
2074 - "version": "2.4.1",
2075 - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz",
2076 - "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==",
2159 + "version": "2.5.0",
2160 + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz",
2161 + "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==",
2162 "cpu": [
2163 "arm64"
2164 ],
2165 "dev": true,
2166 + "license": "MIT",
2167 "optional": true,
2168 "os": [
2169 "linux"
@@ -2091,13 +2177,14 @@
2177 }
2178 },
2179 "node_modules/@parcel/watcher-linux-x64-glibc": {
2094 - "version": "2.4.1",
2095 - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz",
2096 - "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==",
2180 + "version": "2.5.0",
2181 + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz",
2182 + "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==",
2183 "cpu": [
2184 "x64"
2185 ],
2186 "dev": true,
2187 + "license": "MIT",
2188 "optional": true,
2189 "os": [
2190 "linux"
@@ -2111,13 +2198,14 @@
2198 }
2199 },
2200 "node_modules/@parcel/watcher-linux-x64-musl": {
2114 - "version": "2.4.1",
2115 - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz",
2116 - "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==",
2201 + "version": "2.5.0",
2202 + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz",
2203 + "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==",
2204 "cpu": [
2205 "x64"
2206 ],
2207 "dev": true,
2208 + "license": "MIT",
2209 "optional": true,
2210 "os": [
2211 "linux"
@@ -2131,13 +2219,14 @@
2219 }
2220 },
2221 "node_modules/@parcel/watcher-win32-arm64": {
2134 - "version": "2.4.1",
2135 - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz",
2136 - "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==",
2222 + "version": "2.5.0",
2223 + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz",
2224 + "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==",
2225 "cpu": [
2226 "arm64"
2227 ],
2228 "dev": true,
2229 + "license": "MIT",
2230 "optional": true,
2231 "os": [
2232 "win32"
@@ -2151,13 +2240,14 @@
2240 }
2241 },
2242 "node_modules/@parcel/watcher-win32-ia32": {
2154 - "version": "2.4.1",
2155 - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz",
2156 - "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==",
2243 + "version": "2.5.0",
2244 + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz",
2245 + "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==",
2246 "cpu": [
2247 "ia32"
2248 ],
2249 "dev": true,
2250 + "license": "MIT",
2251 "optional": true,
2252 "os": [
2253 "win32"
@@ -2171,13 +2261,14 @@
2261 }
2262 },
2263 "node_modules/@parcel/watcher-win32-x64": {
2174 - "version": "2.4.1",
2175 - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz",
2176 - "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==",
2264 + "version": "2.5.0",
2265 + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz",
2266 + "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==",
2267 "cpu": [
2268 "x64"
2269 ],
2270 "dev": true,
2271 + "license": "MIT",
2272 "optional": true,
2273 "os": [
2274 "win32"
@@ -2194,6 +2285,7 @@
2285 "version": "0.11.0",
2286 "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
2287 "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
2288 + "license": "MIT",
2289 "optional": true,
2290 "engines": {
2291 "node": ">=14"
@@ -2204,6 +2296,7 @@
2296 "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz",
2297 "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==",
2298 "dev": true,
2299 + "license": "MIT",
2300 "engines": {
2301 "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
2302 },
@@ -2215,12 +2308,14 @@
2308 "version": "1.0.0-next.28",
2309 "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz",
2310 "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==",
2218 - "dev": true
2311 + "dev": true,
2312 + "license": "MIT"
2313 },
2314 "node_modules/@rollup/pluginutils": {
2315 "version": "5.1.3",
2316 "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz",
2317 "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==",
2318 + "license": "MIT",
2319 "dependencies": {
2320 "@types/estree": "^1.0.0",
2321 "estree-walker": "^2.0.2",
@@ -2239,152 +2334,191 @@
2334 }
2335 },
2336 "node_modules/@rollup/rollup-android-arm-eabi": {
2242 - "version": "4.24.0",
2243 - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz",
2244 - "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==",
2337 + "version": "4.27.4",
2338 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.4.tgz",
2339 + "integrity": "sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==",
2340 "cpu": [
2341 "arm"
2342 ],
2343 "dev": true,
2344 + "license": "MIT",
2345 "optional": true,
2346 "os": [
2347 "android"
2348 ]
2349 },
2350 "node_modules/@rollup/rollup-android-arm64": {
2255 - "version": "4.24.0",
2256 - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz",
2257 - "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==",
2351 + "version": "4.27.4",
2352 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.4.tgz",
2353 + "integrity": "sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==",
2354 "cpu": [
2355 "arm64"
2356 ],
2357 "dev": true,
2358 + "license": "MIT",
2359 "optional": true,
2360 "os": [
2361 "android"
2362 ]
2363 },
2364 "node_modules/@rollup/rollup-darwin-arm64": {
2268 - "version": "4.24.0",
2269 - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz",
2270 - "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==",
2365 + "version": "4.27.4",
2366 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.4.tgz",
2367 + "integrity": "sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==",
2368 "cpu": [
2369 "arm64"
2370 ],
2371 "dev": true,
2372 + "license": "MIT",
2373 "optional": true,
2374 "os": [
2375 "darwin"
2376 ]
2377 },
2378 "node_modules/@rollup/rollup-darwin-x64": {
2281 - "version": "4.24.0",
2282 - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz",
2283 - "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==",
2379 + "version": "4.27.4",
2380 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.4.tgz",
2381 + "integrity": "sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==",
2382 "cpu": [
2383 "x64"
2384 ],
2385 "dev": true,
2386 + "license": "MIT",
2387 "optional": true,
2388 "os": [
2389 "darwin"
2390 ]
2391 },
2392 + "node_modules/@rollup/rollup-freebsd-arm64": {
2393 + "version": "4.27.4",
2394 + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.4.tgz",
2395 + "integrity": "sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==",
2396 + "cpu": [
2397 + "arm64"
2398 + ],
2399 + "dev": true,
2400 + "license": "MIT",
2401 + "optional": true,
2402 + "os": [
2403 + "freebsd"
2404 + ]
2405 + },
2406 + "node_modules/@rollup/rollup-freebsd-x64": {
2407 + "version": "4.27.4",
2408 + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.4.tgz",
2409 + "integrity": "sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==",
2410 + "cpu": [
2411 + "x64"
2412 + ],
2413 + "dev": true,
2414 + "license": "MIT",
2415 + "optional": true,
2416 + "os": [
2417 + "freebsd"
2418 + ]
2419 + },
2420 "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
2294 - "version": "4.24.0",
2295 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz",
2296 - "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==",
2421 + "version": "4.27.4",
2422 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.4.tgz",
2423 + "integrity": "sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==",
2424 "cpu": [
2425 "arm"
2426 ],
2427 "dev": true,
2428 + "license": "MIT",
2429 "optional": true,
2430 "os": [
2431 "linux"
2432 ]
2433 },
2434 "node_modules/@rollup/rollup-linux-arm-musleabihf": {
2307 - "version": "4.24.0",
2308 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz",
2309 - "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==",
2435 + "version": "4.27.4",
2436 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.4.tgz",
2437 + "integrity": "sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==",
2438 "cpu": [
2439 "arm"
2440 ],
2441 "dev": true,
2442 + "license": "MIT",
2443 "optional": true,
2444 "os": [
2445 "linux"
2446 ]
2447 },
2448 "node_modules/@rollup/rollup-linux-arm64-gnu": {
2320 - "version": "4.24.0",
2321 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz",
2322 - "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==",
2449 + "version": "4.27.4",
2450 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.4.tgz",
2451 + "integrity": "sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==",
2452 "cpu": [
2453 "arm64"
2454 ],
2455 "dev": true,
2456 + "license": "MIT",
2457 "optional": true,
2458 "os": [
2459 "linux"
2460 ]
2461 },
2462 "node_modules/@rollup/rollup-linux-arm64-musl": {
2333 - "version": "4.24.0",
2334 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz",
2335 - "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==",
2463 + "version": "4.27.4",
2464 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.4.tgz",
2465 + "integrity": "sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==",
2466 "cpu": [
2467 "arm64"
2468 ],
2469 "dev": true,
2470 + "license": "MIT",
2471 "optional": true,
2472 "os": [
2473 "linux"
2474 ]
2475 },
2476 "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
2346 - "version": "4.24.0",
2347 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz",
2348 - "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==",
2477 + "version": "4.27.4",
2478 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.4.tgz",
2479 + "integrity": "sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==",
2480 "cpu": [
2481 "ppc64"
2482 ],
2483 "dev": true,
2484 + "license": "MIT",
2485 "optional": true,
2486 "os": [
2487 "linux"
2488 ]
2489 },
2490 "node_modules/@rollup/rollup-linux-riscv64-gnu": {
2359 - "version": "4.24.0",
2360 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz",
2361 - "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==",
2491 + "version": "4.27.4",
2492 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.4.tgz",
2493 + "integrity": "sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==",
2494 "cpu": [
2495 "riscv64"
2496 ],
2497 "dev": true,
2498 + "license": "MIT",
2499 "optional": true,
2500 "os": [
2501 "linux"
2502 ]
2503 },
2504 "node_modules/@rollup/rollup-linux-s390x-gnu": {
2372 - "version": "4.24.0",
2373 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz",
2374 - "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==",
2505 + "version": "4.27.4",
2506 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.4.tgz",
2507 + "integrity": "sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==",
2508 "cpu": [
2509 "s390x"
2510 ],
2511 "dev": true,
2512 + "license": "MIT",
2513 "optional": true,
2514 "os": [
2515 "linux"
2516 ]
2517 },
2518 "node_modules/@rollup/rollup-linux-x64-gnu": {
2385 - "version": "4.27.3",
2386 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.3.tgz",
2387 - "integrity": "sha512-/6bn6pp1fsCGEY5n3yajmzZQAh+mW4QPItbiWxs69zskBzJuheb3tNynEjL+mKOsUSFK11X4LYF2BwwXnzWleA==",
2519 + "version": "4.27.4",
2520 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.4.tgz",
2521 + "integrity": "sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==",
2522 "cpu": [
2523 "x64"
2524 ],
@@ -2395,52 +2529,56 @@
2529 ]
2530 },
2531 "node_modules/@rollup/rollup-linux-x64-musl": {
2398 - "version": "4.24.0",
2399 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz",
2400 - "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==",
2532 + "version": "4.27.4",
2533 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.4.tgz",
2534 + "integrity": "sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==",
2535 "cpu": [
2536 "x64"
2537 ],
2538 "dev": true,
2539 + "license": "MIT",
2540 "optional": true,
2541 "os": [
2542 "linux"
2543 ]
2544 },
2545 "node_modules/@rollup/rollup-win32-arm64-msvc": {
2411 - "version": "4.24.0",
2412 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz",
2413 - "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==",
2546 + "version": "4.27.4",
2547 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.4.tgz",
2548 + "integrity": "sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==",
2549 "cpu": [
2550 "arm64"
2551 ],
2552 "dev": true,
2553 + "license": "MIT",
2554 "optional": true,
2555 "os": [
2556 "win32"
2557 ]
2558 },
2559 "node_modules/@rollup/rollup-win32-ia32-msvc": {
2424 - "version": "4.24.0",
2425 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz",
2426 - "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==",
2560 + "version": "4.27.4",
2561 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.4.tgz",
2562 + "integrity": "sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==",
2563 "cpu": [
2564 "ia32"
2565 ],
2566 "dev": true,
2567 + "license": "MIT",
2568 "optional": true,
2569 "os": [
2570 "win32"
2571 ]
2572 },
2573 "node_modules/@rollup/rollup-win32-x64-msvc": {
2437 - "version": "4.24.0",
2438 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz",
2439 - "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==",
2574 + "version": "4.27.4",
2575 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.4.tgz",
2576 + "integrity": "sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==",
2577 "cpu": [
2578 "x64"
2579 ],
2580 "dev": true,
2581 + "license": "MIT",
2582 "optional": true,
2583 "os": [
2584 "win32"
@@ -2512,6 +2650,7 @@
2650 "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz",
2651 "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==",
2652 "dev": true,
2653 + "license": "BSD-3-Clause",
2654 "dependencies": {
2655 "@hapi/hoek": "^9.0.0"
2656 }
@@ -2520,18 +2659,21 @@
2659 "version": "3.0.1",
2660 "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz",
2661 "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==",
2523 - "dev": true
2662 + "dev": true,
2663 + "license": "BSD-3-Clause"
2664 },
2665 "node_modules/@sideway/pinpoint": {
2666 "version": "2.0.0",
2667 "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
2668 "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
2529 - "dev": true
2669 + "dev": true,
2670 + "license": "BSD-3-Clause"
2671 },
2672 "node_modules/@sindresorhus/merge-streams": {
2673 "version": "2.3.0",
2674 "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz",
2675 "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==",
2676 + "license": "MIT",
2677 "engines": {
2678 "node": ">=18"
2679 },
@@ -2540,12 +2682,13 @@
2682 }
2683 },
2684 "node_modules/@stylistic/eslint-plugin": {
2543 - "version": "2.10.1",
2544 - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.10.1.tgz",
2545 - "integrity": "sha512-U+4yzNXElTf9q0kEfnloI9XbOyD4cnEQCxjUI94q0+W++0GAEQvJ/slwEj9lwjDHfGADRSr+Tco/z0XJvmDfCQ==",
2685 + "version": "2.11.0",
2686 + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.11.0.tgz",
2687 + "integrity": "sha512-PNRHbydNG5EH8NK4c+izdJlxajIR6GxcUhzsYNRsn6Myep4dsZt0qFCz3rCPnkvgO5FYibDcMqgNHUT+zvjYZw==",
2688 "dev": true,
2689 + "license": "MIT",
2690 "dependencies": {
2548 - "@typescript-eslint/utils": "^8.12.2",
2691 + "@typescript-eslint/utils": "^8.13.0",
2692 "eslint-visitor-keys": "^4.2.0",
2693 "espree": "^10.3.0",
2694 "estraverse": "^5.3.0",
@@ -2558,12 +2701,74 @@
2701 "eslint": ">=8.40.0"
2702 }
2703 },
2561 - "node_modules/@tailwindcss/container-queries": {
2562 - "version": "0.1.1",
2563 - "resolved": "https://registry.npmjs.org/@tailwindcss/container-queries/-/container-queries-0.1.1.tgz",
2564 - "integrity": "sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==",
2704 + "node_modules/@svgdotjs/svg.draggable.js": {
2705 + "version": "3.0.4",
2706 + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.draggable.js/-/svg.draggable.js-3.0.4.tgz",
2707 + "integrity": "sha512-vWi/Col5Szo74HJVBgMHz23kLVljt3jvngmh0DzST45iO2ubIZ487uUAHIxSZH2tVRyiaaTL+Phaasgp4gUD2g==",
2708 + "license": "MIT",
2709 + "peer": true,
2710 "peerDependencies": {
2566 - "tailwindcss": ">=3.2.0"
2711 + "@svgdotjs/svg.js": "^3.2.4"
2712 + }
2713 + },
2714 + "node_modules/@svgdotjs/svg.filter.js": {
2715 + "version": "3.0.8",
2716 + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.filter.js/-/svg.filter.js-3.0.8.tgz",
2717 + "integrity": "sha512-YshF2YDaeRA2StyzAs5nUPrev7npQ38oWD0eTRwnsciSL2KrRPMoUw8BzjIXItb3+dccKGTX3IQOd2NFzmHkog==",
2718 + "license": "MIT",
2719 + "peer": true,
2720 + "dependencies": {
2721 + "@svgdotjs/svg.js": "^3.1.1"
2722 + },
2723 + "engines": {
2724 + "node": ">= 0.8.0"
2725 + }
2726 + },
2727 + "node_modules/@svgdotjs/svg.js": {
2728 + "version": "3.2.4",
2729 + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.js/-/svg.js-3.2.4.tgz",
2730 + "integrity": "sha512-BjJ/7vWNowlX3Z8O4ywT58DqbNRyYlkk6Yz/D13aB7hGmfQTvGX4Tkgtm/ApYlu9M7lCQi15xUEidqMUmdMYwg==",
2731 + "license": "MIT",
2732 + "peer": true,
2733 + "funding": {
2734 + "type": "github",
2735 + "url": "https://github.com/sponsors/Fuzzyma"
2736 + }
2737 + },
2738 + "node_modules/@svgdotjs/svg.resize.js": {
2739 + "version": "2.0.5",
2740 + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.resize.js/-/svg.resize.js-2.0.5.tgz",
2741 + "integrity": "sha512-4heRW4B1QrJeENfi7326lUPYBCevj78FJs8kfeDxn5st0IYPIRXoTtOSYvTzFWgaWWXd3YCDE6ao4fmv91RthA==",
2742 + "license": "MIT",
2743 + "peer": true,
2744 + "engines": {
2745 + "node": ">= 14.18"
2746 + },
2747 + "peerDependencies": {
2748 + "@svgdotjs/svg.js": "^3.2.4",
2749 + "@svgdotjs/svg.select.js": "^4.0.1"
2750 + }
2751 + },
2752 + "node_modules/@svgdotjs/svg.select.js": {
2753 + "version": "4.0.2",
2754 + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.select.js/-/svg.select.js-4.0.2.tgz",
2755 + "integrity": "sha512-5gWdrvoQX3keo03SCmgaBbD+kFftq0F/f2bzCbNnpkkvW6tk4rl4MakORzFuNjvXPWwB4az9GwuvVxQVnjaK2g==",
2756 + "license": "MIT",
2757 + "peer": true,
2758 + "engines": {
2759 + "node": ">= 14.18"
2760 + },
2761 + "peerDependencies": {
2762 + "@svgdotjs/svg.js": "^3.2.4"
2763 + }
2764 + },
2765 + "node_modules/@tailwindcss/container-queries": {
2766 + "version": "0.1.1",
2767 + "resolved": "https://registry.npmjs.org/@tailwindcss/container-queries/-/container-queries-0.1.1.tgz",
2768 + "integrity": "sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==",
2769 + "license": "MIT",
2770 + "peerDependencies": {
2771 + "tailwindcss": ">=3.2.0"
2772 }
2773 },
2774 "node_modules/@trysound/sax": {
@@ -2571,6 +2776,7 @@
2776 "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
2777 "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
2778 "dev": true,
2779 + "license": "ISC",
2780 "engines": {
2781 "node": ">=10.13.0"
2782 }
@@ -2579,19 +2785,22 @@
2785 "version": "20.1.4",
2786 "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.4.tgz",
2787 "integrity": "sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==",
2582 - "dev": true
2788 + "dev": true,
2789 + "license": "MIT"
2790 },
2791 "node_modules/@types/bytes": {
2792 "version": "3.1.4",
2793 "resolved": "https://registry.npmjs.org/@types/bytes/-/bytes-3.1.4.tgz",
2794 "integrity": "sha512-A0uYgOj3zNc4hNjHc5lYUfJQ/HVyBXiUMKdXd7ysclaE6k9oJdavQzODHuwjpUu2/boCP8afjQYi8z/GtvNCWA==",
2588 - "dev": true
2795 + "dev": true,
2796 + "license": "MIT"
2797 },
2798 "node_modules/@types/debug": {
2799 "version": "4.1.12",
2800 "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
2801 "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
2802 "dev": true,
2803 + "license": "MIT",
2804 "dependencies": {
2805 "@types/ms": "*"
2806 }
@@ -2599,19 +2808,22 @@
2808 "node_modules/@types/estree": {
2809 "version": "1.0.6",
2810 "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
2602 - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="
2811 + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
2812 + "license": "MIT"
2813 },
2814 "node_modules/@types/file-saver": {
2815 "version": "2.0.7",
2816 "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.7.tgz",
2817 "integrity": "sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==",
2608 - "dev": true
2818 + "dev": true,
2819 + "license": "MIT"
2820 },
2821 "node_modules/@types/fs-extra": {
2822 "version": "11.0.4",
2823 "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz",
2824 "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==",
2825 "dev": true,
2826 + "license": "MIT",
2827 "dependencies": {
2828 "@types/jsonfile": "*",
2829 "@types/node": "*"
@@ -2631,6 +2843,7 @@
2843 "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz",
2844 "integrity": "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==",
2845 "dev": true,
2846 + "license": "MIT",
2847 "dependencies": {
2848 "@types/node": "*",
2849 "@types/tough-cookie": "*",
@@ -2641,13 +2854,15 @@
2854 "version": "7.0.15",
2855 "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
2856 "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
2644 - "dev": true
2857 + "dev": true,
2858 + "license": "MIT"
2859 },
2860 "node_modules/@types/jsonfile": {
2861 "version": "6.1.4",
2862 "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz",
2863 "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==",
2864 "dev": true,
2865 + "license": "MIT",
2866 "dependencies": {
2867 "@types/node": "*"
2868 }
@@ -2655,17 +2870,20 @@
2870 "node_modules/@types/katex": {
2871 "version": "0.16.7",
2872 "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz",
2658 - "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ=="
2873 + "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==",
2874 + "license": "MIT"
2875 },
2876 "node_modules/@types/lodash": {
2877 "version": "4.17.13",
2878 "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.13.tgz",
2663 - "integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg=="
2879 + "integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==",
2880 + "license": "MIT"
2881 },
2882 "node_modules/@types/lodash-es": {
2883 "version": "4.17.12",
2884 "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz",
2885 "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
2886 + "license": "MIT",
2887 "dependencies": {
2888 "@types/lodash": "*"
2889 }
@@ -2674,6 +2892,7 @@
2892 "version": "4.0.4",
2893 "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
2894 "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
2895 + "license": "MIT",
2896 "dependencies": {
2897 "@types/unist": "*"
2898 }
@@ -2682,100 +2901,103 @@
2901 "version": "3.0.5",
2902 "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
2903 "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==",
2685 - "dev": true
2904 + "dev": true,
2905 + "license": "MIT"
2906 },
2907 "node_modules/@types/ms": {
2908 "version": "0.7.34",
2909 "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz",
2910 "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==",
2691 - "dev": true
2911 + "dev": true,
2912 + "license": "MIT"
2913 },
2914 "node_modules/@types/node": {
2694 - "version": "22.9.1",
2695 - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.1.tgz",
2696 - "integrity": "sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg==",
2915 + "version": "22.10.0",
2916 + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.0.tgz",
2917 + "integrity": "sha512-XC70cRZVElFHfIUB40FgZOBbgJYFKKMa5nb9lxcwYstFG/Mi+/Y0bGS+rs6Dmhmkpq4pnNiLiuZAbc02YCOnmA==",
2918 "dev": true,
2919 "license": "MIT",
2920 "dependencies": {
2700 - "undici-types": "~6.19.8"
2921 + "undici-types": "~6.20.0"
2922 }
2923 },
2924 "node_modules/@types/normalize-package-data": {
2925 "version": "2.4.4",
2926 "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
2927 "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
2707 - "dev": true
2928 + "dev": true,
2929 + "license": "MIT"
2930 },
2931 "node_modules/@types/parse-json": {
2932 "version": "4.0.2",
2933 "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
2934 "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
2713 - "dev": true
2714 - },
2715 - "node_modules/@types/semver": {
2716 - "version": "7.5.8",
2717 - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
2718 - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
2935 "dev": true,
2720 - "optional": true,
2721 - "peer": true
2936 + "license": "MIT"
2937 },
2938 "node_modules/@types/sinonjs__fake-timers": {
2939 "version": "8.1.1",
2940 "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
2941 "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==",
2727 - "dev": true
2942 + "dev": true,
2943 + "license": "MIT"
2944 },
2945 "node_modules/@types/sizzle": {
2946 "version": "2.3.9",
2947 "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.9.tgz",
2948 "integrity": "sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==",
2733 - "dev": true
2949 + "dev": true,
2950 + "license": "MIT"
2951 },
2952 "node_modules/@types/tough-cookie": {
2953 "version": "4.0.5",
2954 "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz",
2955 "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==",
2739 - "dev": true
2956 + "dev": true,
2957 + "license": "MIT"
2958 },
2959 "node_modules/@types/unist": {
2960 "version": "3.0.3",
2961 "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
2744 - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="
2962 + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
2963 + "license": "MIT"
2964 },
2965 "node_modules/@types/validator": {
2966 "version": "13.12.2",
2967 "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.2.tgz",
2968 "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==",
2750 - "dev": true
2969 + "dev": true,
2970 + "license": "MIT"
2971 },
2972 "node_modules/@types/web-bluetooth": {
2973 "version": "0.0.20",
2974 "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
2755 - "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow=="
2975 + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==",
2976 + "license": "MIT"
2977 },
2978 "node_modules/@types/yauzl": {
2979 "version": "2.10.3",
2980 "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
2981 "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
2982 "dev": true,
2983 + "license": "MIT",
2984 "optional": true,
2985 "dependencies": {
2986 "@types/node": "*"
2987 }
2988 },
2989 "node_modules/@typescript-eslint/eslint-plugin": {
2768 - "version": "8.15.0",
2769 - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.15.0.tgz",
2770 - "integrity": "sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==",
2990 + "version": "8.16.0",
2991 + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.16.0.tgz",
2992 + "integrity": "sha512-5YTHKV8MYlyMI6BaEG7crQ9BhSc8RxzshOReKwZwRWN0+XvvTOm+L/UYLCYxFpfwYuAAqhxiq4yae0CMFwbL7Q==",
2993 "dev": true,
2994 "license": "MIT",
2995 "dependencies": {
2996 "@eslint-community/regexpp": "^4.10.0",
2775 - "@typescript-eslint/scope-manager": "8.15.0",
2776 - "@typescript-eslint/type-utils": "8.15.0",
2777 - "@typescript-eslint/utils": "8.15.0",
2778 - "@typescript-eslint/visitor-keys": "8.15.0",
2997 + "@typescript-eslint/scope-manager": "8.16.0",
2998 + "@typescript-eslint/type-utils": "8.16.0",
2999 + "@typescript-eslint/utils": "8.16.0",
3000 + "@typescript-eslint/visitor-keys": "8.16.0",
3001 "graphemer": "^1.4.0",
3002 "ignore": "^5.3.1",
3003 "natural-compare": "^1.4.0",
@@ -2799,16 +3021,16 @@
3021 }
3022 },
3023 "node_modules/@typescript-eslint/parser": {
2802 - "version": "8.15.0",
2803 - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.15.0.tgz",
2804 - "integrity": "sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==",
3024 + "version": "8.16.0",
3025 + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.16.0.tgz",
3026 + "integrity": "sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w==",
3027 "dev": true,
3028 "license": "BSD-2-Clause",
3029 "dependencies": {
2808 - "@typescript-eslint/scope-manager": "8.15.0",
2809 - "@typescript-eslint/types": "8.15.0",
2810 - "@typescript-eslint/typescript-estree": "8.15.0",
2811 - "@typescript-eslint/visitor-keys": "8.15.0",
3030 + "@typescript-eslint/scope-manager": "8.16.0",
3031 + "@typescript-eslint/types": "8.16.0",
3032 + "@typescript-eslint/typescript-estree": "8.16.0",
3033 + "@typescript-eslint/visitor-keys": "8.16.0",
3034 "debug": "^4.3.4"
3035 },
3036 "engines": {
@@ -2828,14 +3050,14 @@
3050 }
3051 },
3052 "node_modules/@typescript-eslint/scope-manager": {
2831 - "version": "8.15.0",
2832 - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.15.0.tgz",
2833 - "integrity": "sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==",
3053 + "version": "8.16.0",
3054 + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.16.0.tgz",
3055 + "integrity": "sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==",
3056 "dev": true,
3057 "license": "MIT",
3058 "dependencies": {
2837 - "@typescript-eslint/types": "8.15.0",
2838 - "@typescript-eslint/visitor-keys": "8.15.0"
3059 + "@typescript-eslint/types": "8.16.0",
3060 + "@typescript-eslint/visitor-keys": "8.16.0"
3061 },
3062 "engines": {
3063 "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2846,14 +3068,14 @@
3068 }
3069 },
3070 "node_modules/@typescript-eslint/type-utils": {
2849 - "version": "8.15.0",
2850 - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.15.0.tgz",
2851 - "integrity": "sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==",
3071 + "version": "8.16.0",
3072 + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.16.0.tgz",
3073 + "integrity": "sha512-IqZHGG+g1XCWX9NyqnI/0CX5LL8/18awQqmkZSl2ynn8F76j579dByc0jhfVSnSnhf7zv76mKBQv9HQFKvDCgg==",
3074 "dev": true,
3075 "license": "MIT",
3076 "dependencies": {
2855 - "@typescript-eslint/typescript-estree": "8.15.0",
2856 - "@typescript-eslint/utils": "8.15.0",
3077 + "@typescript-eslint/typescript-estree": "8.16.0",
3078 + "@typescript-eslint/utils": "8.16.0",
3079 "debug": "^4.3.4",
3080 "ts-api-utils": "^1.3.0"
3081 },
@@ -2874,9 +3096,9 @@
3096 }
3097 },
3098 "node_modules/@typescript-eslint/types": {
2877 - "version": "8.15.0",
2878 - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.15.0.tgz",
2879 - "integrity": "sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==",
3099 + "version": "8.16.0",
3100 + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.16.0.tgz",
3101 + "integrity": "sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==",
3102 "dev": true,
3103 "license": "MIT",
3104 "engines": {
@@ -2888,14 +3110,14 @@
3110 }
3111 },
3112 "node_modules/@typescript-eslint/typescript-estree": {
2891 - "version": "8.15.0",
2892 - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.15.0.tgz",
2893 - "integrity": "sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==",
3113 + "version": "8.16.0",
3114 + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.16.0.tgz",
3115 + "integrity": "sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw==",
3116 "dev": true,
3117 "license": "BSD-2-Clause",
3118 "dependencies": {
2897 - "@typescript-eslint/types": "8.15.0",
2898 - "@typescript-eslint/visitor-keys": "8.15.0",
3119 + "@typescript-eslint/types": "8.16.0",
3120 + "@typescript-eslint/visitor-keys": "8.16.0",
3121 "debug": "^4.3.4",
3122 "fast-glob": "^3.3.2",
3123 "is-glob": "^4.0.3",
@@ -2917,16 +3139,16 @@
3139 }
3140 },
3141 "node_modules/@typescript-eslint/utils": {
2920 - "version": "8.15.0",
2921 - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.15.0.tgz",
2922 - "integrity": "sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==",
3142 + "version": "8.16.0",
3143 + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.16.0.tgz",
3144 + "integrity": "sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==",
3145 "dev": true,
3146 "license": "MIT",
3147 "dependencies": {
3148 "@eslint-community/eslint-utils": "^4.4.0",
2927 - "@typescript-eslint/scope-manager": "8.15.0",
2928 - "@typescript-eslint/types": "8.15.0",
2929 - "@typescript-eslint/typescript-estree": "8.15.0"
3149 + "@typescript-eslint/scope-manager": "8.16.0",
3150 + "@typescript-eslint/types": "8.16.0",
3151 + "@typescript-eslint/typescript-estree": "8.16.0"
3152 },
3153 "engines": {
3154 "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2945,13 +3167,13 @@
3167 }
3168 },
3169 "node_modules/@typescript-eslint/visitor-keys": {
2948 - "version": "8.15.0",
2949 - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.15.0.tgz",
2950 - "integrity": "sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==",
3170 + "version": "8.16.0",
3171 + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.16.0.tgz",
3172 + "integrity": "sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==",
3173 "dev": true,
3174 "license": "MIT",
3175 "dependencies": {
2954 - "@typescript-eslint/types": "8.15.0",
3176 + "@typescript-eslint/types": "8.16.0",
3177 "eslint-visitor-keys": "^4.2.0"
3178 },
3179 "engines": {
@@ -2965,703 +3187,355 @@
3187 "node_modules/@ungap/structured-clone": {
3188 "version": "1.2.0",
3189 "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
2968 - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ=="
3190 + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
3191 + "license": "ISC"
3192 },
2970 - "node_modules/@unocss/config": {
2971 - "version": "0.56.5",
2972 - "resolved": "https://registry.npmjs.org/@unocss/config/-/config-0.56.5.tgz",
2973 - "integrity": "sha512-rscnFIYgUlN/0hXHdhANyjFcDjDutt3JO0ZRITdNLzoglh7GVNiDTURBJwUZejF/vGJ7IkMd3qOdNhPFuRY1Bg==",
3193 + "node_modules/@vitejs/plugin-vue": {
3194 + "version": "5.2.1",
3195 + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz",
3196 + "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==",
3197 "dev": true,
2975 - "optional": true,
2976 - "peer": true,
3198 + "license": "MIT",
3199 + "engines": {
3200 + "node": "^18.0.0 || >=20.0.0"
3201 + },
3202 + "peerDependencies": {
3203 + "vite": "^5.0.0 || ^6.0.0",
3204 + "vue": "^3.2.25"
3205 + }
3206 + },
3207 + "node_modules/@vitejs/plugin-vue-jsx": {
3208 + "version": "4.1.1",
3209 + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-4.1.1.tgz",
3210 + "integrity": "sha512-uMJqv/7u1zz/9NbWAD3XdjaY20tKTf17XVfQ9zq4wY1BjsB/PjpJPMe2xiG39QpP4ZdhYNhm4Hvo66uJrykNLA==",
3211 + "dev": true,
3212 + "license": "MIT",
3213 "dependencies": {
2978 - "@unocss/core": "0.56.5",
2979 - "unconfig": "^0.3.10"
3214 + "@babel/core": "^7.26.0",
3215 + "@babel/plugin-transform-typescript": "^7.25.9",
3216 + "@vue/babel-plugin-jsx": "^1.2.5"
3217 },
3218 "engines": {
2982 - "node": ">=14"
3219 + "node": "^18.0.0 || >=20.0.0"
3220 },
2984 - "funding": {
2985 - "url": "https://github.com/sponsors/antfu"
3221 + "peerDependencies": {
3222 + "vite": "^5.0.0 || ^6.0.0",
3223 + "vue": "^3.0.0"
3224 }
3225 },
2988 - "node_modules/@unocss/core": {
2989 - "version": "0.56.5",
2990 - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-0.56.5.tgz",
2991 - "integrity": "sha512-fx5VhOjSHn0HdV2D34pEwFMAHJcJQRTCp1xEE4GzxY1irXzaa+m2aYf5PZjmDxehiOC16IH7TO9FOWANXk1E0w==",
3226 + "node_modules/@vitest/eslint-plugin": {
3227 + "version": "1.1.12",
3228 + "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.1.12.tgz",
3229 + "integrity": "sha512-iv9K9fz9qRxBo9J/PGSMcLdOFIKqtFZ6THqSVG/jW8CJZFkIWLxPduCTXkbyG6FNKgL49fkv348nSgmfqCU6FA==",
3230 "dev": true,
2993 - "optional": true,
2994 - "peer": true,
2995 - "funding": {
2996 - "url": "https://github.com/sponsors/antfu"
3231 + "license": "MIT",
3232 + "peerDependencies": {
3233 + "@typescript-eslint/utils": ">= 8.0",
3234 + "eslint": ">= 8.57.0",
3235 + "typescript": ">= 5.0.0",
3236 + "vitest": "*"
3237 + },
3238 + "peerDependenciesMeta": {
3239 + "typescript": {
3240 + "optional": true
3241 + },
3242 + "vitest": {
3243 + "optional": true
3244 + }
3245 }
3246 },
2999 - "node_modules/@unocss/eslint-plugin": {
3000 - "version": "0.56.5",
3001 - "resolved": "https://registry.npmjs.org/@unocss/eslint-plugin/-/eslint-plugin-0.56.5.tgz",
3002 - "integrity": "sha512-nMVw/kc0sYU5i8UBU1rEahzKhZRPTUjCztpPzo2KUKFKLBPAbTv0gJAOmU/n2kV3YiGk5Tl6jmShxu1MHjk5rA==",
3247 + "node_modules/@vitest/expect": {
3248 + "version": "2.1.6",
3249 + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.6.tgz",
3250 + "integrity": "sha512-9M1UR9CAmrhJOMoSwVnPh2rELPKhYo0m/CSgqw9PyStpxtkwhmdM6XYlXGKeYyERY1N6EIuzkQ7e3Lm1WKCoUg==",
3251 "dev": true,
3004 - "optional": true,
3005 - "peer": true,
3252 + "license": "MIT",
3253 "dependencies": {
3007 - "@typescript-eslint/utils": "^6.7.3",
3008 - "@unocss/config": "0.56.5",
3009 - "@unocss/core": "0.56.5",
3010 - "magic-string": "^0.30.3",
3011 - "synckit": "^0.8.5"
3012 - },
3013 - "engines": {
3014 - "node": ">=14"
3254 + "@vitest/spy": "2.1.6",
3255 + "@vitest/utils": "2.1.6",
3256 + "chai": "^5.1.2",
3257 + "tinyrainbow": "^1.2.0"
3258 },
3259 "funding": {
3017 - "url": "https://github.com/sponsors/antfu"
3260 + "url": "https://opencollective.com/vitest"
3261 }
3262 },
3020 - "node_modules/@unocss/eslint-plugin/node_modules/@eslint/eslintrc": {
3021 - "version": "2.1.4",
3022 - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
3023 - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
3263 + "node_modules/@vitest/mocker": {
3264 + "version": "2.1.6",
3265 + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.6.tgz",
3266 + "integrity": "sha512-MHZp2Z+Q/A3am5oD4WSH04f9B0T7UvwEb+v5W0kCYMhtXGYbdyl2NUk1wdSMqGthmhpiThPDp/hEoVwu16+u1A==",
3267 "dev": true,
3025 - "optional": true,
3026 - "peer": true,
3268 + "license": "MIT",
3269 "dependencies": {
3028 - "ajv": "^6.12.4",
3029 - "debug": "^4.3.2",
3030 - "espree": "^9.6.0",
3031 - "globals": "^13.19.0",
3032 - "ignore": "^5.2.0",
3033 - "import-fresh": "^3.2.1",
3034 - "js-yaml": "^4.1.0",
3035 - "minimatch": "^3.1.2",
3036 - "strip-json-comments": "^3.1.1"
3037 - },
3038 - "engines": {
3039 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
3270 + "@vitest/spy": "2.1.6",
3271 + "estree-walker": "^3.0.3",
3272 + "magic-string": "^0.30.12"
3273 },
3274 "funding": {
3042 - "url": "https://opencollective.com/eslint"
3275 + "url": "https://opencollective.com/vitest"
3276 + },
3277 + "peerDependencies": {
3278 + "msw": "^2.4.9",
3279 + "vite": "^5.0.0 || ^6.0.0"
3280 + },
3281 + "peerDependenciesMeta": {
3282 + "msw": {
3283 + "optional": true
3284 + },
3285 + "vite": {
3286 + "optional": true
3287 + }
3288 }
3289 },
3045 - "node_modules/@unocss/eslint-plugin/node_modules/@typescript-eslint/scope-manager": {
3046 - "version": "6.21.0",
3047 - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz",
3048 - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==",
3290 + "node_modules/@vitest/mocker/node_modules/estree-walker": {
3291 + "version": "3.0.3",
3292 + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
3293 + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
3294 "dev": true,
3050 - "optional": true,
3051 - "peer": true,
3295 + "license": "MIT",
3296 "dependencies": {
3053 - "@typescript-eslint/types": "6.21.0",
3054 - "@typescript-eslint/visitor-keys": "6.21.0"
3055 - },
3056 - "engines": {
3057 - "node": "^16.0.0 || >=18.0.0"
3058 - },
3059 - "funding": {
3060 - "type": "opencollective",
3061 - "url": "https://opencollective.com/typescript-eslint"
3297 + "@types/estree": "^1.0.0"
3298 }
3299 },
3064 - "node_modules/@unocss/eslint-plugin/node_modules/@typescript-eslint/types": {
3065 - "version": "6.21.0",
3066 - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz",
3067 - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==",
3300 + "node_modules/@vitest/pretty-format": {
3301 + "version": "2.1.6",
3302 + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.6.tgz",
3303 + "integrity": "sha512-exZyLcEnHgDMKc54TtHca4McV4sKT+NKAe9ix/yhd/qkYb/TP8HTyXRFDijV19qKqTZM0hPL4753zU/U8L/gAA==",
3304 "dev": true,
3069 - "optional": true,
3070 - "peer": true,
3071 - "engines": {
3072 - "node": "^16.0.0 || >=18.0.0"
3305 + "license": "MIT",
3306 + "dependencies": {
3307 + "tinyrainbow": "^1.2.0"
3308 },
3309 "funding": {
3075 - "type": "opencollective",
3076 - "url": "https://opencollective.com/typescript-eslint"
3310 + "url": "https://opencollective.com/vitest"
3311 }
3312 },
3079 - "node_modules/@unocss/eslint-plugin/node_modules/@typescript-eslint/utils": {
3080 - "version": "6.21.0",
3081 - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz",
3082 - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==",
3313 + "node_modules/@vitest/runner": {
3314 + "version": "2.1.6",
3315 + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.6.tgz",
3316 + "integrity": "sha512-SjkRGSFyrA82m5nz7To4CkRSEVWn/rwQISHoia/DB8c6IHIhaE/UNAo+7UfeaeJRE979XceGl00LNkIz09RFsA==",
3317 "dev": true,
3084 - "optional": true,
3085 - "peer": true,
3318 + "license": "MIT",
3319 "dependencies": {
3087 - "@eslint-community/eslint-utils": "^4.4.0",
3088 - "@types/json-schema": "^7.0.12",
3089 - "@types/semver": "^7.5.0",
3090 - "@typescript-eslint/scope-manager": "6.21.0",
3091 - "@typescript-eslint/types": "6.21.0",
3092 - "@typescript-eslint/typescript-estree": "6.21.0",
3093 - "semver": "^7.5.4"
3094 - },
3095 - "engines": {
3096 - "node": "^16.0.0 || >=18.0.0"
3320 + "@vitest/utils": "2.1.6",
3321 + "pathe": "^1.1.2"
3322 },
3323 "funding": {
3099 - "type": "opencollective",
3100 - "url": "https://opencollective.com/typescript-eslint"
3101 - },
3102 - "peerDependencies": {
3103 - "eslint": "^7.0.0 || ^8.0.0"
3324 + "url": "https://opencollective.com/vitest"
3325 }
3326 },
3106 - "node_modules/@unocss/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": {
3107 - "version": "6.21.0",
3108 - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz",
3109 - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==",
3327 + "node_modules/@vitest/snapshot": {
3328 + "version": "2.1.6",
3329 + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.6.tgz",
3330 + "integrity": "sha512-5JTWHw8iS9l3v4/VSuthCndw1lN/hpPB+mlgn1BUhFbobeIUj1J1V/Bj2t2ovGEmkXLTckFjQddsxS5T6LuVWw==",
3331 "dev": true,
3111 - "optional": true,
3112 - "peer": true,
3332 + "license": "MIT",
3333 "dependencies": {
3114 - "@typescript-eslint/types": "6.21.0",
3115 - "eslint-visitor-keys": "^3.4.1"
3116 - },
3117 - "engines": {
3118 - "node": "^16.0.0 || >=18.0.0"
3334 + "@vitest/pretty-format": "2.1.6",
3335 + "magic-string": "^0.30.12",
3336 + "pathe": "^1.1.2"
3337 },
3338 "funding": {
3121 - "type": "opencollective",
3122 - "url": "https://opencollective.com/typescript-eslint"
3339 + "url": "https://opencollective.com/vitest"
3340 }
3341 },
3125 - "node_modules/@unocss/eslint-plugin/node_modules/argparse": {
3126 - "version": "2.0.1",
3127 - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
3128 - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
3129 - "dev": true,
3130 - "optional": true,
3131 - "peer": true
3132 - },
3133 - "node_modules/@unocss/eslint-plugin/node_modules/brace-expansion": {
3134 - "version": "1.1.11",
3135 - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
3136 - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
3342 + "node_modules/@vitest/spy": {
3343 + "version": "2.1.6",
3344 + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.6.tgz",
3345 + "integrity": "sha512-oTFObV8bd4SDdRka5O+mSh5w9irgx5IetrD5i+OsUUsk/shsBoHifwCzy45SAORzAhtNiprUVaK3hSCCzZh1jQ==",
3346 "dev": true,
3138 - "optional": true,
3139 - "peer": true,
3347 + "license": "MIT",
3348 "dependencies": {
3141 - "balanced-match": "^1.0.0",
3142 - "concat-map": "0.0.1"
3349 + "tinyspy": "^3.0.2"
3350 + },
3351 + "funding": {
3352 + "url": "https://opencollective.com/vitest"
3353 }
3354 },
3145 - "node_modules/@unocss/eslint-plugin/node_modules/eslint": {
3146 - "version": "8.57.1",
3147 - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
3148 - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
3149 - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
3355 + "node_modules/@vitest/utils": {
3356 + "version": "2.1.6",
3357 + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.6.tgz",
3358 + "integrity": "sha512-ixNkFy3k4vokOUTU2blIUvOgKq/N2PW8vKIjZZYsGJCMX69MRa9J2sKqX5hY/k5O5Gty3YJChepkqZ3KM9LyIQ==",
3359 "dev": true,
3151 - "optional": true,
3152 - "peer": true,
3360 + "license": "MIT",
3361 "dependencies": {
3154 - "@eslint-community/eslint-utils": "^4.2.0",
3155 - "@eslint-community/regexpp": "^4.6.1",
3156 - "@eslint/eslintrc": "^2.1.4",
3157 - "@eslint/js": "8.57.1",
3158 - "@humanwhocodes/config-array": "^0.13.0",
3159 - "@humanwhocodes/module-importer": "^1.0.1",
3160 - "@nodelib/fs.walk": "^1.2.8",
3161 - "@ungap/structured-clone": "^1.2.0",
3162 - "ajv": "^6.12.4",
3163 - "chalk": "^4.0.0",
3164 - "cross-spawn": "^7.0.2",
3165 - "debug": "^4.3.2",
3166 - "doctrine": "^3.0.0",
3167 - "escape-string-regexp": "^4.0.0",
3168 - "eslint-scope": "^7.2.2",
3169 - "eslint-visitor-keys": "^3.4.3",
3170 - "espree": "^9.6.1",
3171 - "esquery": "^1.4.2",
3172 - "esutils": "^2.0.2",
3173 - "fast-deep-equal": "^3.1.3",
3174 - "file-entry-cache": "^6.0.1",
3175 - "find-up": "^5.0.0",
3176 - "glob-parent": "^6.0.2",
3177 - "globals": "^13.19.0",
3178 - "graphemer": "^1.4.0",
3179 - "ignore": "^5.2.0",
3180 - "imurmurhash": "^0.1.4",
3181 - "is-glob": "^4.0.0",
3182 - "is-path-inside": "^3.0.3",
3183 - "js-yaml": "^4.1.0",
3184 - "json-stable-stringify-without-jsonify": "^1.0.1",
3185 - "levn": "^0.4.1",
3186 - "lodash.merge": "^4.6.2",
3187 - "minimatch": "^3.1.2",
3188 - "natural-compare": "^1.4.0",
3189 - "optionator": "^0.9.3",
3190 - "strip-ansi": "^6.0.1",
3191 - "text-table": "^0.2.0"
3192 - },
3193 - "bin": {
3194 - "eslint": "bin/eslint.js"
3195 - },
3196 - "engines": {
3197 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
3362 + "@vitest/pretty-format": "2.1.6",
3363 + "loupe": "^3.1.2",
3364 + "tinyrainbow": "^1.2.0"
3365 },
3366 "funding": {
3200 - "url": "https://opencollective.com/eslint"
3367 + "url": "https://opencollective.com/vitest"
3368 }
3369 },
3203 - "node_modules/@unocss/eslint-plugin/node_modules/eslint-scope": {
3204 - "version": "7.2.2",
3205 - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
3206 - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
3370 + "node_modules/@volar/language-core": {
3371 + "version": "2.4.10",
3372 + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.10.tgz",
3373 + "integrity": "sha512-hG3Z13+nJmGaT+fnQzAkS0hjJRa2FCeqZt6Bd+oGNhUkQ+mTFsDETg5rqUTxyzIh5pSOGY7FHCWUS8G82AzLCA==",
3374 "dev": true,
3208 - "optional": true,
3209 - "peer": true,
3375 + "license": "MIT",
3376 "dependencies": {
3211 - "esrecurse": "^4.3.0",
3212 - "estraverse": "^5.2.0"
3213 - },
3214 - "engines": {
3215 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
3216 - },
3217 - "funding": {
3218 - "url": "https://opencollective.com/eslint"
3377 + "@volar/source-map": "2.4.10"
3378 }
3379 },
3221 - "node_modules/@unocss/eslint-plugin/node_modules/eslint-visitor-keys": {
3222 - "version": "3.4.3",
3223 - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
3224 - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
3380 + "node_modules/@volar/source-map": {
3381 + "version": "2.4.10",
3382 + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.10.tgz",
3383 + "integrity": "sha512-OCV+b5ihV0RF3A7vEvNyHPi4G4kFa6ukPmyVocmqm5QzOd8r5yAtiNvaPEjl8dNvgC/lj4JPryeeHLdXd62rWA==",
3384 "dev": true,
3226 - "optional": true,
3227 - "peer": true,
3228 - "engines": {
3229 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
3230 - },
3231 - "funding": {
3232 - "url": "https://opencollective.com/eslint"
3233 - }
3385 + "license": "MIT"
3386 },
3235 - "node_modules/@unocss/eslint-plugin/node_modules/espree": {
3236 - "version": "9.6.1",
3237 - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
3238 - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
3387 + "node_modules/@volar/typescript": {
3388 + "version": "2.4.10",
3389 + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.10.tgz",
3390 + "integrity": "sha512-F8ZtBMhSXyYKuBfGpYwqA5rsONnOwAVvjyE7KPYJ7wgZqo2roASqNWUnianOomJX5u1cxeRooHV59N0PhvEOgw==",
3391 "dev": true,
3240 - "optional": true,
3241 - "peer": true,
3392 + "license": "MIT",
3393 "dependencies": {
3243 - "acorn": "^8.9.0",
3244 - "acorn-jsx": "^5.3.2",
3245 - "eslint-visitor-keys": "^3.4.1"
3246 - },
3247 - "engines": {
3248 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
3249 - },
3250 - "funding": {
3251 - "url": "https://opencollective.com/eslint"
3394 + "@volar/language-core": "2.4.10",
3395 + "path-browserify": "^1.0.1",
3396 + "vscode-uri": "^3.0.8"
3397 }
3398 },
3254 - "node_modules/@unocss/eslint-plugin/node_modules/file-entry-cache": {
3255 - "version": "6.0.1",
3256 - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
3257 - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
3399 + "node_modules/@vue/babel-helper-vue-transform-on": {
3400 + "version": "1.2.5",
3401 + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.5.tgz",
3402 + "integrity": "sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==",
3403 "dev": true,
3259 - "optional": true,
3260 - "peer": true,
3404 + "license": "MIT"
3405 + },
3406 + "node_modules/@vue/babel-plugin-jsx": {
3407 + "version": "1.2.5",
3408 + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.2.5.tgz",
3409 + "integrity": "sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==",
3410 + "dev": true,
3411 + "license": "MIT",
3412 "dependencies": {
3262 - "flat-cache": "^3.0.4"
3413 + "@babel/helper-module-imports": "^7.24.7",
3414 + "@babel/helper-plugin-utils": "^7.24.8",
3415 + "@babel/plugin-syntax-jsx": "^7.24.7",
3416 + "@babel/template": "^7.25.0",
3417 + "@babel/traverse": "^7.25.6",
3418 + "@babel/types": "^7.25.6",
3419 + "@vue/babel-helper-vue-transform-on": "1.2.5",
3420 + "@vue/babel-plugin-resolve-type": "1.2.5",
3421 + "html-tags": "^3.3.1",
3422 + "svg-tags": "^1.0.0"
3423 },
3264 - "engines": {
3265 - "node": "^10.12.0 || >=12.0.0"
3424 + "peerDependencies": {
3425 + "@babel/core": "^7.0.0-0"
3426 + },
3427 + "peerDependenciesMeta": {
3428 + "@babel/core": {
3429 + "optional": true
3430 + }
3431 }
3432 },
3268 - "node_modules/@unocss/eslint-plugin/node_modules/flat-cache": {
3269 - "version": "3.2.0",
3270 - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
3271 - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
3433 + "node_modules/@vue/babel-plugin-resolve-type": {
3434 + "version": "1.2.5",
3435 + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.2.5.tgz",
3436 + "integrity": "sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==",
3437 "dev": true,
3273 - "optional": true,
3274 - "peer": true,
3438 + "license": "MIT",
3439 "dependencies": {
3276 - "flatted": "^3.2.9",
3277 - "keyv": "^4.5.3",
3278 - "rimraf": "^3.0.2"
3440 + "@babel/code-frame": "^7.24.7",
3441 + "@babel/helper-module-imports": "^7.24.7",
3442 + "@babel/helper-plugin-utils": "^7.24.8",
3443 + "@babel/parser": "^7.25.6",
3444 + "@vue/compiler-sfc": "^3.5.3"
3445 },
3280 - "engines": {
3281 - "node": "^10.12.0 || >=12.0.0"
3446 + "peerDependencies": {
3447 + "@babel/core": "^7.0.0-0"
3448 }
3449 },
3284 - "node_modules/@unocss/eslint-plugin/node_modules/globals": {
3285 - "version": "13.24.0",
3286 - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
3287 - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
3288 - "dev": true,
3289 - "optional": true,
3290 - "peer": true,
3450 + "node_modules/@vue/compiler-core": {
3451 + "version": "3.5.13",
3452 + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz",
3453 + "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==",
3454 + "license": "MIT",
3455 "dependencies": {
3292 - "type-fest": "^0.20.2"
3293 - },
3294 - "engines": {
3295 - "node": ">=8"
3296 - },
3297 - "funding": {
3298 - "url": "https://github.com/sponsors/sindresorhus"
3456 + "@babel/parser": "^7.25.3",
3457 + "@vue/shared": "3.5.13",
3458 + "entities": "^4.5.0",
3459 + "estree-walker": "^2.0.2",
3460 + "source-map-js": "^1.2.0"
3461 }
3462 },
3301 - "node_modules/@unocss/eslint-plugin/node_modules/js-yaml": {
3302 - "version": "4.1.0",
3303 - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
3304 - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
3305 - "dev": true,
3306 - "optional": true,
3307 - "peer": true,
3463 + "node_modules/@vue/compiler-dom": {
3464 + "version": "3.5.13",
3465 + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz",
3466 + "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==",
3467 + "license": "MIT",
3468 "dependencies": {
3309 - "argparse": "^2.0.1"
3310 - },
3311 - "bin": {
3312 - "js-yaml": "bin/js-yaml.js"
3469 + "@vue/compiler-core": "3.5.13",
3470 + "@vue/shared": "3.5.13"
3471 }
3472 },
3315 - "node_modules/@unocss/eslint-plugin/node_modules/minimatch": {
3316 - "version": "3.1.2",
3317 - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
3318 - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
3319 - "dev": true,
3320 - "optional": true,
3321 - "peer": true,
3473 + "node_modules/@vue/compiler-sfc": {
3474 + "version": "3.5.13",
3475 + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz",
3476 + "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==",
3477 + "license": "MIT",
3478 "dependencies": {
3323 - "brace-expansion": "^1.1.7"
3324 - },
3325 - "engines": {
3326 - "node": "*"
3479 + "@babel/parser": "^7.25.3",
3480 + "@vue/compiler-core": "3.5.13",
3481 + "@vue/compiler-dom": "3.5.13",
3482 + "@vue/compiler-ssr": "3.5.13",
3483 + "@vue/shared": "3.5.13",
3484 + "estree-walker": "^2.0.2",
3485 + "magic-string": "^0.30.11",
3486 + "postcss": "^8.4.48",
3487 + "source-map-js": "^1.2.0"
3488 }
3489 },
3329 - "node_modules/@unocss/eslint-plugin/node_modules/type-fest": {
3330 - "version": "0.20.2",
3331 - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
3332 - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
3333 - "dev": true,
3334 - "optional": true,
3335 - "peer": true,
3336 - "engines": {
3337 - "node": ">=10"
3338 - },
3339 - "funding": {
3340 - "url": "https://github.com/sponsors/sindresorhus"
3490 + "node_modules/@vue/compiler-ssr": {
3491 + "version": "3.5.13",
3492 + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz",
3493 + "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==",
3494 + "license": "MIT",
3495 + "dependencies": {
3496 + "@vue/compiler-dom": "3.5.13",
3497 + "@vue/shared": "3.5.13"
3498 }
3499 },
3343 - "node_modules/@vitejs/plugin-vue": {
3344 - "version": "5.2.0",
3345 - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.0.tgz",
3346 - "integrity": "sha512-7n7KdUEtx/7Yl7I/WVAMZ1bEb0eVvXF3ummWTeLcs/9gvo9pJhuLdouSXGjdZ/MKD1acf1I272+X0RMua4/R3g==",
3500 + "node_modules/@vue/compiler-vue2": {
3501 + "version": "2.7.16",
3502 + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz",
3503 + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==",
3504 "dev": true,
3348 - "engines": {
3349 - "node": "^18.0.0 || >=20.0.0"
3350 - },
3351 - "peerDependencies": {
3352 - "vite": "^5.0.0",
3353 - "vue": "^3.2.25"
3505 + "license": "MIT",
3506 + "dependencies": {
3507 + "de-indent": "^1.0.2",
3508 + "he": "^1.2.0"
3509 }
3510 },
3356 - "node_modules/@vitejs/plugin-vue-jsx": {
3357 - "version": "4.1.0",
3358 - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-4.1.0.tgz",
3359 - "integrity": "sha512-KuRejz7KAFvhXDzOudlaS2IyygAwoAEEMtHAdcRSy/8cA5iKH043Qudcz48zsC0M0vvN5iKwIwNMuWbBYn6/Yg==",
3511 + "node_modules/@vue/devtools-api": {
3512 + "version": "6.6.4",
3513 + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
3514 + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
3515 + "license": "MIT"
3516 + },
3517 + "node_modules/@vue/devtools-core": {
3518 + "version": "7.6.5",
3519 + "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.6.5.tgz",
3520 + "integrity": "sha512-PKTEZVzY4Ef6G8LnbACKkPDOcdr2snFn3Xk8YqyFgugmogDrA3cyYVQ58CS0XTO9AYUXU9E5FFt5JJf22kXF2w==",
3521 "dev": true,
3522 + "license": "MIT",
3523 "dependencies": {
3362 - "@babel/core": "^7.26.0",
3363 - "@babel/plugin-transform-typescript": "^7.25.9",
3364 - "@vue/babel-plugin-jsx": "^1.2.5"
3365 - },
3366 - "engines": {
3367 - "node": "^18.0.0 || >=20.0.0"
3524 + "@vue/devtools-kit": "^7.6.5",
3525 + "@vue/devtools-shared": "^7.6.5",
3526 + "mitt": "^3.0.1",
3527 + "nanoid": "^3.3.4",
3528 + "pathe": "^1.1.2",
3529 + "vite-hot-client": "^0.2.3"
3530 },
3531 "peerDependencies": {
3370 - "vite": "^5.0.0",
3532 "vue": "^3.0.0"
3533 }
3534 },
3374 - "node_modules/@vitest/eslint-plugin": {
3375 - "version": "1.1.10",
3376 - "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.1.10.tgz",
3377 - "integrity": "sha512-uScH5Kz5v32vvtQYB2iodpoPg2mGASK+VKpjlc2IUgE0+16uZKqVKi2vQxjxJ6sMCQLBs4xhBFZlmZBszsmfKQ==",
3378 - "dev": true,
3379 - "peerDependencies": {
3380 - "@typescript-eslint/utils": ">= 8.0",
3381 - "eslint": ">= 8.57.0",
3382 - "typescript": ">= 5.0.0",
3383 - "vitest": "*"
3384 - },
3385 - "peerDependenciesMeta": {
3386 - "typescript": {
3387 - "optional": true
3388 - },
3389 - "vitest": {
3390 - "optional": true
3391 - }
3392 - }
3393 - },
3394 - "node_modules/@vitest/expect": {
3395 - "version": "2.1.5",
3396 - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.5.tgz",
3397 - "integrity": "sha512-nZSBTW1XIdpZvEJyoP/Sy8fUg0b8od7ZpGDkTUcfJ7wz/VoZAFzFfLyxVxGFhUjJzhYqSbIpfMtl/+k/dpWa3Q==",
3398 - "dev": true,
3399 - "dependencies": {
3400 - "@vitest/spy": "2.1.5",
3401 - "@vitest/utils": "2.1.5",
3402 - "chai": "^5.1.2",
3403 - "tinyrainbow": "^1.2.0"
3404 - },
3405 - "funding": {
3406 - "url": "https://opencollective.com/vitest"
3407 - }
3408 - },
3409 - "node_modules/@vitest/mocker": {
3410 - "version": "2.1.5",
3411 - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.5.tgz",
3412 - "integrity": "sha512-XYW6l3UuBmitWqSUXTNXcVBUCRytDogBsWuNXQijc00dtnU/9OqpXWp4OJroVrad/gLIomAq9aW8yWDBtMthhQ==",
3413 - "dev": true,
3414 - "dependencies": {
3415 - "@vitest/spy": "2.1.5",
3416 - "estree-walker": "^3.0.3",
3417 - "magic-string": "^0.30.12"
3418 - },
3419 - "funding": {
3420 - "url": "https://opencollective.com/vitest"
3421 - },
3422 - "peerDependencies": {
3423 - "msw": "^2.4.9",
3424 - "vite": "^5.0.0"
3425 - },
3426 - "peerDependenciesMeta": {
3427 - "msw": {
3428 - "optional": true
3429 - },
3430 - "vite": {
3431 - "optional": true
3432 - }
3433 - }
3434 - },
3435 - "node_modules/@vitest/mocker/node_modules/estree-walker": {
3436 - "version": "3.0.3",
3437 - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
3438 - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
3439 - "dev": true,
3440 - "dependencies": {
3441 - "@types/estree": "^1.0.0"
3442 - }
3443 - },
3444 - "node_modules/@vitest/pretty-format": {
3445 - "version": "2.1.5",
3446 - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.5.tgz",
3447 - "integrity": "sha512-4ZOwtk2bqG5Y6xRGHcveZVr+6txkH7M2e+nPFd6guSoN638v/1XQ0K06eOpi0ptVU/2tW/pIU4IoPotY/GZ9fw==",
3448 - "dev": true,
3449 - "dependencies": {
3450 - "tinyrainbow": "^1.2.0"
3451 - },
3452 - "funding": {
3453 - "url": "https://opencollective.com/vitest"
3454 - }
3455 - },
3456 - "node_modules/@vitest/runner": {
3457 - "version": "2.1.5",
3458 - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.5.tgz",
3459 - "integrity": "sha512-pKHKy3uaUdh7X6p1pxOkgkVAFW7r2I818vHDthYLvUyjRfkKOU6P45PztOch4DZarWQne+VOaIMwA/erSSpB9g==",
3460 - "dev": true,
3461 - "dependencies": {
3462 - "@vitest/utils": "2.1.5",
3463 - "pathe": "^1.1.2"
3464 - },
3465 - "funding": {
3466 - "url": "https://opencollective.com/vitest"
3467 - }
3468 - },
3469 - "node_modules/@vitest/snapshot": {
3470 - "version": "2.1.5",
3471 - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.5.tgz",
3472 - "integrity": "sha512-zmYw47mhfdfnYbuhkQvkkzYroXUumrwWDGlMjpdUr4jBd3HZiV2w7CQHj+z7AAS4VOtWxI4Zt4bWt4/sKcoIjg==",
3473 - "dev": true,
3474 - "dependencies": {
3475 - "@vitest/pretty-format": "2.1.5",
3476 - "magic-string": "^0.30.12",
3477 - "pathe": "^1.1.2"
3478 - },
3479 - "funding": {
3480 - "url": "https://opencollective.com/vitest"
3481 - }
3482 - },
3483 - "node_modules/@vitest/spy": {
3484 - "version": "2.1.5",
3485 - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.5.tgz",
3486 - "integrity": "sha512-aWZF3P0r3w6DiYTVskOYuhBc7EMc3jvn1TkBg8ttylFFRqNN2XGD7V5a4aQdk6QiUzZQ4klNBSpCLJgWNdIiNw==",
3487 - "dev": true,
3488 - "dependencies": {
3489 - "tinyspy": "^3.0.2"
3490 - },
3491 - "funding": {
3492 - "url": "https://opencollective.com/vitest"
3493 - }
3494 - },
3495 - "node_modules/@vitest/utils": {
3496 - "version": "2.1.5",
3497 - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.5.tgz",
3498 - "integrity": "sha512-yfj6Yrp0Vesw2cwJbP+cl04OC+IHFsuQsrsJBL9pyGeQXE56v1UAOQco+SR55Vf1nQzfV0QJg1Qum7AaWUwwYg==",
3499 - "dev": true,
3500 - "dependencies": {
3501 - "@vitest/pretty-format": "2.1.5",
3502 - "loupe": "^3.1.2",
3503 - "tinyrainbow": "^1.2.0"
3504 - },
3505 - "funding": {
3506 - "url": "https://opencollective.com/vitest"
3507 - }
3508 - },
3509 - "node_modules/@volar/language-core": {
3510 - "version": "2.4.8",
3511 - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.8.tgz",
3512 - "integrity": "sha512-K/GxMOXGq997bO00cdFhTNuR85xPxj0BEEAy+BaqqayTmy9Tmhfgmq2wpJcVspRhcwfgPoE2/mEJa26emUhG/g==",
3513 - "dev": true,
3514 - "dependencies": {
3515 - "@volar/source-map": "2.4.8"
3516 - }
3517 - },
3518 - "node_modules/@volar/source-map": {
3519 - "version": "2.4.8",
3520 - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.8.tgz",
3521 - "integrity": "sha512-jeWJBkC/WivdelMwxKkpFL811uH/jJ1kVxa+c7OvG48DXc3VrP7pplSWPP2W1dLMqBxD+awRlg55FQQfiup4cA==",
3522 - "dev": true
3523 - },
3524 - "node_modules/@volar/typescript": {
3525 - "version": "2.4.8",
3526 - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.8.tgz",
3527 - "integrity": "sha512-6xkIYJ5xxghVBhVywMoPMidDDAFT1OoQeXwa27HSgJ6AiIKRe61RXLoik+14Z7r0JvnblXVsjsRLmCr42SGzqg==",
3528 - "dev": true,
3529 - "dependencies": {
3530 - "@volar/language-core": "2.4.8",
3531 - "path-browserify": "^1.0.1",
3532 - "vscode-uri": "^3.0.8"
3533 - }
3534 - },
3535 - "node_modules/@vue/babel-helper-vue-transform-on": {
3536 - "version": "1.2.5",
3537 - "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.5.tgz",
3538 - "integrity": "sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==",
3539 - "dev": true
3540 - },
3541 - "node_modules/@vue/babel-plugin-jsx": {
3542 - "version": "1.2.5",
3543 - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.2.5.tgz",
3544 - "integrity": "sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==",
3545 - "dev": true,
3546 - "dependencies": {
3547 - "@babel/helper-module-imports": "^7.24.7",
3548 - "@babel/helper-plugin-utils": "^7.24.8",
3549 - "@babel/plugin-syntax-jsx": "^7.24.7",
3550 - "@babel/template": "^7.25.0",
3551 - "@babel/traverse": "^7.25.6",
3552 - "@babel/types": "^7.25.6",
3553 - "@vue/babel-helper-vue-transform-on": "1.2.5",
3554 - "@vue/babel-plugin-resolve-type": "1.2.5",
3555 - "html-tags": "^3.3.1",
3556 - "svg-tags": "^1.0.0"
3557 - },
3558 - "peerDependencies": {
3559 - "@babel/core": "^7.0.0-0"
3560 - },
3561 - "peerDependenciesMeta": {
3562 - "@babel/core": {
3563 - "optional": true
3564 - }
3565 - }
3566 - },
3567 - "node_modules/@vue/babel-plugin-resolve-type": {
3568 - "version": "1.2.5",
3569 - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.2.5.tgz",
3570 - "integrity": "sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==",
3571 - "dev": true,
3572 - "dependencies": {
3573 - "@babel/code-frame": "^7.24.7",
3574 - "@babel/helper-module-imports": "^7.24.7",
3575 - "@babel/helper-plugin-utils": "^7.24.8",
3576 - "@babel/parser": "^7.25.6",
3577 - "@vue/compiler-sfc": "^3.5.3"
3578 - },
3579 - "peerDependencies": {
3580 - "@babel/core": "^7.0.0-0"
3581 - }
3582 - },
3583 - "node_modules/@vue/compiler-core": {
3584 - "version": "3.5.13",
3585 - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz",
3586 - "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==",
3587 - "dependencies": {
3588 - "@babel/parser": "^7.25.3",
3589 - "@vue/shared": "3.5.13",
3590 - "entities": "^4.5.0",
3591 - "estree-walker": "^2.0.2",
3592 - "source-map-js": "^1.2.0"
3593 - }
3594 - },
3595 - "node_modules/@vue/compiler-dom": {
3596 - "version": "3.5.13",
3597 - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz",
3598 - "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==",
3599 - "dependencies": {
3600 - "@vue/compiler-core": "3.5.13",
3601 - "@vue/shared": "3.5.13"
3602 - }
3603 - },
3604 - "node_modules/@vue/compiler-sfc": {
3605 - "version": "3.5.13",
3606 - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz",
3607 - "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==",
3608 - "dependencies": {
3609 - "@babel/parser": "^7.25.3",
3610 - "@vue/compiler-core": "3.5.13",
3611 - "@vue/compiler-dom": "3.5.13",
3612 - "@vue/compiler-ssr": "3.5.13",
3613 - "@vue/shared": "3.5.13",
3614 - "estree-walker": "^2.0.2",
3615 - "magic-string": "^0.30.11",
3616 - "postcss": "^8.4.48",
3617 - "source-map-js": "^1.2.0"
3618 - }
3619 - },
3620 - "node_modules/@vue/compiler-ssr": {
3621 - "version": "3.5.13",
3622 - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz",
3623 - "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==",
3624 - "dependencies": {
3625 - "@vue/compiler-dom": "3.5.13",
3626 - "@vue/shared": "3.5.13"
3627 - }
3628 - },
3629 - "node_modules/@vue/compiler-vue2": {
3630 - "version": "2.7.16",
3631 - "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz",
3632 - "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==",
3633 - "dev": true,
3634 - "dependencies": {
3635 - "de-indent": "^1.0.2",
3636 - "he": "^1.2.0"
3637 - }
3638 - },
3639 - "node_modules/@vue/devtools-api": {
3640 - "version": "6.6.4",
3641 - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
3642 - "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="
3643 - },
3644 - "node_modules/@vue/devtools-core": {
3645 - "version": "7.6.4",
3646 - "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.6.4.tgz",
3647 - "integrity": "sha512-blSwGVYpb7b5TALMjjoBiAl5imuBF7WEOAtaJaBMNikR8SQkm6mkUt4YlIKh9874/qoimwmpDOm+GHBZ4Y5m+g==",
3648 - "dev": true,
3649 - "dependencies": {
3650 - "@vue/devtools-kit": "^7.6.4",
3651 - "@vue/devtools-shared": "^7.6.4",
3652 - "mitt": "^3.0.1",
3653 - "nanoid": "^3.3.4",
3654 - "pathe": "^1.1.2",
3655 - "vite-hot-client": "^0.2.3"
3656 - },
3657 - "peerDependencies": {
3658 - "vue": "^3.0.0"
3659 - }
3660 - },
3661 - "node_modules/@vue/devtools-core/node_modules/nanoid": {
3662 - "version": "3.3.7",
3663 - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
3664 - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
3535 + "node_modules/@vue/devtools-core/node_modules/nanoid": {
3536 + "version": "3.3.8",
3537 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
3538 + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
3539 "dev": true,
3540 "funding": [
3541 {
@@ -3669,6 +3543,7 @@
3543 "url": "https://github.com/sponsors/ai"
3544 }
3545 ],
3546 + "license": "MIT",
3547 "bin": {
3548 "nanoid": "bin/nanoid.cjs"
3549 },
@@ -3677,12 +3552,13 @@
3552 }
3553 },
3554 "node_modules/@vue/devtools-kit": {
3680 - "version": "7.6.4",
3681 - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.6.4.tgz",
3682 - "integrity": "sha512-Zs86qIXXM9icU0PiGY09PQCle4TI750IPLmAJzW5Kf9n9t5HzSYf6Rz6fyzSwmfMPiR51SUKJh9sXVZu78h2QA==",
3555 + "version": "7.6.5",
3556 + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.6.5.tgz",
3557 + "integrity": "sha512-fLQhUwmUbtEDHW1SEiHUF5k2Ptw816As5ZUVb/SzrqkrJzXI8xjEIo8suNBe/N+ewdz/9m5ayeFH8fmcVIbr4Q==",
3558 "dev": true,
3559 + "license": "MIT",
3560 "dependencies": {
3685 - "@vue/devtools-shared": "^7.6.4",
3561 + "@vue/devtools-shared": "^7.6.5",
3562 "birpc": "^0.2.19",
3563 "hookable": "^5.5.3",
3564 "mitt": "^3.0.1",
@@ -3692,10 +3568,11 @@
3568 }
3569 },
3570 "node_modules/@vue/devtools-shared": {
3695 - "version": "7.6.4",
3696 - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.6.4.tgz",
3697 - "integrity": "sha512-nD6CUvBEel+y7zpyorjiUocy0nh77DThZJ0k1GRnJeOmY3ATq2fWijEp7wk37gb023Cb0R396uYh5qMSBQ5WFg==",
3571 + "version": "7.6.5",
3572 + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.6.5.tgz",
3573 + "integrity": "sha512-szsXQ0jlpjuFfmxb6F40qkSF4gtLC1W+dKRh/UiTulC+RekZsjqcN/qnVFkzqOO1YnzzShinZwfmv+MbfPJnpw==",
3574 "dev": true,
3575 + "license": "MIT",
3576 "dependencies": {
3577 "rfdc": "^1.4.1"
3578 }
@@ -3705,6 +3582,7 @@
3582 "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.1.10.tgz",
3583 "integrity": "sha512-DAI289d0K3AB5TUG3xDp9OuQ71CnrujQwJrQnfuZDwo6eGNf0UoRlPuaVNO+Zrn65PC3j0oB2i7mNmVPggeGeQ==",
3584 "dev": true,
3585 + "license": "MIT",
3586 "dependencies": {
3587 "@volar/language-core": "~2.4.8",
3588 "@vue/compiler-dom": "^3.5.0",
@@ -3728,6 +3606,7 @@
3606 "version": "3.5.13",
3607 "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz",
3608 "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==",
3609 + "license": "MIT",
3610 "dependencies": {
3611 "@vue/shared": "3.5.13"
3612 }
@@ -3736,6 +3615,7 @@
3615 "version": "3.5.13",
3616 "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz",
3617 "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==",
3618 + "license": "MIT",
3619 "dependencies": {
3620 "@vue/reactivity": "3.5.13",
3621 "@vue/shared": "3.5.13"
@@ -3745,6 +3625,7 @@
3625 "version": "3.5.13",
3626 "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz",
3627 "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==",
3628 + "license": "MIT",
3629 "dependencies": {
3630 "@vue/reactivity": "3.5.13",
3631 "@vue/runtime-core": "3.5.13",
@@ -3756,6 +3637,7 @@
3637 "version": "3.5.13",
3638 "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz",
3639 "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==",
3640 + "license": "MIT",
3641 "dependencies": {
3642 "@vue/compiler-ssr": "3.5.13",
3643 "@vue/shared": "3.5.13"
@@ -3767,13 +3649,15 @@
3649 "node_modules/@vue/shared": {
3650 "version": "3.5.13",
3651 "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz",
3770 - "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ=="
3652 + "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==",
3653 + "license": "MIT"
3654 },
3655 "node_modules/@vue/test-utils": {
3656 "version": "2.4.6",
3657 "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.6.tgz",
3658 "integrity": "sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==",
3659 "dev": true,
3660 + "license": "MIT",
3661 "dependencies": {
3662 "js-beautify": "^1.14.9",
3663 "vue-component-type-helpers": "^2.0.0"
@@ -3784,6 +3668,7 @@
3668 "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.6.0.tgz",
3669 "integrity": "sha512-MHXNd6lzugsEHvuA6l1GqrF5jROqUon8sP/HInLPnthJiYvB0VvpHMywg7em1dBZfFZNBSkR68qH37zOdRHmCw==",
3670 "dev": true,
3671 + "license": "MIT",
3672 "peerDependencies": {
3673 "typescript": "5.x",
3674 "vue": "^3.3.0"
@@ -3798,96 +3683,46 @@
3683 }
3684 },
3685 "node_modules/@vueuse/core": {
3801 - "version": "11.3.0",
3802 - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-11.3.0.tgz",
3803 - "integrity": "sha512-7OC4Rl1f9G8IT6rUfi9JrKiXy4bfmHhZ5x2Ceojy0jnd3mHNEvV4JaRygH362ror6/NZ+Nl+n13LPzGiPN8cKA==",
3686 + "version": "12.0.0",
3687 + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.0.0.tgz",
3688 + "integrity": "sha512-C12RukhXiJCbx4MGhjmd/gH52TjJsc3G0E0kQj/kb19H3Nt6n1CA4DRWuTdWWcaFRdlTe0npWDS942mvacvNBw==",
3689 "license": "MIT",
3690 "dependencies": {
3691 "@types/web-bluetooth": "^0.0.20",
3807 - "@vueuse/metadata": "11.3.0",
3808 - "@vueuse/shared": "11.3.0",
3809 - "vue-demi": ">=0.14.10"
3692 + "@vueuse/metadata": "12.0.0",
3693 + "@vueuse/shared": "12.0.0",
3694 + "vue": "^3.5.13"
3695 },
3696 "funding": {
3697 "url": "https://github.com/sponsors/antfu"
3698 }
3699 },
3815 - "node_modules/@vueuse/core/node_modules/vue-demi": {
3816 - "version": "0.14.10",
3817 - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
3818 - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
3819 - "hasInstallScript": true,
3820 - "bin": {
3821 - "vue-demi-fix": "bin/vue-demi-fix.js",
3822 - "vue-demi-switch": "bin/vue-demi-switch.js"
3823 - },
3824 - "engines": {
3825 - "node": ">=12"
3826 - },
3827 - "funding": {
3828 - "url": "https://github.com/sponsors/antfu"
3829 - },
3830 - "peerDependencies": {
3831 - "@vue/composition-api": "^1.0.0-rc.1",
3832 - "vue": "^3.0.0-0 || ^2.6.0"
3833 - },
3834 - "peerDependenciesMeta": {
3835 - "@vue/composition-api": {
3836 - "optional": true
3837 - }
3838 - }
3839 - },
3700 "node_modules/@vueuse/metadata": {
3841 - "version": "11.3.0",
3842 - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-11.3.0.tgz",
3843 - "integrity": "sha512-pwDnDspTqtTo2HwfLw4Rp6yywuuBdYnPYDq+mO38ZYKGebCUQC/nVj/PXSiK9HX5otxLz8Fn7ECPbjiRz2CC3g==",
3701 + "version": "12.0.0",
3702 + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.0.0.tgz",
3703 + "integrity": "sha512-Yzimd1D3sjxTDOlF05HekU5aSGdKjxhuhRFHA7gDWLn57PRbBIh+SF5NmjhJ0WRgF3my7T8LBucyxdFJjIfRJQ==",
3704 "license": "MIT",
3705 "funding": {
3706 "url": "https://github.com/sponsors/antfu"
3707 }
3708 },
3709 "node_modules/@vueuse/shared": {
3850 - "version": "11.3.0",
3851 - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-11.3.0.tgz",
3852 - "integrity": "sha512-P8gSSWQeucH5821ek2mn/ciCk+MS/zoRKqdQIM3bHq6p7GXDAJLmnRRKmF5F65sAVJIfzQlwR3aDzwCn10s8hA==",
3710 + "version": "12.0.0",
3711 + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.0.0.tgz",
3712 + "integrity": "sha512-3i6qtcq2PIio5i/vVYidkkcgvmTjCqrf26u+Fd4LhnbBmIT6FN8y6q/GJERp8lfcB9zVEfjdV0Br0443qZuJpw==",
3713 "license": "MIT",
3714 "dependencies": {
3855 - "vue-demi": ">=0.14.10"
3856 - },
3857 - "funding": {
3858 - "url": "https://github.com/sponsors/antfu"
3859 - }
3860 - },
3861 - "node_modules/@vueuse/shared/node_modules/vue-demi": {
3862 - "version": "0.14.10",
3863 - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
3864 - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
3865 - "hasInstallScript": true,
3866 - "license": "MIT",
3867 - "bin": {
3868 - "vue-demi-fix": "bin/vue-demi-fix.js",
3869 - "vue-demi-switch": "bin/vue-demi-switch.js"
3870 - },
3871 - "engines": {
3872 - "node": ">=12"
3715 + "vue": "^3.5.13"
3716 },
3717 "funding": {
3718 "url": "https://github.com/sponsors/antfu"
3876 - },
3877 - "peerDependencies": {
3878 - "@vue/composition-api": "^1.0.0-rc.1",
3879 - "vue": "^3.0.0-0 || ^2.6.0"
3880 - },
3881 - "peerDependenciesMeta": {
3882 - "@vue/composition-api": {
3883 - "optional": true
3884 - }
3719 }
3720 },
3721 "node_modules/@yr/monotone-cubic-spline": {
3722 "version": "1.0.3",
3723 "resolved": "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz",
3724 "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==",
3725 + "license": "MIT",
3726 "peer": true
3727 },
3728 "node_modules/abbrev": {
@@ -3895,6 +3730,7 @@
3730 "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
3731 "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
3732 "dev": true,
3733 + "license": "ISC",
3734 "engines": {
3735 "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
3736 }
@@ -3904,6 +3740,7 @@
3740 "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
3741 "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
3742 "dev": true,
3743 + "license": "MIT",
3744 "dependencies": {
3745 "mime-types": "~2.1.34",
3746 "negotiator": "0.6.3"
@@ -3916,6 +3753,7 @@
3753 "version": "8.14.0",
3754 "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
3755 "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
3756 + "license": "MIT",
3757 "bin": {
3758 "acorn": "bin/acorn"
3759 },
@@ -3928,6 +3766,7 @@
3766 "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
3767 "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
3768 "dev": true,
3769 + "license": "MIT",
3770 "peerDependencies": {
3771 "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
3772 }
@@ -3937,6 +3776,7 @@
3776 "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
3777 "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
3778 "dev": true,
3779 + "license": "MIT",
3780 "dependencies": {
3781 "debug": "^4.3.4"
3782 },
@@ -3949,6 +3789,7 @@
3789 "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
3790 "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
3791 "dev": true,
3792 + "license": "MIT",
3793 "dependencies": {
3794 "clean-stack": "^2.0.0",
3795 "indent-string": "^4.0.0"
@@ -3962,6 +3803,7 @@
3803 "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
3804 "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
3805 "dev": true,
3806 + "license": "MIT",
3807 "dependencies": {
3808 "fast-deep-equal": "^3.1.1",
3809 "fast-json-stable-stringify": "^2.0.0",
@@ -3974,16 +3816,18 @@
3816 }
3817 },
3818 "node_modules/alien-signals": {
3977 - "version": "0.2.0",
3978 - "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.2.0.tgz",
3979 - "integrity": "sha512-StlonZhBBrsPPwrDjiPAiVTf/rolxffLxVPT60Qv/t88BZ81BvUVzHgGqEFvJ1ii8HXtm1+zU2Icr59tfWEcag==",
3980 - "dev": true
3819 + "version": "0.2.2",
3820 + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.2.2.tgz",
3821 + "integrity": "sha512-cZIRkbERILsBOXTQmMrxc9hgpxglstn69zm+F1ARf4aPAzdAFYd6sBq87ErO0Fj3DV94tglcyHG5kQz9nDC/8A==",
3822 + "dev": true,
3823 + "license": "MIT"
3824 },
3825 "node_modules/ansi-colors": {
3826 "version": "4.1.3",
3827 "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
3828 "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
3829 "dev": true,
3830 + "license": "MIT",
3831 "engines": {
3832 "node": ">=6"
3833 }
@@ -3993,6 +3837,7 @@
3837 "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
3838 "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
3839 "dev": true,
3840 + "license": "MIT",
3841 "dependencies": {
3842 "type-fest": "^0.21.3"
3843 },
@@ -4008,6 +3853,7 @@
3853 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
3854 "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
3855 "dev": true,
3856 + "license": "(MIT OR CC0-1.0)",
3857 "engines": {
3858 "node": ">=10"
3859 },
@@ -4019,6 +3865,7 @@
3865 "version": "5.0.1",
3866 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
3867 "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
3868 + "license": "MIT",
3869 "engines": {
3870 "node": ">=8"
3871 }
@@ -4027,6 +3874,7 @@
3874 "version": "4.3.0",
3875 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
3876 "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
3877 + "license": "MIT",
3878 "dependencies": {
3879 "color-convert": "^2.0.1"
3880 },
@@ -4040,12 +3888,14 @@
3888 "node_modules/any-promise": {
3889 "version": "1.3.0",
3890 "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
4043 - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="
3891 + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
3892 + "license": "MIT"
3893 },
3894 "node_modules/anymatch": {
3895 "version": "3.1.3",
3896 "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
3897 "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
3898 + "license": "ISC",
3899 "dependencies": {
3900 "normalize-path": "^3.0.0",
3901 "picomatch": "^2.0.4"
@@ -4058,6 +3908,7 @@
3908 "version": "2.3.1",
3909 "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
3910 "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
3911 + "license": "MIT",
3912 "engines": {
3913 "node": ">=8.6"
3914 },
@@ -4066,18 +3917,18 @@
3917 }
3918 },
3919 "node_modules/apexcharts": {
4069 - "version": "3.54.1",
4070 - "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.54.1.tgz",
4071 - "integrity": "sha512-E4et0h/J1U3r3EwS/WlqJCQIbepKbp6wGUmaAwJOMjHUP4Ci0gxanLa7FR3okx6p9coi4st6J853/Cb1NP0vpA==",
3920 + "version": "4.1.0",
3921 + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-4.1.0.tgz",
3922 + "integrity": "sha512-TE0q0cXeS5k/AByLqlZAQ/aRQfdD3z0Ajd1uQWWZEjxiIC5qcBpMrTaG+aT+c3golqkvLH3u6kxDW8HBrggpLw==",
3923 + "license": "MIT",
3924 "peer": true,
3925 "dependencies": {
4074 - "@yr/monotone-cubic-spline": "^1.0.3",
4075 - "svg.draggable.js": "^2.2.2",
4076 - "svg.easing.js": "^2.0.0",
4077 - "svg.filter.js": "^2.0.2",
4078 - "svg.pathmorphing.js": "^0.1.3",
4079 - "svg.resize.js": "^1.4.3",
4080 - "svg.select.js": "^3.0.1"
3926 + "@svgdotjs/svg.draggable.js": "^3.0.4",
3927 + "@svgdotjs/svg.filter.js": "^3.0.8",
3928 + "@svgdotjs/svg.js": "^3.2.4",
3929 + "@svgdotjs/svg.resize.js": "^2.0.2",
3930 + "@svgdotjs/svg.select.js": "^4.0.1",
3931 + "@yr/monotone-cubic-spline": "^1.0.3"
3932 }
3933 },
3934 "node_modules/arch": {
@@ -4098,13 +3949,15 @@
3949 "type": "consulting",
3950 "url": "https://feross.org/support"
3951 }
4101 - ]
3952 + ],
3953 + "license": "MIT"
3954 },
3955 "node_modules/are-docs-informative": {
3956 "version": "0.0.2",
3957 "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz",
3958 "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==",
3959 "dev": true,
3960 + "license": "MIT",
3961 "engines": {
3962 "node": ">=14"
3963 }
@@ -4112,13 +3965,15 @@
3965 "node_modules/arg": {
3966 "version": "5.0.2",
3967 "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
4115 - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="
3968 + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
3969 + "license": "MIT"
3970 },
3971 "node_modules/argparse": {
3972 "version": "1.0.10",
3973 "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
3974 "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
3975 "dev": true,
3976 + "license": "MIT",
3977 "dependencies": {
3978 "sprintf-js": "~1.0.2"
3979 }
@@ -4128,6 +3983,7 @@
3983 "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz",
3984 "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==",
3985 "dev": true,
3986 + "license": "MIT",
3987 "engines": {
3988 "node": ">=8"
3989 }
@@ -4137,6 +3993,7 @@
3993 "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
3994 "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
3995 "dev": true,
3996 + "license": "MIT",
3997 "engines": {
3998 "node": ">=8"
3999 }
@@ -4146,6 +4003,7 @@
4003 "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
4004 "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
4005 "dev": true,
4006 + "license": "MIT",
4007 "engines": {
4008 "node": ">=8"
4009 }
@@ -4155,6 +4013,7 @@
4013 "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
4014 "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
4015 "dev": true,
4016 + "license": "MIT",
4017 "dependencies": {
4018 "safer-buffer": "~2.1.0"
4019 }
@@ -4164,6 +4023,7 @@
4023 "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
4024 "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
4025 "dev": true,
4026 + "license": "MIT",
4027 "engines": {
4028 "node": ">=0.8"
4029 }
@@ -4173,6 +4033,7 @@
4033 "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
4034 "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
4035 "dev": true,
4036 + "license": "MIT",
4037 "engines": {
4038 "node": ">=12"
4039 }
@@ -4182,6 +4043,7 @@
4043 "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
4044 "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
4045 "dev": true,
4046 + "license": "MIT",
4047 "engines": {
4048 "node": ">=8"
4049 }
@@ -4190,23 +4052,27 @@
4052 "version": "3.2.6",
4053 "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
4054 "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
4193 - "dev": true
4055 + "dev": true,
4056 + "license": "MIT"
4057 },
4058 "node_modules/async-validator": {
4059 "version": "4.2.5",
4060 "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz",
4198 - "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg=="
4061 + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==",
4062 + "license": "MIT"
4063 },
4064 "node_modules/asynckit": {
4065 "version": "0.4.0",
4066 "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
4203 - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
4067 + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
4068 + "license": "MIT"
4069 },
4070 "node_modules/at-least-node": {
4071 "version": "1.0.0",
4072 "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
4073 "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
4074 "dev": true,
4075 + "license": "ISC",
4076 "engines": {
4077 "node": ">= 4.0.0"
4078 }
@@ -4230,6 +4096,7 @@
4096 "url": "https://github.com/sponsors/ai"
4097 }
4098 ],
4099 + "license": "MIT",
4100 "dependencies": {
4101 "browserslist": "^4.23.3",
4102 "caniuse-lite": "^1.0.30001646",
@@ -4253,6 +4120,7 @@
4120 "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
4121 "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
4122 "dev": true,
4123 + "license": "Apache-2.0",
4124 "engines": {
4125 "node": "*"
4126 }
@@ -4261,12 +4129,14 @@
4129 "version": "1.13.2",
4130 "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz",
4131 "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==",
4264 - "dev": true
4132 + "dev": true,
4133 + "license": "MIT"
4134 },
4135 "node_modules/axios": {
4267 - "version": "1.7.7",
4268 - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
4269 - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
4136 + "version": "1.7.8",
4137 + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.8.tgz",
4138 + "integrity": "sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==",
4139 + "license": "MIT",
4140 "dependencies": {
4141 "follow-redirects": "^1.15.6",
4142 "form-data": "^4.0.0",
@@ -4276,7 +4146,8 @@
4146 "node_modules/balanced-match": {
4147 "version": "1.0.2",
4148 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
4279 - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
4149 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
4150 + "license": "MIT"
4151 },
4152 "node_modules/base64-js": {
4153 "version": "1.5.1",
@@ -4296,13 +4167,15 @@
4167 "type": "consulting",
4168 "url": "https://feross.org/support"
4169 }
4299 - ]
4170 + ],
4171 + "license": "MIT"
4172 },
4173 "node_modules/bcrypt-pbkdf": {
4174 "version": "1.0.2",
4175 "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
4176 "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
4177 "dev": true,
4178 + "license": "BSD-3-Clause",
4179 "dependencies": {
4180 "tweetnacl": "^0.14.3"
4181 }
@@ -4311,6 +4184,7 @@
4184 "version": "2.3.0",
4185 "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
4186 "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
4187 + "license": "MIT",
4188 "engines": {
4189 "node": ">=8"
4190 },
@@ -4323,6 +4197,7 @@
4197 "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz",
4198 "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==",
4199 "dev": true,
4200 + "license": "MIT",
4201 "funding": {
4202 "url": "https://github.com/sponsors/antfu"
4203 }
@@ -4331,24 +4206,28 @@
4206 "version": "2.0.2",
4207 "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz",
4208 "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==",
4334 - "dev": true
4209 + "dev": true,
4210 + "license": "Apache-2.0"
4211 },
4212 "node_modules/bluebird": {
4213 "version": "3.7.2",
4214 "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
4215 "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
4340 - "dev": true
4216 + "dev": true,
4217 + "license": "MIT"
4218 },
4219 "node_modules/boolbase": {
4220 "version": "1.0.0",
4221 "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
4222 "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
4346 - "dev": true
4223 + "dev": true,
4224 + "license": "ISC"
4225 },
4226 "node_modules/brace-expansion": {
4227 "version": "2.0.1",
4228 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
4229 "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
4230 + "license": "MIT",
4231 "dependencies": {
4232 "balanced-match": "^1.0.0"
4233 }
@@ -4357,6 +4236,7 @@
4236 "version": "3.0.3",
4237 "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
4238 "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
4239 + "license": "MIT",
4240 "dependencies": {
4241 "fill-range": "^7.1.1"
4242 },
@@ -4382,6 +4262,7 @@
4262 "url": "https://github.com/sponsors/ai"
4263 }
4264 ],
4265 + "license": "MIT",
4266 "dependencies": {
4267 "caniuse-lite": "^1.0.30001669",
4268 "electron-to-chromium": "^1.5.41",
@@ -4414,6 +4295,7 @@
4295 "url": "https://feross.org/support"
4296 }
4297 ],
4298 + "license": "MIT",
4299 "dependencies": {
4300 "base64-js": "^1.3.1",
4301 "ieee754": "^1.1.13"
@@ -4424,6 +4306,7 @@
4306 "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
4307 "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
4308 "dev": true,
4309 + "license": "MIT",
4310 "engines": {
4311 "node": "*"
4312 }
@@ -4433,6 +4316,7 @@
4316 "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
4317 "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
4318 "dev": true,
4319 + "license": "MIT",
4320 "engines": {
4321 "node": ">=6"
4322 },
@@ -4445,6 +4329,7 @@
4329 "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
4330 "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
4331 "dev": true,
4332 + "license": "MIT",
4333 "dependencies": {
4334 "run-applescript": "^7.0.0"
4335 },
@@ -4460,6 +4345,7 @@
4345 "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.0.0.tgz",
4346 "integrity": "sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==",
4347 "dev": true,
4348 + "license": "MIT",
4349 "dependencies": {
4350 "load-tsconfig": "^0.2.3"
4351 },
@@ -4474,30 +4360,32 @@
4360 "version": "3.1.2",
4361 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
4362 "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
4363 + "license": "MIT",
4364 "engines": {
4365 "node": ">= 0.8"
4366 }
4367 },
4368 "node_modules/c12": {
4482 - "version": "1.11.2",
4483 - "resolved": "https://registry.npmjs.org/c12/-/c12-1.11.2.tgz",
4484 - "integrity": "sha512-oBs8a4uvSDO9dm8b7OCFW7+dgtVrwmwnrVXYzLm43ta7ep2jCn/0MhoUFygIWtxhyy6+/MG7/agvpY0U1Iemew==",
4369 + "version": "2.0.1",
4370 + "resolved": "https://registry.npmjs.org/c12/-/c12-2.0.1.tgz",
4371 + "integrity": "sha512-Z4JgsKXHG37C6PYUtIxCfLJZvo6FyhHJoClwwb9ftUkLpPSkuYqn6Tr+vnaN8hymm0kIbcg6Ey3kv/Q71k5w/A==",
4372 + "license": "MIT",
4373 "dependencies": {
4486 - "chokidar": "^3.6.0",
4374 + "chokidar": "^4.0.1",
4375 "confbox": "^0.1.7",
4376 "defu": "^6.1.4",
4377 "dotenv": "^16.4.5",
4378 "giget": "^1.2.3",
4491 - "jiti": "^1.21.6",
4379 + "jiti": "^2.3.0",
4380 "mlly": "^1.7.1",
4493 - "ohash": "^1.1.3",
4381 + "ohash": "^1.1.4",
4382 "pathe": "^1.1.2",
4383 "perfect-debounce": "^1.0.0",
4384 "pkg-types": "^1.2.0",
4385 "rc9": "^2.1.2"
4386 },
4387 "peerDependencies": {
4500 - "magicast": "^0.3.4"
4388 + "magicast": "^0.3.5"
4389 },
4390 "peerDependenciesMeta": {
4391 "magicast": {
@@ -4510,6 +4398,7 @@
4398 "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
4399 "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
4400 "dev": true,
4401 + "license": "MIT",
4402 "engines": {
4403 "node": ">=8"
4404 }
@@ -4519,6 +4408,7 @@
4408 "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz",
4409 "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==",
4410 "dev": true,
4411 + "license": "MIT",
4412 "dependencies": {
4413 "mime-types": "^2.1.18",
4414 "ylru": "^1.2.0"
@@ -4532,6 +4422,7 @@
4422 "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz",
4423 "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==",
4424 "dev": true,
4425 + "license": "MIT",
4426 "engines": {
4427 "node": ">=6"
4428 }
@@ -4541,6 +4432,7 @@
4432 "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
4433 "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
4434 "dev": true,
4435 + "license": "MIT",
4436 "dependencies": {
4437 "es-define-property": "^1.0.0",
4438 "es-errors": "^1.3.0",
@@ -4569,6 +4461,7 @@
4461 "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
4462 "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
4463 "dev": true,
4464 + "license": "MIT",
4465 "engines": {
4466 "node": ">=6"
4467 }
@@ -4578,6 +4471,7 @@
4471 "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
4472 "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
4473 "dev": true,
4474 + "license": "MIT",
4475 "engines": {
4476 "node": ">=10"
4477 },
@@ -4589,14 +4483,15 @@
4483 "version": "2.0.1",
4484 "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
4485 "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
4486 + "license": "MIT",
4487 "engines": {
4488 "node": ">= 6"
4489 }
4490 },
4491 "node_modules/caniuse-lite": {
4597 - "version": "1.0.30001669",
4598 - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz",
4599 - "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==",
4492 + "version": "1.0.30001684",
4493 + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz",
4494 + "integrity": "sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==",
4495 "funding": [
4496 {
4497 "type": "opencollective",
@@ -4610,18 +4505,21 @@
4505 "type": "github",
4506 "url": "https://github.com/sponsors/ai"
4507 }
4613 - ]
4508 + ],
4509 + "license": "CC-BY-4.0"
4510 },
4511 "node_modules/caseless": {
4512 "version": "0.12.0",
4513 "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
4514 "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
4619 - "dev": true
4515 + "dev": true,
4516 + "license": "Apache-2.0"
4517 },
4518 "node_modules/ccount": {
4519 "version": "2.0.1",
4520 "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
4521 "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
4522 + "license": "MIT",
4523 "funding": {
4524 "type": "github",
4525 "url": "https://github.com/sponsors/wooorm"
@@ -4632,6 +4530,7 @@
4530 "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz",
4531 "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==",
4532 "dev": true,
4533 + "license": "MIT",
4534 "dependencies": {
4535 "assertion-error": "^2.0.1",
4536 "check-error": "^2.1.1",
@@ -4648,6 +4547,7 @@
4547 "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
4548 "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
4549 "dev": true,
4550 + "license": "MIT",
4551 "dependencies": {
4552 "ansi-styles": "^4.1.0",
4553 "supports-color": "^7.1.0"
@@ -4664,6 +4564,7 @@
4564 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
4565 "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
4566 "dev": true,
4567 + "license": "MIT",
4568 "dependencies": {
4569 "has-flag": "^4.0.0"
4570 },
@@ -4676,6 +4577,7 @@
4577 "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
4578 "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
4579 "dev": true,
4580 + "license": "MIT",
4581 "funding": {
4582 "type": "github",
4583 "url": "https://github.com/sponsors/wooorm"
@@ -4706,6 +4608,7 @@
4608 "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz",
4609 "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==",
4610 "dev": true,
4611 + "license": "MIT",
4612 "engines": {
4613 "node": ">= 16"
4614 }
@@ -4715,56 +4618,52 @@
4618 "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz",
4619 "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==",
4620 "dev": true,
4621 + "license": "MIT",
4622 "engines": {
4623 "node": ">= 0.8.0"
4624 }
4625 },
4626 "node_modules/chokidar": {
4723 - "version": "3.6.0",
4724 - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
4725 - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
4627 + "version": "4.0.1",
4628 + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz",
4629 + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==",
4630 + "license": "MIT",
4631 "dependencies": {
4727 - "anymatch": "~3.1.2",
4728 - "braces": "~3.0.2",
4729 - "glob-parent": "~5.1.2",
4730 - "is-binary-path": "~2.1.0",
4731 - "is-glob": "~4.0.1",
4732 - "normalize-path": "~3.0.0",
4733 - "readdirp": "~3.6.0"
4632 + "readdirp": "^4.0.1"
4633 },
4634 "engines": {
4736 - "node": ">= 8.10.0"
4635 + "node": ">= 14.16.0"
4636 },
4637 "funding": {
4638 "url": "https://paulmillr.com/funding/"
4740 - },
4741 - "optionalDependencies": {
4742 - "fsevents": "~2.3.2"
4639 }
4640 },
4745 - "node_modules/chokidar/node_modules/glob-parent": {
4746 - "version": "5.1.2",
4747 - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
4748 - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
4749 - "dependencies": {
4750 - "is-glob": "^4.0.1"
4751 - },
4641 + "node_modules/chokidar/node_modules/readdirp": {
4642 + "version": "4.0.2",
4643 + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz",
4644 + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==",
4645 + "license": "MIT",
4646 "engines": {
4753 - "node": ">= 6"
4647 + "node": ">= 14.16.0"
4648 + },
4649 + "funding": {
4650 + "type": "individual",
4651 + "url": "https://paulmillr.com/funding/"
4652 }
4653 },
4654 "node_modules/chownr": {
4655 "version": "2.0.0",
4656 "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
4657 "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
4658 + "license": "ISC",
4659 "engines": {
4660 "node": ">=10"
4661 }
4662 },
4663 "node_modules/ci-info": {
4765 - "version": "4.0.0",
4766 - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
4767 - "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
4664 + "version": "4.1.0",
4665 + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz",
4666 + "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==",
4667 "dev": true,
4668 "funding": [
4669 {
@@ -4772,6 +4671,7 @@
4671 "url": "https://github.com/sponsors/sibiraj-s"
4672 }
4673 ],
4674 + "license": "MIT",
4675 "engines": {
4676 "node": ">=8"
4677 }
@@ -4780,6 +4680,7 @@
4680 "version": "0.1.6",
4681 "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz",
4682 "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==",
4683 + "license": "MIT",
4684 "dependencies": {
4685 "consola": "^3.2.3"
4686 }
@@ -4787,13 +4688,15 @@
4688 "node_modules/classnames": {
4689 "version": "2.5.1",
4690 "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
4790 - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
4691 + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==",
4692 + "license": "MIT"
4693 },
4694 "node_modules/clean-regexp": {
4695 "version": "1.0.0",
4696 "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz",
4697 "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==",
4698 "dev": true,
4699 + "license": "MIT",
4700 "dependencies": {
4701 "escape-string-regexp": "^1.0.5"
4702 },
@@ -4806,6 +4709,7 @@
4709 "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
4710 "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
4711 "dev": true,
4712 + "license": "MIT",
4713 "engines": {
4714 "node": ">=0.8.0"
4715 }
@@ -4815,6 +4719,7 @@
4719 "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
4720 "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
4721 "dev": true,
4722 + "license": "MIT",
4723 "engines": {
4724 "node": ">=6"
4725 }
@@ -4824,6 +4729,7 @@
4729 "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
4730 "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
4731 "dev": true,
4732 + "license": "MIT",
4733 "dependencies": {
4734 "restore-cursor": "^3.1.0"
4735 },
@@ -4836,6 +4742,7 @@
4742 "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
4743 "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
4744 "dev": true,
4745 + "license": "MIT",
4746 "dependencies": {
4747 "string-width": "^4.2.0"
4748 },
@@ -4851,6 +4758,7 @@
4758 "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
4759 "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
4760 "dev": true,
4761 + "license": "MIT",
4762 "dependencies": {
4763 "slice-ansi": "^3.0.0",
4764 "string-width": "^4.2.0"
@@ -4867,6 +4775,7 @@
4775 "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
4776 "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
4777 "dev": true,
4778 + "license": "ISC",
4779 "dependencies": {
4780 "string-width": "^4.2.0",
4781 "strip-ansi": "^6.0.1",
@@ -4881,6 +4790,7 @@
4790 "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
4791 "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
4792 "dev": true,
4793 + "license": "MIT",
4794 "dependencies": {
4795 "ansi-styles": "^4.0.0",
4796 "string-width": "^4.1.0",
@@ -4898,6 +4808,7 @@
4808 "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
4809 "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
4810 "dev": true,
4811 + "license": "MIT",
4812 "engines": {
4813 "iojs": ">= 1.0.0",
4814 "node": ">= 0.12.0"
@@ -4907,6 +4818,7 @@
4818 "version": "2.0.1",
4819 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
4820 "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
4821 + "license": "MIT",
4822 "dependencies": {
4823 "color-name": "~1.1.4"
4824 },
@@ -4917,23 +4829,27 @@
4829 "node_modules/color-name": {
4830 "version": "1.1.4",
4831 "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
4920 - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
4832 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
4833 + "license": "MIT"
4834 },
4835 "node_modules/colord": {
4836 "version": "2.9.3",
4837 "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
4925 - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw=="
4838 + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
4839 + "license": "MIT"
4840 },
4841 "node_modules/colorette": {
4842 "version": "2.0.20",
4843 "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
4844 "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
4931 - "dev": true
4845 + "dev": true,
4846 + "license": "MIT"
4847 },
4848 "node_modules/combined-stream": {
4849 "version": "1.0.8",
4850 "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
4851 "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
4852 + "license": "MIT",
4853 "dependencies": {
4854 "delayed-stream": "~1.0.0"
4855 },
@@ -4956,6 +4872,7 @@
4872 "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
4873 "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
4874 "dev": true,
4875 + "license": "MIT",
4876 "engines": {
4877 "node": ">= 6"
4878 }
@@ -4965,6 +4882,7 @@
4882 "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
4883 "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
4884 "dev": true,
4885 + "license": "MIT",
4886 "engines": {
4887 "node": ">= 12.0.0"
4888 }
@@ -4974,6 +4892,7 @@
4892 "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
4893 "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
4894 "dev": true,
4895 + "license": "MIT",
4896 "engines": {
4897 "node": ">=4.0.0"
4898 }
@@ -4981,24 +4900,28 @@
4900 "node_modules/compatx": {
4901 "version": "0.1.8",
4902 "resolved": "https://registry.npmjs.org/compatx/-/compatx-0.1.8.tgz",
4984 - "integrity": "sha512-jcbsEAR81Bt5s1qOFymBufmCbXCXbk0Ql+K5ouj6gCyx2yHlu6AgmGIi9HxfKixpUDO5bCFJUHQ5uM6ecbTebw=="
4903 + "integrity": "sha512-jcbsEAR81Bt5s1qOFymBufmCbXCXbk0Ql+K5ouj6gCyx2yHlu6AgmGIi9HxfKixpUDO5bCFJUHQ5uM6ecbTebw==",
4904 + "license": "MIT"
4905 },
4906 "node_modules/concat-map": {
4907 "version": "0.0.1",
4908 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
4909 "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
4990 - "dev": true
4910 + "dev": true,
4911 + "license": "MIT"
4912 },
4913 "node_modules/confbox": {
4914 "version": "0.1.8",
4915 "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
4995 - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="
4916 + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
4917 + "license": "MIT"
4918 },
4919 "node_modules/config-chain": {
4920 "version": "1.1.13",
4921 "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
4922 "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
4923 "dev": true,
4924 + "license": "MIT",
4925 "dependencies": {
4926 "ini": "^1.3.4",
4927 "proto-list": "~1.2.1"
@@ -5008,12 +4931,14 @@
4931 "version": "1.3.8",
4932 "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
4933 "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
5011 - "dev": true
4934 + "dev": true,
4935 + "license": "ISC"
4936 },
4937 "node_modules/consola": {
4938 "version": "3.2.3",
4939 "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz",
4940 "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==",
4941 + "license": "MIT",
4942 "engines": {
4943 "node": "^14.18.0 || >=16.10.0"
4944 }
@@ -5023,6 +4948,7 @@
4948 "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
4949 "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
4950 "dev": true,
4951 + "license": "MIT",
4952 "dependencies": {
4953 "safe-buffer": "5.2.1"
4954 },
@@ -5035,6 +4961,7 @@
4961 "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
4962 "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
4963 "dev": true,
4964 + "license": "MIT",
4965 "engines": {
4966 "node": ">= 0.6"
4967 }
@@ -5042,13 +4969,15 @@
4969 "node_modules/convert-source-map": {
4970 "version": "2.0.0",
4971 "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
5045 - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="
4972 + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
4973 + "license": "MIT"
4974 },
4975 "node_modules/cookies": {
4976 "version": "0.9.1",
4977 "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz",
4978 "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==",
4979 "dev": true,
4980 + "license": "MIT",
4981 "dependencies": {
4982 "depd": "~2.0.0",
4983 "keygrip": "~1.1.0"
@@ -5062,6 +4991,7 @@
4991 "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz",
4992 "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==",
4993 "dev": true,
4994 + "license": "MIT",
4995 "dependencies": {
4996 "is-what": "^4.1.8"
4997 },
@@ -5073,12 +5003,13 @@
5003 }
5004 },
5005 "node_modules/core-js-compat": {
5076 - "version": "3.38.1",
5077 - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz",
5078 - "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==",
5006 + "version": "3.39.0",
5007 + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz",
5008 + "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==",
5009 "dev": true,
5010 + "license": "MIT",
5011 "dependencies": {
5081 - "browserslist": "^4.23.3"
5012 + "browserslist": "^4.24.2"
5013 },
5014 "funding": {
5015 "type": "opencollective",
@@ -5089,13 +5020,15 @@
5020 "version": "1.0.2",
5021 "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
5022 "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
5092 - "dev": true
5023 + "dev": true,
5024 + "license": "MIT"
5025 },
5026 "node_modules/cosmiconfig": {
5027 "version": "7.1.0",
5028 "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
5029 "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",

This file is too large to show in full.

frontend/package.json
+21 -21
@@ -43,8 +43,8 @@
43 "@fontsource/public-sans": "^5.1.1",
44 "@shikijs/markdown-it": "^1.23.1",
45 "@tailwindcss/container-queries": "^0.1.1",
46 - "@vueuse/core": "^11.3.0",
47 - "axios": "^1.7.7",
46 + "@vueuse/core": "^12.0.0",
47 + "axios": "^1.7.8",
48 "bytes": "^3.1.2",
49 "colord": "^2.9.3",
50 "dayjs": "^1.11.13",
@@ -56,10 +56,10 @@
56 "js-md5": "^0.8.3",
57 "lodash": "^4.17.21",
58 "mitt": "^3.0.1",
59 - "naive-ui": "^2.40.1",
60 - "nanoid": "^5.0.8",
59 + "naive-ui": "^2.40.2",
60 + "nanoid": "^5.0.9",
61 "password-validator": "^5.3.0",
62 - "pinia": "^2.2.6",
62 + "pinia": "^2.2.7",
63 "pinia-plugin-persistedstate": "^4.1.3",
64 "secure-ls": "^2.0.0",
65 "shiki": "^1.23.1",
@@ -68,18 +68,18 @@
68 "vue-advanced-cropper": "^2.8.9",
69 "vue-highlight-words": "^3.0.1",
70 "vue-i18n": "^10.0.4",
71 - "vue-router": "^4.4.5",
71 + "vue-router": "^4.5.0",
72 "vue-sjv": "^0.0.6",
73 - "vue3-apexcharts": "^1.7.0",
73 + "vue3-apexcharts": "^1.8.0",
74 "vue3-marquee": "^4.2.2",
75 "vuedraggable": "^4.1.0"
76 },
77 "optionalDependencies": {
78 - "@rollup/rollup-linux-x64-gnu": "^4.27.3"
78 + "@rollup/rollup-linux-x64-gnu": "^4.27.4"
79 },
80 "devDependencies": {
81 - "@antfu/eslint-config": "^3.9.2",
82 - "@clack/prompts": "^0.8.1",
81 + "@antfu/eslint-config": "^3.11.0",
82 + "@clack/prompts": "^0.8.2",
83 "@iconify/vue": "^4.1.2",
84 "@tsconfig/node20": "^20.1.4",
85 "@types/bytes": "^3.1.4",
@@ -87,10 +87,10 @@
87 "@types/fs-extra": "^11.0.4",
88 "@types/jsdom": "^21.1.7",
89 "@types/lodash": "^4.17.13",
90 - "@types/node": "^22.9.1",
90 + "@types/node": "^22.10.0",
91 "@types/validator": "^13.12.2",
92 - "@vitejs/plugin-vue": "^5.2.0",
93 - "@vitejs/plugin-vue-jsx": "^4.1.0",
92 + "@vitejs/plugin-vue": "^5.2.1",
93 + "@vitejs/plugin-vue-jsx": "^4.1.1",
94 "@vue/test-utils": "^2.4.6",
95 "@vue/tsconfig": "^0.6.0",
96 "autoprefixer": "^10.4.20",
@@ -102,28 +102,28 @@
102 "jsdom": "^25.0.1",
103 "npm-run-all2": "^7.0.1",
104 "postcss": "^8.4.49",
105 - "prettier": "^3.3.3",
105 + "prettier": "^3.4.1",
106 "prettier-plugin-tailwindcss": "^0.6.9",
107 "sass": "^1.81.0",
108 "start-server-and-test": "^2.0.8",
109 "tailwind-config-viewer": "^2.0.4",
110 "tailwindcss": "^3.4.15",
111 "taze": "^0.18.0",
112 - "type-fest": "^4.27.0",
112 + "type-fest": "^4.29.0",
113 "typescript": "~5.6.3",
114 - "unplugin-vue-components": "^0.27.4",
114 + "unplugin-vue-components": "^0.27.5",
115 "vite": "^5.4.11",
116 "vite-bundle-visualizer": "^1.2.1",
117 - "vite-plugin-vue-devtools": "^7.6.4",
117 + "vite-plugin-vue-devtools": "^7.6.5",
118 "vite-svg-loader": "^5.1.0",
119 - "vitest": "^2.1.5",
119 + "vitest": "^2.1.6",
120 "vue-tsc": "^2.1.10"
121 },
122 "pnpm": {
123 "overrides": {
124 - "@typescript-eslint/eslint-plugin": "^8.15.0",
124 + "@typescript-eslint/eslint-plugin": "^8.16.0",
125 "@typescript-eslint/eslint-plugin>eslint": "$eslint",
126 - "@typescript-eslint/parser": "^8.15.0",
126 + "@typescript-eslint/parser": "^8.16.0",
127 "@typescript-eslint/parser>eslint": "$eslint",
128 "eslint": "$eslint"
129 }
@@ -135,6 +135,6 @@
135 "@typescript-eslint/parser": {
136 "eslint": "^9.15.0"
137 },
138 - "@typescript-eslint/typescript-estree": "^8.15.0"
138 + "@typescript-eslint/typescript-estree": "^8.16.0"
139 }
140 }
frontend/public/images/connectors/virustotal.svg new
+1
@@ -0,0 +1 @@
1 +<svg xmlns="http://www.w3.org/2000/svg" width="120" height="60"><path d="M18.998 30L8.722 40.346h22.632V19.654H8.722zm10.287 8.277H13.507l8.466-8.33-8.238-8.225h15.55zM42.33 33.33l-3.215-9.278h-2.07l4.138 11.64h2.21l4.257-11.64h-2.07l-3.25 9.278zm6.614-6.174h1.81V35.7h-1.81zm5.95 1.035v-1.035h-1.81V35.7h1.81v-6.208c.66-.527 1.483-.81 2.328-.807.345-.015.69-.005 1.035.03v-1.81h-.776c-1.154 0-1.906.517-2.587 1.293zm10.346 5.173c-.724.476-1.552 1.035-2.587 1.035-.68 0-1.293-.318-1.293-.776v-6.466h-1.81v6.984c0 1.08 1.23 1.81 2.587 1.81 1.257 0 2.002-.367 3.05-1.066v.807h1.865v-8.536h-1.81zm7.964-2.517l-1.293-.375c-.918-.272-1.172-.476-1.172-.985s.323-1.07 1.443-1.07c.934 0 1.9.313 2.625.55v-1.552c-.724-.186-1.604-.494-2.37-.494-2.53 0-3.523 1.275-3.523 2.654s.64 1.97 1.966 2.38l1.293.39c1 .305 1.187.577 1.187 1.053 0 .543-.435 1.138-1.588 1.138a7.44 7.44 0 0 1-2.912-.654v1.552c.92.296 1.88.452 2.845.466 2.65 0 3.58-1.348 3.58-2.656-.005-1.223-.502-1.948-2.082-2.395zm11.94-6.795h-8.264v1.81h3.104v9.83h2.07v-9.83h3.09zm12.687 10.346c-.424 0-.864-.04-1.035-.26s-.26-.207-.26-1.552v-3.88h2.587v-1.552h-2.587v-2.07h-1.81v2.07h-1.552v1.552h1.552v4.138c0 1.2.178 1.81.517 2.266a2.26 2.26 0 0 0 1.79.776c.887 0 .978-.047 2.087-.207v-1.542c-1.1.2-.773.26-1.29.26zm11.64-10.346h1.81V35.7h-1.81zm-60.52 1.76l1.805.052v-1.81h-1.805zm55.53 1.1a12.1 12.1 0 0 0-3.805.753v1.552c1.138-.375 2.496-.69 3.31-.69.647 0 1.035.137 1.265.442.22.297.338.656.34 1.024v.517a16.63 16.63 0 0 0-3.766.566c-1.035.3-1.583.957-1.583 2.147 0 1.293.846 2.68 2.716 2.68 1.023.004 1.992-.458 2.633-1.254V35.7h1.81l-.023-5.372c0-.918-.05-1.705-.235-2.13-.458-1.02-1.438-1.27-2.662-1.27zm1.1 6.702a3.05 3.05 0 0 1-2.093.91c-1.104 0-1.495-.68-1.495-1.293.02-.575.436-1.06 1-1.17a11.82 11.82 0 0 1 2.587-.259zM88.45 26.92c-1.17 0-2.093.204-2.804.71-1.07.76-1.617 2.07-1.617 3.934 0 1.75.574 2.993 1.617 3.69.75.458 1.617.683 2.493.647 2.845 0 4.317-1.614 4.317-4.713 0-2.796-1.3-4.268-4.007-4.268zm-.225 7.537c-1.335 0-2.243-.566-2.243-3.205 0-1.834.755-2.887 2.364-2.887 1.764 0 2.14 1.104 2.14 3.125.003 2.333-.9 2.967-2.258 2.967z" fill="#3b61ff"/></svg>
frontend/src/api/endpoints/auth.ts
+1 -4
@@ -1,4 +1,4 @@
1 -import type { AuthUser, LoginPayload, RegisterPayload } from "@/types/auth.d"
1 +import type { LoginPayload, RegisterPayload } from "@/types/auth.d"
2 import type { FlaskBaseResponse } from "@/types/flask.d"
3 import jsonToFormData from "@ajoelp/json-to-formdata"
4 import { HttpClient } from "../httpClient"
@@ -17,9 +17,6 @@ export default {
17 refresh() {
18 return HttpClient.get<FlaskBaseResponse & { access_token: string; token_type: string }>("/auth/refresh")
19 },
20 - getUsers() {
21 - return HttpClient.get<FlaskBaseResponse & { users: AuthUser[] }>("/auth/users")
22 - },
20 /** need admin role */
21 resetPassword(username: string, password: string) {
22 return HttpClient.post<FlaskBaseResponse>("/auth/reset-password", {
frontend/src/api/endpoints/incidentManagement.ts
+11
@@ -231,6 +231,14 @@ export default {
231 deleteAlert(alertId: number) {
232 return HttpClient.delete<FlaskBaseResponse>(`/incidents/db_operations/alert/${alertId}`)
233 },
234 + deleteAlerts(alertIds: number[]) {
235 + return HttpClient.delete<FlaskBaseResponse & { deleted_alert_ids: number[]; not_deleted_alert_ids: [] }>(
236 + `/incidents/db_operations/alerts`,
237 + {
238 + data: { alert_ids: alertIds }
239 + }
240 + )
241 + },
242 getAlertContext(alertContextId: number) {
243 return HttpClient.get<FlaskBaseResponse & { alert_context: AlertContext }>(
244 `/incidents/db_operations/alert/context/${alertContextId}`
@@ -394,6 +402,9 @@ export default {
402 responseType: "blob"
403 })
404 },
405 + createCaseNotification(caseId: number) {
406 + return HttpClient.post<FlaskBaseResponse>(`/incidents/db_operations/case/notification`, { case_id: caseId })
407 + },
408 // #endregion
409
410 // #region Notification
frontend/src/api/endpoints/integrations.ts
+7
@@ -102,6 +102,13 @@ export default {
102 hot_data_retention: 30,
103 index_replicas: 0
104 })
105 + },
106 + catoProvision(customerCode: string, integrationName: string) {
107 + return HttpClient.post<FlaskBaseResponse>(`/cato/provision`, {
108 + customer_code: customerCode,
109 + integration_name: integrationName || "Cato",
110 + time_interval: 15
111 + })
112 }
113 // #endregion
114 }
frontend/src/api/endpoints/users.ts new
+9
@@ -0,0 +1,9 @@
1 +import type { FlaskBaseResponse } from "@/types/flask.d"
2 +import type { User } from "@/types/user.d"
3 +import { HttpClient } from "../httpClient"
4 +
5 +export default {
6 + getUsers() {
7 + return HttpClient.get<FlaskBaseResponse & { users: User[] }>("/auth/users")
8 + }
9 +}
frontend/src/api/index.ts
+3 -1
@@ -23,6 +23,7 @@ import sigma from "./endpoints/sigma"
23 import soc from "./endpoints/soc"
24 import stackProvisioning from "./endpoints/stackProvisioning"
25 import threatIntel from "./endpoints/threatIntel"
26 +import users from "./endpoints/users"
27 import webVulnerabilityAssessment from "./endpoints/webVulnerabilityAssessment"
28
29 export default {
@@ -51,5 +52,6 @@ export default {
52 cloudSecurityAssessment,
53 webVulnerabilityAssessment,
54 incidentManagement,
54 - sigma
55 + sigma,
56 + users
57 }
frontend/src/app-layouts/common/Toolbar/PinnedPages.vue
+3 -6
@@ -26,7 +26,7 @@
26 <template #trigger>
27 <button class="shortcuts-btn flex items-center gap-2">
28 <span>Shortcuts</span>
29 - <n-badge :value="pinned.length" :color="style['divider-030-color']" />
29 + <n-badge :value="pinned.length" color="var(--divider-030-color)" />
30 </button>
31 </template>
32 <div class="flex flex-col">
@@ -59,7 +59,6 @@
59
60 <script lang="ts" setup>
61 import Icon from "@/components/common/Icon.vue"
62 -import { useThemeStore } from "@/stores/theme"
62 import { type RemovableRef, useStorage } from "@vueuse/core"
63 import _split from "lodash/split"
64 import _takeRight from "lodash/takeRight"
@@ -77,8 +76,6 @@ interface Page {
76 const PinnedIcon = "tabler:pinned"
77 const CloseIcon = "carbon:close"
78 const router = useRouter()
80 -const themeStore = useThemeStore()
81 -const style = computed(() => themeStore.style)
79 const latest: RemovableRef<Page[]> = useStorage<Page[]>("latest-pages", [], sessionStorage)
80 const pinned: RemovableRef<Page[]> = useStorage<Page[]>("pinned-pages", [], localStorage)
81 const latestSanitized: ComputedRef<Page[]> = computed(() => {
@@ -164,7 +161,7 @@ router.afterEach(route => {
161
162 &.n-tag--closable {
163 &:hover {
167 - background-color: var(--bg-sidebar);
164 + background-color: var(--hover-color);
165
166 &.n-tag--round {
167 padding: 0 calc(var(--n-height) / 3.6) 0 calc(var(--n-height) / 3.6);
@@ -192,7 +189,7 @@ router.afterEach(route => {
189 border: none;
190
191 &:hover {
195 - background-color: var(--bg-secondary-color);
192 + background-color: var(--hover-color);
193 }
194 }
195
frontend/src/components/agents/AgentToolbar.vue
+1 -1
@@ -126,7 +126,7 @@ const textFilter = computed<string>({
126 }
127
128 &:hover {
129 - background-color: var(--bg-secondary-color);
129 + background-color: var(--hover-color);
130 }
131 }
132 }
frontend/src/components/agents/sca/ScaItem.vue
+2 -2
@@ -2,7 +2,7 @@
2 <n-tabs type="line" animated :tabs-padding="24">
3 <n-tab-pane name="Details" tab="Details" display-directive="show" class="flex flex-col gap-4 !py-8">
4 <div class="px-7">
5 - <n-card content-class="bg-secondary" class="overflow-hidden">
5 + <n-card embedded class="overflow-hidden">
6 <div class="flex flex-wrap justify-between gap-8">
7 <n-statistic label="Checks" :value="sca.total_checks" tabular-nums />
8 <n-statistic label="Pass" :value="sca.pass" tabular-nums />
@@ -13,7 +13,7 @@
13 </n-card>
14 </div>
15 <div class="px-7">
16 - <n-card content-class="bg-secondary" class="overflow-hidden">
16 + <n-card embedded class="overflow-hidden">
17 <div class="xs:!flex-row flex flex-col justify-between gap-8">
18 <n-statistic
19 class="grow"
frontend/src/components/agents/sca/ScaResultItemDetails.vue
+6 -4
@@ -2,7 +2,7 @@
2 <n-tabs type="line" animated :tabs-padding="24">
3 <n-tab-pane name="Overview" tab="Overview" display-directive="show:lazy" class="flex flex-col gap-4 !py-8">
4 <div class="px-7">
5 - <n-card content-class="bg-secondary" class="overflow-hidden">
5 + <n-card embedded class="overflow-hidden">
6 <div class="flex flex-wrap justify-between gap-8">
7 <n-statistic label="Result" tabular-nums>
8 <span
@@ -28,7 +28,7 @@
28 </div>
29
30 <div class="px-7">
31 - <n-card content-class="bg-secondary !p-0" class="overflow-hidden">
31 + <n-card content-class="!p-0" embedded class="overflow-hidden">
32 <div
33 v-shiki="{ lang: 'shell', decode: true }"
34 class="scrollbar-styled code-bg-transparent overflow-hidden"
@@ -114,7 +114,8 @@
114 <n-card
115 v-for="item of data.compliance"
116 :key="item.key"
117 - content-class="bg-secondary flex flex-col gap-2"
117 + content-class="flex flex-col gap-2"
118 + embedded
119 class="overflow-hidden"
120 size="small"
121 >
@@ -128,7 +129,8 @@
129 <n-card
130 v-for="item of data.rules"
131 :key="item.type + item.rule"
131 - content-class="bg-secondary flex flex-col gap-2"
132 + content-class="flex flex-col gap-2"
133 + embedded
134 class="overflow-hidden"
135 size="small"
136 >
frontend/src/components/artifacts/ArtifactRecommendation.vue
+2 -1
@@ -45,7 +45,8 @@
45 <n-card
46 v-for="recommendation of recommendations"
47 :key="recommendation.name"
48 - content-class="bg-secondary flex flex-col gap-2 !p-0"
48 + embedded
49 + content-class="flex flex-col gap-2 !p-0"
50 class="item-appear item-appear-bottom item-appear-005 overflow-hidden"
51 size="small"
52 >
frontend/src/components/auth/SignIn.vue
+1 -8
@@ -22,14 +22,7 @@
22 </n-form-item>
23 <div class="flex flex-col items-end gap-6">
24 <div class="w-full">
25 - <n-button
26 - type="primary"
27 - class="!w-full"
28 - size="large"
29 - :loading="loading"
30 - :disabled="!isValid"
31 - @click="signIn"
32 - >
25 + <n-button type="primary" class="!w-full" size="large" :loading :disabled="!isValid" @click="signIn">
26 Sign in
27 </n-button>
28 </div>
frontend/src/components/auth/SignUp.vue
+2 -2
@@ -159,10 +159,10 @@ import {
159 NSteps,
160 useMessage
161 } from "naive-ui"
162 -import isEmail from "validator/es/lib/isEmail"
163 -import { computed, ref } from "vue"
162 // import ImageCropper, { type ImageCropperResult } from "@/components/common/ImageCropper.vue"
163 import PasswordValidator from "password-validator"
164 +import isEmail from "validator/es/lib/isEmail"
165 +import { computed, ref } from "vue"
166
167 interface ModelType {
168 email: string
frontend/src/components/common/CodeSource.vue
+1 -1
@@ -1,6 +1,6 @@
1 <template>
2 <div class="flex flex-col gap-2">
3 - <n-card v-if="!showSource" content-class="bg-secondary !p-0" class="overflow-hidden">
3 + <n-card v-if="!showSource" content-class="!p-0" embedded class="overflow-hidden">
4 <div v-shiki="{ lang, decode }" class="scrollbar-styled code-bg-transparent overflow-hidden">
5 <pre v-html="source"></pre>
6 </div>
frontend/src/components/common/cards/CardEntity.vue
+3 -3
@@ -107,7 +107,7 @@ const { size, status, embedded, highlighted, clickable, hoverable, disabled, loa
107 .main-box,
108 .extra-box,
109 .footer-box {
110 - @apply gap-3 px-5 py-3;
110 + @apply gap-3 p-4;
111 }
112
113 .main-box {
@@ -122,7 +122,7 @@ const { size, status, embedded, highlighted, clickable, hoverable, disabled, loa
122 .main-box,
123 .extra-box,
124 .footer-box {
125 - @apply gap-2 px-3 py-2;
125 + @apply gap-2 p-3;
126 }
127
128 .main-box {
@@ -138,7 +138,7 @@ const { size, status, embedded, highlighted, clickable, hoverable, disabled, loa
138 .main-box,
139 .extra-box,
140 .footer-box {
141 - @apply gap-6 px-8 py-6;
141 + @apply gap-6 p-6;
142 }
143
144 .main-box {
frontend/src/components/customers/integrations/CustomerIntegrationActions.vue
+6 -1
@@ -56,6 +56,7 @@ const isCrowdstrike = computed(() => serviceName.value === "Crowdstrike")
56 const isDuo = computed(() => serviceName.value === "DUO")
57 const isDarktrace = computed(() => serviceName.value === "Darktrace")
58 const isBitdefender = computed(() => serviceName.value === "BitDefender")
59 +const isCato = computed(() => serviceName.value === "CATO")
60 const isDeployEnabled = computed(
61 () =>
62 (isOffice365.value ||
@@ -63,7 +64,8 @@ const isDeployEnabled = computed(
64 isCrowdstrike.value ||
65 isDuo.value ||
66 isDarktrace.value ||
66 - isBitdefender.value) &&
67 + isBitdefender.value ||
68 + isCato.value) &&
69 !integration.deployed
70 )
71
@@ -96,6 +98,9 @@ function provision() {
98 if (isBitdefender.value) {
99 apiCall = Api.integrations.bitdefenderProvision(customerCode.value, serviceName.value)
100 }
101 + if (isCato.value) {
102 + apiCall = Api.integrations.catoProvision(customerCode.value, serviceName.value)
103 + }
104
105 if (!apiCall) {
106 return
frontend/src/components/customers/integrations/CustomerIntegrationDetails.vue
+1 -3
@@ -70,12 +70,10 @@
70
71 <script setup lang="ts">
72 import type { IntegrationAuthKeyPairs, UpdateIntegrationPayload } from "@/api/endpoints/integrations"
73 -import type { CustomerIntegration, IntegrationAuthKey } from "@/types/integrations.d"
73 +import type { CustomerIntegration } from "@/types/integrations.d"
74 import Api from "@/api"
75 import CardKV from "@/components/common/cards/CardKV.vue"
76 import Icon from "@/components/common/Icon.vue"
77 -import _get from "lodash/get"
78 -import _trim from "lodash/trim"
77 import _uniqBy from "lodash/uniqBy"
78 import {
79 type FormInst,
frontend/src/components/graylog/MonitoringAlerts/CustomAlertForm.vue
+5 -25
@@ -1,5 +1,5 @@
1 <template>
2 - <n-spin :show="loading" class="custom-alert-form">
2 + <n-spin :show="loading">
3 <n-form ref="formRef" :label-width="80" :model="form" :rules="rules">
4 <div class="flex flex-col gap-2">
5 <div class="flex gap-4">
@@ -40,11 +40,11 @@
40 />
41 </n-form-item>
42 </div>
43 - <div class="custom-fields-editor">
43 + <div class="w-full">
44 <n-form-item label="Custom fields" path="custom_fields">
45 - <div class="custom-fields-list flex flex-col gap-1">
46 - <n-card v-for="(cf, index) of form.custom_fields" :key="cf.key" size="small">
47 - <div class="custom-field-box flex gap-2">
45 + <div class="flex w-full flex-col gap-1">
46 + <n-card v-for="(cf, index) of form.custom_fields" :key="cf.key" size="small" embedded>
47 + <div class="flex w-full gap-2">
48 <n-form-item
49 label="Name"
50 class="grow"
@@ -428,23 +428,3 @@ onMounted(() => {
428 })
429 })
430 </script>
431 -
432 -<style lang="scss" scoped>
433 -.custom-alert-form {
434 - .custom-fields-editor {
435 - width: 100%;
436 -
437 - .custom-fields-list {
438 - width: 100%;
439 -
440 - .n-card {
441 - background-color: var(--bg-secondary-color);
442 - }
443 -
444 - .custom-field-box {
445 - width: 100%;
446 - }
447 - }
448 - }
449 -}
450 -</style>
frontend/src/components/incidentManagement/alerts/AlertAsset.vue
+1 -1
@@ -102,7 +102,7 @@
102 >
103 <n-card
104 size="small"
105 - content-class="bg-secondary"
105 + embedded
106 class="hover:border-primary cursor-pointer overflow-hidden"
107 @click="openEvaluation()"
108 >
frontend/src/components/incidentManagement/alerts/AlertItem.vue
+17 -9
@@ -10,13 +10,18 @@
10 @click="compact ? openDetails() : undefined"
11 >
12 <template v-if="alert" #headerMain>
13 - <div
14 - class="flex cursor-pointer items-center gap-2"
15 - :class="{ 'hover:text-primary cursor-pointer': !compact }"
16 - @click="compact ? undefined : openDetails()"
17 - >
18 - <span>#{{ alert.id }} - {{ alert.source }}</span>
19 - <Icon v-if="!compact" :name="InfoIcon" :size="16"></Icon>
13 + <div class="flex items-center gap-4">
14 + <div v-if="selectable">
15 + <n-checkbox :checked="checked" @click.stop="emit('check', !checked)" />
16 + </div>
17 + <div
18 + class="flex cursor-pointer items-center gap-2"
19 + :class="{ 'hover:text-primary cursor-pointer': !compact }"
20 + @click="compact ? undefined : openDetails()"
21 + >
22 + <span>#{{ alert.id }} - {{ alert.source }}</span>
23 + <Icon v-if="!compact" :name="InfoIcon" :size="16"></Icon>
24 + </div>
25 </div>
26 </template>
27 <template v-if="alert?.alert_creation_time" #headerExtra>
@@ -265,7 +270,7 @@ import { useSettingsStore } from "@/stores/settings"
270 import { formatDate } from "@/utils"
271 import _clone from "lodash/cloneDeep"
272 import _truncate from "lodash/truncate"
268 -import { NButton, NCard, NModal, NPopover, NSpin, NTooltip, useDialog, useMessage } from "naive-ui"
273 +import { NButton, NCard, NCheckbox, NModal, NPopover, NSpin, NTooltip, useDialog, useMessage } from "naive-ui"
274 import { computed, defineAsyncComponent, onBeforeMount, onMounted, ref, toRefs } from "vue"
275 import AssigneeIcon from "../common/AssigneeIcon.vue"
276 import StatusIcon from "../common/StatusIcon.vue"
@@ -282,9 +287,12 @@ const props = defineProps<{
287 embedded?: boolean
288 detailsOnMounted?: boolean
289 highlight?: boolean
290 + selectable?: boolean
291 + checked?: boolean
292 }>()
293
294 const emit = defineEmits<{
295 + (e: "check", value: boolean): void
296 (e: "opened"): void
297 (e: "deleted"): void
298 (e: "updated", value: Alert): void
@@ -292,7 +300,7 @@ const emit = defineEmits<{
300
301 const AlertAssetItem = defineAsyncComponent(() => import("./AlertAsset.vue"))
302
295 -const { alertData, alertId, compact, embedded, detailsOnMounted, highlight } = toRefs(props)
303 +const { alertData, alertId, compact, embedded, detailsOnMounted, highlight, selectable, checked } = toRefs(props)
304
305 const InfoIcon = "carbon:information"
306 const LinkIcon = "carbon:launch"
frontend/src/components/incidentManagement/alerts/AlertOverview.vue
+1 -2
@@ -138,7 +138,7 @@
138 </div>
139 </div>
140
141 - <div class="footer-box flex items-center gap-2 px-7 py-4">
141 + <div class="footer-box bg-secondary flex items-center gap-2 px-7 py-4">
142 <AlertCreateCaseButton v-if="!linkedCases.length" :alert @updated="updateAlert" />
143
144 <AlertMergeCaseButton v-if="!linkedCases.length" :alert @updated="updateAlert" />
@@ -223,6 +223,5 @@ function handleDelete() {
223 <style lang="scss" scoped>
224 .footer-box {
225 border-top: var(--border-small-100);
226 - background-color: var(--bg-secondary-color);
226 }
227 </style>
frontend/src/components/incidentManagement/alerts/AlertsList.vue
+154 -2
@@ -102,18 +102,81 @@
102 />
103 </CollapseKeepAlive>
104
105 + <n-collapse-transition
106 + :show="!!checkedAlerts.length"
107 + style="position: sticky; top: calc(var(--toolbar-height) - 24px); z-index: 1"
108 + >
109 + <n-card content-class="flex flex-wrap items-center gap-3" size="small" class="mt-3 shadow-xl" embedded>
110 + <n-popover content-class="!p-0">
111 + <template #trigger>
112 + <n-button secondary size="small">
113 + <div class="flex min-w-8 items-center gap-2">
114 + <span>Selected</span>
115 + <n-badge
116 + :value="checkedAlerts.length"
117 + color="var(--divider-030-color)"
118 + class="!font-mono"
119 + />
120 + </div>
121 + </n-button>
122 + </template>
123 + <template #default>
124 + <div class="py-4">
125 + <n-scrollbar trigger="none" class="max-h-150 px-3 [&_.n-scrollbar-container]:rounded-lg">
126 + <div class="flex max-w-lg flex-col gap-2">
127 + <AlertItem
128 + v-for="alert of checkedAlerts"
129 + :key="alert.id"
130 + embedded
131 + compact
132 + selectable
133 + checked
134 + :alert-data="alert"
135 + @check="toggleCheck(alert)"
136 + @deleted="deleted(alert)"
137 + @updated="updateAlert($event)"
138 + />
139 + </div>
140 + </n-scrollbar>
141 + </div>
142 + </template>
143 + <template #footer>
144 + <div class="flex justify-between">
145 + <n-button size="small" secondary @click="setALlChecked()">Select current page</n-button>
146 + <n-button size="small" secondary @click="resetChecked()">Uncheck all</n-button>
147 + </div>
148 + </template>
149 + </n-popover>
150 +
151 + <n-popconfirm to="body" @positive-click="deleteAlerts()">
152 + <template #trigger>
153 + <n-button size="small" type="error" secondary :loading="deleting">
154 + <template #icon>
155 + <Icon :name="TrashIcon" />
156 + </template>
157 + Delete
158 + </n-button>
159 + </template>
160 + Are you sure you want to delete selected Alerts?
161 + </n-popconfirm>
162 + </n-card>
163 + </n-collapse-transition>
164 +
165 <n-spin :show="loading">
166 <div class="my-3 flex min-h-52 flex-col gap-2">
167 <template v-if="alertsList.length">
168 <AlertItem
169 v-for="alert of alertsList"
170 :key="alert.id"
171 + selectable
172 + :checked="isChecked(alert)"
173 :alert-data="alert"
174 :highlight="highlight === alert.id.toString()"
175 :details-on-mounted="highlight === alert.id.toString() && !highlightedItemOpened"
176 class="item-appear item-appear-bottom item-appear-005"
177 + @check="toggleCheck(alert)"
178 @opened="highlightedItemOpened = true"
116 - @deleted="getData()"
179 + @deleted="deleted(alert)"
180 @updated="updateAlert($event)"
181 />
182 </template>
@@ -145,7 +208,20 @@ import Icon from "@/components/common/Icon.vue"
208 import { useResizeObserver, useStorage } from "@vueuse/core"
209 import axios from "axios"
210 import _orderBy from "lodash/orderBy"
148 -import { NBadge, NButton, NEmpty, NPagination, NPopover, NSelect, NSpin, useMessage } from "naive-ui"
211 +import {
212 + NBadge,
213 + NButton,
214 + NCard,
215 + NCollapseTransition,
216 + NEmpty,
217 + NPagination,
218 + NPopconfirm,
219 + NPopover,
220 + NScrollbar,
221 + NSelect,
222 + NSpin,
223 + useMessage
224 +} from "naive-ui"
225 import { computed, nextTick, onBeforeMount, provide, ref, watch } from "vue"
226 import AlertItem from "./AlertItem.vue"
227 import AlertsFilters from "./AlertsFilters.vue"
@@ -161,10 +237,13 @@ const {
237 }>()
238
239 const FilterIcon = "carbon:filter-edit"
240 +const TrashIcon = "carbon:trash-can"
241 const InfoIcon = "carbon:information"
242
243 +const checkedAlerts = ref<Alert[]>([])
244 const message = useMessage()
245 const loading = ref(false)
246 +const deleting = ref(false)
247 const showFiltersView = useStorage<boolean>("incident-management-alerts-list-filters-view-state", false, localStorage)
248 const alertsList = ref<Alert[]>([])
249 const availableUsers = ref<string[]>([])
@@ -248,6 +327,45 @@ function updateAlert(updatedAlert: Alert) {
327 }
328 }
329
330 +function isChecked(alert: Alert) {
331 + return !!checkedAlerts.value.find(o => o.id === alert.id)
332 +}
333 +
334 +function toggleCheck(alert: Alert) {
335 + const alertIndex = checkedAlerts.value.findIndex(o => o.id === alert.id)
336 +
337 + if (checkedAlerts.value.find(o => o.id === alert.id)) {
338 + checkedAlerts.value.splice(alertIndex, 1)
339 + } else {
340 + checkedAlerts.value.push(alert)
341 + }
342 +}
343 +
344 +function resetChecked() {
345 + checkedAlerts.value = []
346 +}
347 +
348 +function setALlChecked() {
349 + for (const alert of alertsList.value) {
350 + if (!isChecked(alert)) {
351 + toggleCheck(alert)
352 + }
353 + }
354 +}
355 +
356 +function removeChecked(alert: Alert) {
357 + const alertIndex = checkedAlerts.value.findIndex(o => o.id === alert.id)
358 +
359 + if (checkedAlerts.value.find(o => o.id === alert.id)) {
360 + checkedAlerts.value.splice(alertIndex, 1)
361 + }
362 +}
363 +
364 +function deleted(alert: Alert) {
365 + removeChecked(alert)
366 + getData()
367 +}
368 +
369 function getData() {
370 abortController?.abort()
371 abortController = new AbortController()
@@ -318,6 +436,40 @@ function getCases() {
436 })
437 }
438
439 +function deleteAlerts() {
440 + deleting.value = true
441 +
442 + Api.incidentManagement
443 + .deleteAlerts(checkedAlerts.value.map(o => o.id))
444 + .then(res => {
445 + if (res.data.success) {
446 + if (res.data.deleted_alert_ids.length) {
447 + for (const id of res.data.deleted_alert_ids) {
448 + toggleCheck({ id } as Alert)
449 + }
450 +
451 + if (res.data.not_deleted_alert_ids.length) {
452 + message.warning("Some alerts could not be deleted.")
453 + } else {
454 + message.success(res.data?.message || "Alerts deleted successfully.")
455 + }
456 + } else {
457 + message.warning("The selected alerts could not be deleted")
458 + }
459 +
460 + getData()
461 + } else {
462 + message.warning(res.data?.message || "An error occurred. Please try again later.")
463 + }
464 + })
465 + .catch(err => {
466 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
467 + })
468 + .finally(() => {
469 + deleting.value = false
470 + })
471 +}
472 +
473 useResizeObserver(header, entries => {
474 const entry = entries[0]
475 const { width } = entry.contentRect
frontend/src/components/incidentManagement/cases/CaseItem.vue
+2
@@ -163,6 +163,7 @@
163 Delete Case
164 </n-button>
165 <CaseReportButton :case-id="caseEntity.id" size="tiny" />
166 + <CaseNotificationButton :case-id="caseEntity.id" size="tiny" />
167 </div>
168 </template>
169 <div class="flex flex-col gap-2">
@@ -232,6 +233,7 @@ import AssigneeIcon from "../common/AssigneeIcon.vue"
233 import StatusIcon from "../common/StatusIcon.vue"
234 import CaseAssignUser from "./CaseAssignUser.vue"
235 import CaseDetails from "./CaseDetails.vue"
236 +import CaseNotificationButton from "./CaseNotificationButton.vue"
237 import CaseReportButton from "./CaseReportButton.vue"
238 import CaseStatusSwitch from "./CaseStatusSwitch.vue"
239 import { handleDeleteCase } from "./utils"
frontend/src/components/incidentManagement/cases/CaseNotificationButton.vue new
+42
@@ -0,0 +1,42 @@
1 +<template>
2 + <n-button :size :loading="invoking" secondary @click="invoke()">
3 + <template #icon>
4 + <Icon :name="NotificationIcon" />
5 + </template>
6 + Invoke Customer Notification
7 + </n-button>
8 +</template>
9 +
10 +<script setup lang="ts">
11 +import type { Size } from "naive-ui/es/button/src/interface"
12 +import Api from "@/api"
13 +import Icon from "@/components/common/Icon.vue"
14 +import { NButton, useMessage } from "naive-ui"
15 +import { ref } from "vue"
16 +
17 +const { size, caseId } = defineProps<{ size?: Size; caseId: number }>()
18 +
19 +const NotificationIcon = "ph:bell"
20 +const invoking = ref(false)
21 +const message = useMessage()
22 +
23 +function invoke() {
24 + invoking.value = true
25 +
26 + Api.incidentManagement
27 + .createCaseNotification(caseId)
28 + .then(res => {
29 + if (res.data) {
30 + message.success(res.data.message || "Case notification created successfully.")
31 + } else {
32 + message.warning("An error occurred. Please try again later.")
33 + }
34 + })
35 + .catch(err => {
36 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
37 + })
38 + .finally(() => {
39 + invoking.value = false
40 + })
41 +}
42 +</script>
frontend/src/components/incidentManagement/cases/CaseOverview.vue
+1 -2
@@ -131,7 +131,7 @@
131 </div>
132 </div>
133
134 - <div class="footer-box flex justify-end gap-3 px-7 py-4">
134 + <div class="footer-box bg-secondary flex justify-end gap-3 px-7 py-4">
135 <n-button type="error" secondary @click="handleDelete()">
136 <template #icon>
137 <Icon :name="TrashIcon" />
@@ -205,6 +205,5 @@ function handleDelete() {
205 <style lang="scss" scoped>
206 .footer-box {
207 border-top: var(--border-small-100);
208 - background-color: var(--bg-secondary-color);
208 }
209 </style>
frontend/src/components/incidentManagement/cases/CaseReportTemplateManager.vue
+2 -1
@@ -73,7 +73,8 @@
73 :key="templateName"
74 size="small"
75 class="overflow-hidden"
76 - content-class="flex justify-between items-center bg-secondary flex-wrap gap-4"
76 + embedded
77 + content-class="flex justify-between items-center flex-wrap gap-4"
78 >
79 <div class="flex gap-3">
80 <n-tooltip to="body">
frontend/src/components/logs/LogItem.vue
+2 -2
@@ -62,7 +62,7 @@
62 </template>
63
64 <script setup lang="ts">
65 -import type { AuthUser } from "@/types/auth.d"
65 +import type { User } from "@/types/user.d"
66 import Badge from "@/components/common/Badge.vue"
67 import CardEntity from "@/components/common/cards/CardEntity.vue"
68 import Icon from "@/components/common/Icon.vue"
@@ -71,7 +71,7 @@ import { type Log, LogEventType } from "@/types/logs.d"
71 import dayjs from "@/utils/dayjs"
72 import { computed } from "vue"
73
74 -const { log, users } = defineProps<{ log: Log; users?: AuthUser[] }>()
74 +const { log, users } = defineProps<{ log: Log; users?: User[] }>()
75
76 const InfoIcon = "carbon:information"
77 const UserIcon = "carbon:user"
frontend/src/components/logs/LogsFilters.vue
+4 -4
@@ -56,7 +56,7 @@
56 </template>
57
58 <script setup lang="ts">
59 -import type { AuthUser } from "@/types/auth.d"
59 +import type { User } from "@/types/user.d"
60 import Api from "@/api"
61 import {
62 LogEventType,
@@ -70,7 +70,7 @@ import _toSafeInteger from "lodash/toSafeInteger"
70 import { NButton, NInput, NInputGroup, NInputNumber, NSelect } from "naive-ui"
71 import { computed, onBeforeMount, ref, toRefs, watch } from "vue"
72
73 -const props = defineProps<{ users?: AuthUser[]; fetchingUsers?: boolean }>()
73 +const props = defineProps<{ users?: User[]; fetchingUsers?: boolean }>()
74
75 const emit = defineEmits<{
76 (e: "close"): void
@@ -157,7 +157,7 @@ function submit() {
157 function getUsers() {
158 loadingUsers.value = true
159
160 - Api.auth
160 + Api.users
161 .getUsers()
162 .then(res => {
163 if (res.data.success) {
@@ -169,7 +169,7 @@ function getUsers() {
169 })
170 }
171
172 -function setUsers(users: AuthUser[]) {
172 +function setUsers(users: User[]) {
173 userIdOptions.value = (users || []).map(o => ({
174 label: `#${o.id} - ${o.username}`,
175 value: `${o.id}`
frontend/src/components/logs/LogsList.vue
+3 -3
@@ -116,7 +116,7 @@
116 </template>
117
118 <script setup lang="ts">
119 -import type { AuthUser } from "@/types/auth.d"
119 +import type { User } from "@/types/user.d"
120 import Api from "@/api"
121 import Icon from "@/components/common/Icon.vue"
122 import {
@@ -147,7 +147,7 @@ const loadingUsers = ref(false)
147 const loading = ref(false)
148 const loadingPurge = ref(false)
149 const showPurgeConfirm = ref(false)
150 -const usersList = ref<AuthUser[]>([])
150 +const usersList = ref<User[]>([])
151 const logsList = ref<LogExt[]>([])
152 const showFilters = ref(false)
153
@@ -252,7 +252,7 @@ function getData() {
252 function getUsers() {
253 loadingUsers.value = true
254
255 - Api.auth
255 + Api.users
256 .getUsers()
257 .then(res => {
258 if (res.data.success) {
frontend/src/components/reportCreation/Panels.vue
+1 -2
@@ -139,7 +139,7 @@
139 </div>
140 </div>
141
142 - <div class="panels-sidebar h-full">
142 + <div class="panels-sidebar bg-secondary h-full">
143 <n-scrollbar v-if="dashboard && panelsList.length" style="max-height: 100%" trigger="none">
144 <div class="p-3">
145 <draggable
@@ -599,7 +599,6 @@ onMounted(() => {
599
600 .panels-sidebar {
601 border-radius: var(--border-radius);
602 - background-color: var(--bg-secondary-color);
602 border: var(--border-small-050);
603 width: 200px;
604
frontend/src/components/sigma/QueryOverview.vue
+1 -2
@@ -106,7 +106,7 @@
106 </div>
107 </div>
108
109 - <div class="footer-box flex items-center gap-2 px-7 py-4">
109 + <div class="footer-box bg-secondary flex items-center gap-2 px-7 py-4">
110 <div class="grow"></div>
111
112 <QueryDeleteOne
@@ -164,6 +164,5 @@ function updateQuery(updatedQuery: SigmaQuery) {
164 <style lang="scss" scoped>
165 .footer-box {
166 border-top: var(--border-small-100);
167 - background-color: var(--bg-secondary-color);
167 }
168 </style>
frontend/src/components/threatIntel/ThreatIntelEpssScore.vue
+1 -1
@@ -12,7 +12,7 @@
12 <n-card
13 v-for="item of epssList"
14 :key="item.___id"
15 - content-class="bg-secondary"
15 + embedded
16 class="item-appear item-appear-bottom item-appear-005 overflow-hidden"
17 >
18 <div class="xs:!flex-row flex flex-col justify-between gap-8">
frontend/src/components/threatIntel/ThreatIntelForm.vue
+1 -2
@@ -8,7 +8,7 @@
8 <div class="flex justify-end">
9 <n-button type="primary" :disabled="!isValid" @click="create()">Submit</n-button>
10 </div>
11 - <div v-if="error || !!response" class="response" :class="{ error }">
11 + <div v-if="error || !!response" class="response bg-secondary" :class="{ error }">
12 <div v-if="error" class="message">
13 {{ error }}
14 </div>
@@ -146,7 +146,6 @@ onMounted(() => {
146
147 <style scoped lang="scss">
148 .response {
149 - background-color: var(--bg-secondary-color);
149 border-radius: var(--border-radius);
150 border: 1px solid var(--success-color);
151
frontend/src/components/threatIntel/ThreatIntelProcessEvaluationProvider.vue
+1 -1
@@ -19,7 +19,7 @@
19 class="flex flex-col gap-4 !py-8"
20 >
21 <div class="px-7">
22 - <n-card content-class="bg-secondary" class="overflow-hidden">
22 + <n-card embedded class="overflow-hidden">
23 <div class="flex flex-wrap justify-between gap-8">
24 <n-statistic label="Rank" :value="evaluation.rank" tabular-nums />
25 <n-statistic label="EPS" :value="eps" tabular-nums />
frontend/src/components/users/UsersList.vue
+3 -3
@@ -50,7 +50,7 @@
50 </template>
51
52 <script setup lang="ts">
53 -import type { AuthUser } from "@/types/auth.d"
53 +import type { User } from "@/types/user.d"
54 import Api from "@/api"
55 import Icon from "@/components/common/Icon.vue"
56 import { useAuthStore } from "@/stores/auth"
@@ -64,7 +64,7 @@ const { highlight } = toRefs(props)
64 const DropdownIcon = "carbon:overflow-menu-horizontal"
65 const message = useMessage()
66 const loadingUsers = ref(false)
67 -const usersList = ref<AuthUser[]>([])
67 +const usersList = ref<User[]>([])
68 const isAdmin = useAuthStore().isAdmin
69 const selectedUser = ref("")
70
@@ -79,7 +79,7 @@ const options = [
79 function getUsers() {
80 loadingUsers.value = true
81
82 - Api.auth
82 + Api.users
83 .getUsers()
84 .then(res => {
85 if (res.data.success) {
frontend/src/design-tokens.json
+3 -3
@@ -1,13 +1,13 @@
1 {
2 "borderRadius": {
3 - "base": "6px",
4 - "small": "3px"
3 + "base": "8px",
4 + "small": "4px"
5 },
6 "lineHeight": {
7 "base": "1.35"
8 },
9 "fontSize": {
10 - "base": "15px",
10 + "base": "16px",
11 "cardTitle": "18px"
12 },
13 "fontFamily": {
frontend/src/router/index.ts
+27 -26
@@ -1,9 +1,9 @@
1 import type { FormType } from "@/components/auth/types.d"
2 -import { UserRole } from "@/types/auth.d"
2 +import { RouteRole } from "@/types/auth.d"
3 import { Layout } from "@/types/theme.d"
4 import { authCheck } from "@/utils/auth"
5 -import Login from "@/views/auth/Login.vue"
6 -import Overview from "@/views/Overview.vue"
5 +import AuthPage from "@/views/Auth.vue"
6 +import OverviewPage from "@/views/Overview.vue"
7 import { createRouter, createWebHistory } from "vue-router"
8
9 const router = createRouter({
@@ -16,26 +16,26 @@ const router = createRouter({
16 {
17 path: "/overview",
18 name: "Overview",
19 - component: Overview,
20 - meta: { title: "Overview", auth: true, roles: UserRole.All }
19 + component: OverviewPage,
20 + meta: { title: "Overview", auth: true, roles: RouteRole.All }
21 },
22 {
23 path: "/indices",
24 name: "Indices",
25 component: () => import("@/views/Indices.vue"),
26 - meta: { title: "Indices", auth: true, roles: UserRole.All }
26 + meta: { title: "Indices", auth: true, roles: RouteRole.All }
27 },
28 {
29 path: "/connectors",
30 name: "Connectors",
31 component: () => import("@/views/Connectors.vue"),
32 - meta: { title: "Connectors", auth: true, roles: UserRole.All }
32 + meta: { title: "Connectors", auth: true, roles: RouteRole.All }
33 },
34 {
35 path: "/agents",
36 meta: {
37 auth: true,
38 - roles: UserRole.All
38 + roles: RouteRole.All
39 },
40 children: [
41 {
@@ -57,7 +57,7 @@ const router = createRouter({
57 redirect: "/graylog/management",
58 meta: {
59 auth: true,
60 - roles: UserRole.All
60 + roles: RouteRole.All
61 },
62 children: [
63 {
@@ -84,13 +84,13 @@ const router = createRouter({
84 path: "/alerts",
85 name: "Alerts",
86 component: () => import("@/views/AlertsGraylog.vue"),
87 - meta: { title: "Alerts", auth: true, roles: UserRole.All }
87 + meta: { title: "Alerts", auth: true, roles: RouteRole.All }
88 },
89 {
90 path: "/artifacts",
91 name: "Artifacts",
92 component: () => import("@/views/Artifacts.vue"),
93 - meta: { title: "Artifacts", auth: true, roles: UserRole.All }
93 + meta: { title: "Artifacts", auth: true, roles: RouteRole.All }
94 },
95 /*
96 {
@@ -98,7 +98,7 @@ const router = createRouter({
98 redirect: "/soc/alerts",
99 meta: {
100 auth: true,
101 - roles: UserRole.All
101 + roles: RouteRole.All
102 },
103 children: [
104 {
@@ -133,7 +133,7 @@ const router = createRouter({
133 redirect: "/incident-management/alerts",
134 meta: {
135 auth: true,
136 - roles: UserRole.All
136 + roles: RouteRole.All
137 },
138 children: [
139 {
@@ -166,32 +166,32 @@ const router = createRouter({
166 path: "/healthcheck",
167 name: "Healthcheck",
168 component: () => import("@/views/Healthcheck.vue"),
169 - meta: { title: "Healthcheck", auth: true, roles: UserRole.All }
169 + meta: { title: "Healthcheck", auth: true, roles: RouteRole.All }
170 },
171 {
172 path: "/customers",
173 name: "Customers",
174 component: () => import("@/views/Customers.vue"),
175 - meta: { title: "Customers", auth: true, roles: UserRole.All }
175 + meta: { title: "Customers", auth: true, roles: RouteRole.All }
176 },
177 {
178 path: "/logs",
179 name: "Logs",
180 component: () => import("@/views/Logs.vue"),
181 - meta: { title: "Logs", auth: true, roles: UserRole.All }
181 + meta: { title: "Logs", auth: true, roles: RouteRole.All }
182 },
183 {
184 path: "/users",
185 name: "Users",
186 component: () => import("@/views/Users.vue"),
187 - meta: { title: "Users", auth: true, roles: UserRole.All }
187 + meta: { title: "Users", auth: true, roles: RouteRole.All }
188 },
189 {
190 path: "/external-services",
191 redirect: "/external-services/third-party-integrations",
192 meta: {
193 auth: true,
194 - roles: UserRole.All
194 + roles: RouteRole.All
195 },
196 children: [
197 {
@@ -212,31 +212,31 @@ const router = createRouter({
212 path: "/report-creation",
213 name: "ReportCreation",
214 component: () => import("@/views/ReportCreation.vue"),
215 - meta: { title: "Report Creation", auth: true, roles: UserRole.All }
215 + meta: { title: "Report Creation", auth: true, roles: RouteRole.All }
216 },
217 {
218 path: "/scheduler",
219 name: "Scheduler",
220 component: () => import("@/views/Scheduler.vue"),
221 - meta: { title: "Scheduler", auth: true, roles: UserRole.All }
221 + meta: { title: "Scheduler", auth: true, roles: RouteRole.All }
222 },
223 {
224 path: "/cloud-security-assessment",
225 name: "CloudSecurityAssessment",
226 component: () => import("@/views/CloudSecurityAssessment.vue"),
227 - meta: { title: "Cloud Sec. Assess.", auth: true, roles: UserRole.All }
227 + meta: { title: "Cloud Sec. Assess.", auth: true, roles: RouteRole.All }
228 },
229 {
230 path: "/web-vulnerability-assessment",
231 name: "WebVulnerabilityAssessment",
232 component: () => import("@/views/WebVulnerabilityAssessment.vue"),
233 - meta: { title: "Web Vuln. Assess.", auth: true, roles: UserRole.All }
233 + meta: { title: "Web Vuln. Assess.", auth: true, roles: RouteRole.All }
234 },
235 {
236 path: "/license",
237 meta: {
238 auth: true,
239 - roles: UserRole.All
239 + roles: RouteRole.All
240 },
241 children: [
242 {
@@ -264,18 +264,19 @@ const router = createRouter({
264 path: "/profile",
265 name: "Profile",
266 component: () => import("@/views/Profile.vue"),
267 - meta: { title: "Profile", auth: true, roles: UserRole.All }
267 + meta: { title: "Profile", auth: true, roles: RouteRole.All }
268 },
269 {
270 path: "/login",
271 name: "Login",
272 - component: Login,
272 + component: AuthPage,
273 + props: { formType: "signin" as FormType },
274 meta: { title: "Login", forceLayout: Layout.Blank, checkAuth: true, skipPin: true }
275 },
276 {
277 path: "/register",
278 name: "Register",
278 - component: Login,
279 + component: AuthPage,
280 props: { formType: "signup" as FormType },
281 meta: { title: "Register", forceLayout: Layout.Blank, checkAuth: true, skipPin: true }
282 },
frontend/src/stores/auth.ts
+36 -31
@@ -1,7 +1,15 @@
1 +import type { ApiError } from "@/types/common.d"
2 import Api from "@/api"
2 -import { type LoginPayload, type User, UserRole } from "@/types/auth.d"
3 +import {
4 + type AuthUser,
5 + AuthUserRole,
6 + type JWTPayload,
7 + type LoginPayload,
8 + type RouteMetaAuthRole,
9 + RouteRole
10 +} from "@/types/auth.d"
11 import { getAvatar, getNameInitials } from "@/utils"
4 -import { scopeToRole } from "@/utils/auth"
12 +import { jwtRoleToUserRole } from "@/utils/auth"
13 import * as jose from "jose"
14 import _castArray from "lodash/castArray"
15 import _toLower from "lodash/toLower"
@@ -17,20 +25,20 @@ export const useAuthStore = defineStore("auth", {
25 access_token: "",
26 username: "",
27 email: "",
20 - role: UserRole.Unknown
21 - } as User,
28 + role: AuthUserRole.Unknown
29 + } as AuthUser,
30 tokenDebounceTime: _toNumber(import.meta.env.VITE_TOKEN_DEBOUNCE_TIME) as number // seconds
31 }),
32 actions: {
33 setLogged(token: string) {
26 - const jwtPayload = jose.decodeJwt(token)
27 - const scopes = jwtPayload.scopes as string[]
34 + const jwtPayload = jose.decodeJwt<JWTPayload>(token)
35 + const scopes = jwtPayload.scopes
36
37 this.user = {
38 access_token: token,
39 username: jwtPayload.sub || "",
40 email: "",
33 - role: scopeToRole(scopes)
41 + role: jwtRoleToUserRole(scopes)
42 }
43 },
44 setToken(token: string) {
@@ -41,29 +49,26 @@ export const useAuthStore = defineStore("auth", {
49 access_token: "",
50 username: "",
51 email: "",
44 - role: UserRole.Unknown
52 + role: AuthUserRole.Unknown
53 }
54 },
47 - login(payload: LoginPayload) {
48 - return new Promise((resolve, reject) => {
49 - Api.auth
50 - .login(payload)
51 - .then(res => {
52 - if (res.data.access_token) {
53 - this.setLogged(res.data.access_token)
54 - this.getEmail()
55 - resolve(res.data)
56 - } else {
57 - reject(res.data)
58 - }
59 - })
60 - .catch(err => {
61 - reject(err.response?.data)
62 - })
63 - })
55 + async login(payload: LoginPayload) {
56 + try {
57 + const response = await Api.auth.login(payload)
58 +
59 + if (response.data.access_token) {
60 + this.setLogged(response.data.access_token)
61 + this.getEmail()
62 + }
63 +
64 + return response.data
65 + } catch (err) {
66 + const error = err as ApiError
67 + return error.response?.data
68 + }
69 },
70 getEmail() {
66 - Api.auth.getUsers().then(res => {
71 + Api.users.getUsers().then(res => {
72 if (res.data.users) {
73 const user = res.data.users.find(o => o.username === this.userName)
74 this.user.email = user?.email || ""
@@ -101,11 +106,11 @@ export const useAuthStore = defineStore("auth", {
106 userEmail(state): string {
107 return state.user?.email
108 },
104 - userRole(state): UserRole {
109 + userRole(state): AuthUserRole {
110 return state.user?.role
111 },
112 userRoleName(state): string {
108 - return UserRole[(state.user?.role || 0) as number]
113 + return AuthUserRole[(state.user?.role || 0) as number]
114 },
115 userPic(): string {
116 const initial = getNameInitials(this.userName)
@@ -116,7 +121,7 @@ export const useAuthStore = defineStore("auth", {
121 return _toLower(this.userRoleName) === "admin"
122 },
123 isRoleGranted() {
119 - return (roles?: UserRole | UserRole[]) => {
124 + return (roles?: RouteMetaAuthRole | RouteMetaAuthRole[]) => {
125 if (!roles) {
126 return true
127 }
@@ -124,9 +129,9 @@ export const useAuthStore = defineStore("auth", {
129 return false
130 }
131
127 - const arrRoles: UserRole[] = _castArray(roles)
132 + const arrRoles: RouteMetaAuthRole[] = _castArray(roles)
133
129 - if (arrRoles.includes(UserRole.All)) {
134 + if (arrRoles.includes(RouteRole.All)) {
135 return true
136 }
137
frontend/src/stores/theme.ts
+2
@@ -167,6 +167,7 @@ export const useThemeStore = defineStore("theme", {
167 error,
168 info,
169 background,
170 + backgroundSecondary,
171 bodyBackground,
172 text,
173 textSecondary,
@@ -203,6 +204,7 @@ export const useThemeStore = defineStore("theme", {
204 },
205 Card: {
206 color: background,
207 + colorEmbedded: backgroundSecondary,
208 titleFontSizeSmall: state.fontSize.cardTitle,
209 titleFontSizeMedium: state.fontSize.cardTitle,
210 titleFontSizeLarge: state.fontSize.cardTitle,
frontend/src/theme/index.ts
+2
@@ -80,6 +80,7 @@ export function getCssVars(state: ThemeState, getters: ThemeGetters): { [key: st
80
81 const tabFgColorActive = naive.textColor2
82 const borderColor = naive.dividerColor
83 + const hoverColor = naive.hoverColor
84 const primaryColor = naive.primaryColor
85
86 const successColor = naive.successColor
@@ -209,6 +210,7 @@ export function getCssVars(state: ThemeState, getters: ThemeGetters): { [key: st
210 "bg-secondary-color": `${bgSecondaryColor}`,
211
212 "border-color": `${borderColor}`,
213 + "hover-color": `${hoverColor}`,
214 "bezier-ease": `${bezierEase}`,
215 "router-transition-duration": `${routerTransitionDuration}s`,
216 "sidebar-anim-ease": `${sidebarAnimEase}`,
frontend/src/types/auth.d.ts
+26 -21
@@ -2,7 +2,32 @@ export interface RouteMetaAuth {
2 checkAuth?: boolean
3 authRedirect?: string
4 auth?: boolean
5 - roles?: UserRole | UserRole[]
5 + roles?: RouteMetaAuthRole | RouteMetaAuthRole[]
6 +}
7 +
8 +export enum RouteRole {
9 + All = "all"
10 +}
11 +
12 +export enum AuthUserRole {
13 + Unknown = 0,
14 + Admin = 1,
15 + Analyst = 2
16 +}
17 +
18 +export type RouteMetaAuthRole = AuthUserRole | RouteRole
19 +
20 +export interface JWTPayload extends jose.JWTPayload {
21 + scopes: JWTRole[]
22 +}
23 +
24 +export type JWTRole = "admin" | "analyst"
25 +
26 +export interface AuthUser {
27 + access_token: string
28 + role: AuthUserRole
29 + username: string
30 + email: string
31 }
32
33 export interface LoginPayload {
@@ -24,23 +49,3 @@ export interface RegisterPayload {
49 notifications: number
50 */
51 }
27 -
28 -export enum UserRole {
29 - All = "all",
30 - Unknown = 0,
31 - Admin = 1,
32 - Analyst = 2
33 -}
34 -
35 -export interface User {
36 - access_token: string
37 - role: UserRole
38 - username: string
39 - email: string
40 -}
41 -
42 -export interface AuthUser {
43 - id: number
44 - username: string
45 - email: string
46 -}
frontend/src/types/user.d.ts new
+5
@@ -0,0 +1,5 @@
1 +export interface User {
2 + id: number
3 + username: string
4 + email: string
5 +}
frontend/src/utils/auth.ts
+4 -4
@@ -1,6 +1,6 @@
1 import type { RouteLocationNormalized } from "vue-router"
2 import { useAuthStore } from "@/stores/auth"
3 -import { type RouteMetaAuth, UserRole } from "@/types/auth.d"
3 +import { AuthUserRole, type JWTRole, type RouteMetaAuth } from "@/types/auth.d"
4 import { decodeJwt } from "jose"
5 import _castArray from "lodash/castArray"
6 import _toNumber from "lodash/toNumber"
@@ -46,7 +46,7 @@ export function authCheck(route: RouteLocationNormalized) {
46 }
47 }
48
49 -export function scopeToRole(scope: string | string[]): UserRole {
50 - const role = _castArray(scope)[0]?.toLowerCase()
51 - return role === "admin" ? UserRole.Admin : role === "analyst" ? UserRole.Analyst : UserRole.Unknown
49 +export function jwtRoleToUserRole(scope: JWTRole | JWTRole[]): AuthUserRole {
50 + const role = _castArray(scope)[0]?.toLowerCase() as JWTRole
51 + return role === "admin" ? AuthUserRole.Admin : role === "analyst" ? AuthUserRole.Analyst : AuthUserRole.Unknown
52 }
frontend/src/views/Auth.vue renamed
+54 -2
@@ -48,13 +48,30 @@ onBeforeMount(() => {
48 </script>
49
50 <style lang="scss" scoped>
51 -@import "./main.scss";
52 -
51 .page-auth {
52 + min-height: 100svh;
53 +
54 .wrapper {
55 + min-height: 100svh;
56 +
57 .image-box {
58 + position: relative;
59 background-color: v-bind(activeColor);
60
61 + /*
62 + &::after {
63 + content: "";
64 + width: 100%;
65 + height: 100%;
66 + position: absolute;
67 + top: 0;
68 + left: 0;
69 + background-image: url(@/assets/images/pattern-onboard.png);
70 + background-size: 500px;
71 + background-position: center center;
72 + }
73 + */
74 +
75 video {
76 position: absolute;
77 top: 0;
@@ -65,6 +82,41 @@ onBeforeMount(() => {
82 object-position: center;
83 }
84 }
85 +
86 + .form-box {
87 + padding: 50px;
88 +
89 + &.centered {
90 + flex-basis: 100%;
91 + .form-wrap {
92 + padding: 60px;
93 + width: 100%;
94 + max-width: 500px;
95 + background-color: var(--bg-color);
96 + border-radius: 20px;
97 + @apply shadow-xl;
98 + }
99 +
100 + @media (max-width: 600px) {
101 + padding: 4%;
102 + .form-wrap {
103 + padding: 8%;
104 + }
105 + }
106 + }
107 + }
108 + }
109 +
110 + @media (max-width: 800px) {
111 + .wrapper {
112 + .image-box {
113 + display: none;
114 + }
115 +
116 + .form-box {
117 + flex-basis: 100%;
118 + }
119 + }
120 }
121 }
122 </style>
frontend/src/views/auth/main.scss deleted
-59
@@ -1,59 +0,0 @@
1 -.page-auth {
2 - min-height: 100vh;
3 -
4 - .wrapper {
5 - min-height: 100vh;
6 -
7 - .image-box {
8 - position: relative;
9 -
10 - /*
11 - &::after {
12 - content: "";
13 - width: 100%;
14 - height: 100%;
15 - position: absolute;
16 - top: 0;
17 - left: 0;
18 - background-image: url(@/assets/images/pattern-onboard.png);
19 - background-size: 500px;
20 - background-position: center center;
21 - }
22 - */
23 - }
24 -
25 - .form-box {
26 - padding: 50px;
27 -
28 - &.centered {
29 - flex-basis: 100%;
30 - .form-wrap {
31 - padding: 60px;
32 - width: 100%;
33 - max-width: 500px;
34 - background-color: var(--bg-color);
35 - border-radius: 20px;
36 - @apply shadow-xl;
37 - }
38 -
39 - @media (max-width: 600px) {
40 - padding: 4%;
41 - .form-wrap {
42 - padding: 8%;
43 - }
44 - }
45 - }
46 - }
47 - }
48 - @media (max-width: 800px) {
49 - .wrapper {
50 - .image-box {
51 - display: none;
52 - }
53 -
54 - .form-box {
55 - flex-basis: 100%;
56 - }
57 - }
58 - }
59 -}