apache-airflow-providers-edge3 1.2.0__py3-none-any.whl → 1.3.0rc1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. airflow/providers/edge3/__init__.py +1 -1
  2. airflow/providers/edge3/cli/edge_command.py +43 -0
  3. airflow/providers/edge3/cli/worker.py +40 -40
  4. airflow/providers/edge3/models/edge_worker.py +13 -8
  5. airflow/providers/edge3/openapi/v2-edge-generated.yaml +249 -0
  6. airflow/providers/edge3/plugins/www/dist/main.umd.cjs +53 -19
  7. airflow/providers/edge3/plugins/www/openapi-gen/queries/common.ts +7 -0
  8. airflow/providers/edge3/plugins/www/openapi-gen/queries/queries.ts +44 -1
  9. airflow/providers/edge3/plugins/www/openapi-gen/requests/schemas.gen.ts +14 -0
  10. airflow/providers/edge3/plugins/www/openapi-gen/requests/services.gen.ts +158 -1
  11. airflow/providers/edge3/plugins/www/openapi-gen/requests/types.gen.ts +155 -0
  12. airflow/providers/edge3/plugins/www/package.json +14 -10
  13. airflow/providers/edge3/plugins/www/pnpm-lock.yaml +601 -457
  14. airflow/providers/edge3/plugins/www/src/components/AddQueueButton.tsx +138 -0
  15. airflow/providers/edge3/plugins/www/src/components/MaintenanceEditCommentButton.tsx +106 -0
  16. airflow/providers/edge3/plugins/www/src/components/MaintenanceEnterButton.tsx +102 -0
  17. airflow/providers/edge3/plugins/www/src/components/MaintenanceExitButton.tsx +92 -0
  18. airflow/providers/edge3/plugins/www/src/components/RemoveQueueButton.tsx +151 -0
  19. airflow/providers/edge3/plugins/www/src/components/WorkerDeleteButton.tsx +104 -0
  20. airflow/providers/edge3/plugins/www/src/components/WorkerOperations.tsx +85 -0
  21. airflow/providers/edge3/plugins/www/src/components/WorkerShutdownButton.tsx +104 -0
  22. airflow/providers/edge3/plugins/www/src/components/WorkerStateBadge.tsx +33 -0
  23. airflow/providers/edge3/plugins/www/src/components/ui/ScrollToAnchor.tsx +49 -0
  24. airflow/providers/edge3/plugins/www/src/components/ui/createToaster.ts +24 -0
  25. airflow/providers/edge3/plugins/www/src/components/ui/index.ts +2 -0
  26. airflow/providers/edge3/plugins/www/src/context/colorMode/ColorModeProvider.tsx +1 -2
  27. airflow/providers/edge3/plugins/www/src/context/colorMode/useColorMode.tsx +2 -5
  28. airflow/providers/edge3/plugins/www/src/pages/JobsPage.tsx +52 -15
  29. airflow/providers/edge3/plugins/www/src/pages/WorkerPage.tsx +52 -22
  30. airflow/providers/edge3/plugins/www/src/theme.ts +378 -130
  31. airflow/providers/edge3/plugins/www/vite.config.ts +2 -0
  32. airflow/providers/edge3/worker_api/datamodels_ui.py +12 -0
  33. airflow/providers/edge3/worker_api/routes/ui.py +193 -3
  34. {apache_airflow_providers_edge3-1.2.0.dist-info → apache_airflow_providers_edge3-1.3.0rc1.dist-info}/METADATA +7 -7
  35. {apache_airflow_providers_edge3-1.2.0.dist-info → apache_airflow_providers_edge3-1.3.0rc1.dist-info}/RECORD +37 -27
  36. {apache_airflow_providers_edge3-1.2.0.dist-info → apache_airflow_providers_edge3-1.3.0rc1.dist-info}/WHEEL +0 -0
  37. {apache_airflow_providers_edge3-1.2.0.dist-info → apache_airflow_providers_edge3-1.3.0rc1.dist-info}/entry_points.txt +0 -0
@@ -28,6 +28,13 @@ export const UseUiServiceJobsKeyFn = (queryKey?: Array<unknown>) => [useUiServic
28
28
  export type JobsServiceFetchMutationResult = Awaited<ReturnType<typeof JobsService.fetch>>;
29
29
  export type LogsServicePushLogsMutationResult = Awaited<ReturnType<typeof LogsService.pushLogs>>;
30
30
  export type WorkerServiceRegisterMutationResult = Awaited<ReturnType<typeof WorkerService.register>>;
31
+ export type UiServiceRequestWorkerMaintenanceMutationResult = Awaited<ReturnType<typeof UiService.requestWorkerMaintenance>>;
32
+ export type UiServiceRequestWorkerShutdownMutationResult = Awaited<ReturnType<typeof UiService.requestWorkerShutdown>>;
33
+ export type UiServiceAddWorkerQueueMutationResult = Awaited<ReturnType<typeof UiService.addWorkerQueue>>;
31
34
  export type JobsServiceStateMutationResult = Awaited<ReturnType<typeof JobsService.state>>;
32
35
  export type WorkerServiceSetStateMutationResult = Awaited<ReturnType<typeof WorkerService.setState>>;
33
36
  export type WorkerServiceUpdateQueuesMutationResult = Awaited<ReturnType<typeof WorkerService.updateQueues>>;
37
+ export type UiServiceUpdateWorkerMaintenanceMutationResult = Awaited<ReturnType<typeof UiService.updateWorkerMaintenance>>;
38
+ export type UiServiceExitWorkerMaintenanceMutationResult = Awaited<ReturnType<typeof UiService.exitWorkerMaintenance>>;
39
+ export type UiServiceDeleteWorkerMutationResult = Awaited<ReturnType<typeof UiService.deleteWorker>>;
40
+ export type UiServiceRemoveWorkerQueueMutationResult = Awaited<ReturnType<typeof UiService.removeWorkerQueue>>;
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { UseMutationOptions, UseQueryOptions, useMutation, useQuery } from "@tanstack/react-query";
4
4
  import { JobsService, LogsService, MonitorService, UiService, WorkerService } from "../requests/services.gen";
5
- import { PushLogsBody, TaskInstanceState, WorkerQueueUpdateBody, WorkerQueuesBody, WorkerStateBody } from "../requests/types.gen";
5
+ import { MaintenanceRequest, PushLogsBody, TaskInstanceState, WorkerQueueUpdateBody, WorkerQueuesBody, WorkerStateBody } from "../requests/types.gen";
6
6
  import * as Common from "./common";
7
7
  export const useLogsServiceLogfilePath = <TData = Common.LogsServiceLogfilePathDefaultResponse, TError = unknown, TQueryKey extends Array<unknown> = unknown[]>({ authorization, dagId, mapIndex, runId, taskId, tryNumber }: {
8
8
  authorization: string;
@@ -50,6 +50,25 @@ export const useWorkerServiceRegister = <TData = Common.WorkerServiceRegisterMut
50
50
  requestBody: WorkerStateBody;
51
51
  workerName: string;
52
52
  }, TContext>({ mutationFn: ({ authorization, requestBody, workerName }) => WorkerService.register({ authorization, requestBody, workerName }) as unknown as Promise<TData>, ...options });
53
+ export const useUiServiceRequestWorkerMaintenance = <TData = Common.UiServiceRequestWorkerMaintenanceMutationResult, TError = unknown, TContext = unknown>(options?: Omit<UseMutationOptions<TData, TError, {
54
+ requestBody: MaintenanceRequest;
55
+ workerName: string;
56
+ }, TContext>, "mutationFn">) => useMutation<TData, TError, {
57
+ requestBody: MaintenanceRequest;
58
+ workerName: string;
59
+ }, TContext>({ mutationFn: ({ requestBody, workerName }) => UiService.requestWorkerMaintenance({ requestBody, workerName }) as unknown as Promise<TData>, ...options });
60
+ export const useUiServiceRequestWorkerShutdown = <TData = Common.UiServiceRequestWorkerShutdownMutationResult, TError = unknown, TContext = unknown>(options?: Omit<UseMutationOptions<TData, TError, {
61
+ workerName: string;
62
+ }, TContext>, "mutationFn">) => useMutation<TData, TError, {
63
+ workerName: string;
64
+ }, TContext>({ mutationFn: ({ workerName }) => UiService.requestWorkerShutdown({ workerName }) as unknown as Promise<TData>, ...options });
65
+ export const useUiServiceAddWorkerQueue = <TData = Common.UiServiceAddWorkerQueueMutationResult, TError = unknown, TContext = unknown>(options?: Omit<UseMutationOptions<TData, TError, {
66
+ queueName: string;
67
+ workerName: string;
68
+ }, TContext>, "mutationFn">) => useMutation<TData, TError, {
69
+ queueName: string;
70
+ workerName: string;
71
+ }, TContext>({ mutationFn: ({ queueName, workerName }) => UiService.addWorkerQueue({ queueName, workerName }) as unknown as Promise<TData>, ...options });
53
72
  export const useJobsServiceState = <TData = Common.JobsServiceStateMutationResult, TError = unknown, TContext = unknown>(options?: Omit<UseMutationOptions<TData, TError, {
54
73
  authorization: string;
55
74
  dagId: string;
@@ -85,3 +104,27 @@ export const useWorkerServiceUpdateQueues = <TData = Common.WorkerServiceUpdateQ
85
104
  requestBody: WorkerQueueUpdateBody;
86
105
  workerName: string;
87
106
  }, TContext>({ mutationFn: ({ authorization, requestBody, workerName }) => WorkerService.updateQueues({ authorization, requestBody, workerName }) as unknown as Promise<TData>, ...options });
107
+ export const useUiServiceUpdateWorkerMaintenance = <TData = Common.UiServiceUpdateWorkerMaintenanceMutationResult, TError = unknown, TContext = unknown>(options?: Omit<UseMutationOptions<TData, TError, {
108
+ requestBody: MaintenanceRequest;
109
+ workerName: string;
110
+ }, TContext>, "mutationFn">) => useMutation<TData, TError, {
111
+ requestBody: MaintenanceRequest;
112
+ workerName: string;
113
+ }, TContext>({ mutationFn: ({ requestBody, workerName }) => UiService.updateWorkerMaintenance({ requestBody, workerName }) as unknown as Promise<TData>, ...options });
114
+ export const useUiServiceExitWorkerMaintenance = <TData = Common.UiServiceExitWorkerMaintenanceMutationResult, TError = unknown, TContext = unknown>(options?: Omit<UseMutationOptions<TData, TError, {
115
+ workerName: string;
116
+ }, TContext>, "mutationFn">) => useMutation<TData, TError, {
117
+ workerName: string;
118
+ }, TContext>({ mutationFn: ({ workerName }) => UiService.exitWorkerMaintenance({ workerName }) as unknown as Promise<TData>, ...options });
119
+ export const useUiServiceDeleteWorker = <TData = Common.UiServiceDeleteWorkerMutationResult, TError = unknown, TContext = unknown>(options?: Omit<UseMutationOptions<TData, TError, {
120
+ workerName: string;
121
+ }, TContext>, "mutationFn">) => useMutation<TData, TError, {
122
+ workerName: string;
123
+ }, TContext>({ mutationFn: ({ workerName }) => UiService.deleteWorker({ workerName }) as unknown as Promise<TData>, ...options });
124
+ export const useUiServiceRemoveWorkerQueue = <TData = Common.UiServiceRemoveWorkerQueueMutationResult, TError = unknown, TContext = unknown>(options?: Omit<UseMutationOptions<TData, TError, {
125
+ queueName: string;
126
+ workerName: string;
127
+ }, TContext>, "mutationFn">) => useMutation<TData, TError, {
128
+ queueName: string;
129
+ workerName: string;
130
+ }, TContext>({ mutationFn: ({ queueName, workerName }) => UiService.removeWorkerQueue({ queueName, workerName }) as unknown as Promise<TData>, ...options });
@@ -252,6 +252,20 @@ export const $JobCollectionResponse = {
252
252
  description: 'Job Collection serializer.'
253
253
  } as const;
254
254
 
255
+ export const $MaintenanceRequest = {
256
+ properties: {
257
+ maintenance_comment: {
258
+ type: 'string',
259
+ title: 'Maintenance Comment',
260
+ description: 'Comment describing the maintenance reason.'
261
+ }
262
+ },
263
+ type: 'object',
264
+ required: ['maintenance_comment'],
265
+ title: 'MaintenanceRequest',
266
+ description: 'Request body for maintenance operations.'
267
+ } as const;
268
+
255
269
  export const $PushLogsBody = {
256
270
  properties: {
257
271
  log_chunk_time: {
@@ -3,7 +3,7 @@
3
3
  import type { CancelablePromise } from './core/CancelablePromise';
4
4
  import { OpenAPI } from './core/OpenAPI';
5
5
  import { request as __request } from './core/request';
6
- import type { FetchData, FetchResponse, StateData, StateResponse, LogfilePathData, LogfilePathResponse, PushLogsData, PushLogsResponse, RegisterData, RegisterResponse, SetStateData, SetStateResponse, UpdateQueuesData, UpdateQueuesResponse, HealthResponse, WorkerResponse, JobsResponse } from './types.gen';
6
+ import type { FetchData, FetchResponse, StateData, StateResponse, LogfilePathData, LogfilePathResponse, PushLogsData, PushLogsResponse, RegisterData, RegisterResponse, SetStateData, SetStateResponse, UpdateQueuesData, UpdateQueuesResponse, HealthResponse, WorkerResponse, JobsResponse, RequestWorkerMaintenanceData, RequestWorkerMaintenanceResponse, UpdateWorkerMaintenanceData, UpdateWorkerMaintenanceResponse, ExitWorkerMaintenanceData, ExitWorkerMaintenanceResponse, RequestWorkerShutdownData, RequestWorkerShutdownResponse, DeleteWorkerData, DeleteWorkerResponse, AddWorkerQueueData, AddWorkerQueueResponse, RemoveWorkerQueueData, RemoveWorkerQueueResponse } from './types.gen';
7
7
 
8
8
  export class JobsService {
9
9
  /**
@@ -286,4 +286,161 @@ export class UiService {
286
286
  });
287
287
  }
288
288
 
289
+ /**
290
+ * Request Worker Maintenance
291
+ * Put a worker into maintenance mode.
292
+ * @param data The data for the request.
293
+ * @param data.workerName
294
+ * @param data.requestBody
295
+ * @returns null Successful Response
296
+ * @throws ApiError
297
+ */
298
+ public static requestWorkerMaintenance(data: RequestWorkerMaintenanceData): CancelablePromise<RequestWorkerMaintenanceResponse> {
299
+ return __request(OpenAPI, {
300
+ method: 'POST',
301
+ url: '/edge_worker/ui/worker/{worker_name}/maintenance',
302
+ path: {
303
+ worker_name: data.workerName
304
+ },
305
+ body: data.requestBody,
306
+ mediaType: 'application/json',
307
+ errors: {
308
+ 422: 'Validation Error'
309
+ }
310
+ });
311
+ }
312
+
313
+ /**
314
+ * Update Worker Maintenance
315
+ * Update maintenance comments for a worker.
316
+ * @param data The data for the request.
317
+ * @param data.workerName
318
+ * @param data.requestBody
319
+ * @returns null Successful Response
320
+ * @throws ApiError
321
+ */
322
+ public static updateWorkerMaintenance(data: UpdateWorkerMaintenanceData): CancelablePromise<UpdateWorkerMaintenanceResponse> {
323
+ return __request(OpenAPI, {
324
+ method: 'PATCH',
325
+ url: '/edge_worker/ui/worker/{worker_name}/maintenance',
326
+ path: {
327
+ worker_name: data.workerName
328
+ },
329
+ body: data.requestBody,
330
+ mediaType: 'application/json',
331
+ errors: {
332
+ 422: 'Validation Error'
333
+ }
334
+ });
335
+ }
336
+
337
+ /**
338
+ * Exit Worker Maintenance
339
+ * Exit a worker from maintenance mode.
340
+ * @param data The data for the request.
341
+ * @param data.workerName
342
+ * @returns null Successful Response
343
+ * @throws ApiError
344
+ */
345
+ public static exitWorkerMaintenance(data: ExitWorkerMaintenanceData): CancelablePromise<ExitWorkerMaintenanceResponse> {
346
+ return __request(OpenAPI, {
347
+ method: 'DELETE',
348
+ url: '/edge_worker/ui/worker/{worker_name}/maintenance',
349
+ path: {
350
+ worker_name: data.workerName
351
+ },
352
+ errors: {
353
+ 422: 'Validation Error'
354
+ }
355
+ });
356
+ }
357
+
358
+ /**
359
+ * Request Worker Shutdown
360
+ * Request shutdown of a worker.
361
+ * @param data The data for the request.
362
+ * @param data.workerName
363
+ * @returns null Successful Response
364
+ * @throws ApiError
365
+ */
366
+ public static requestWorkerShutdown(data: RequestWorkerShutdownData): CancelablePromise<RequestWorkerShutdownResponse> {
367
+ return __request(OpenAPI, {
368
+ method: 'POST',
369
+ url: '/edge_worker/ui/worker/{worker_name}/shutdown',
370
+ path: {
371
+ worker_name: data.workerName
372
+ },
373
+ errors: {
374
+ 422: 'Validation Error'
375
+ }
376
+ });
377
+ }
378
+
379
+ /**
380
+ * Delete Worker
381
+ * Delete a worker record from the system.
382
+ * @param data The data for the request.
383
+ * @param data.workerName
384
+ * @returns null Successful Response
385
+ * @throws ApiError
386
+ */
387
+ public static deleteWorker(data: DeleteWorkerData): CancelablePromise<DeleteWorkerResponse> {
388
+ return __request(OpenAPI, {
389
+ method: 'DELETE',
390
+ url: '/edge_worker/ui/worker/{worker_name}',
391
+ path: {
392
+ worker_name: data.workerName
393
+ },
394
+ errors: {
395
+ 422: 'Validation Error'
396
+ }
397
+ });
398
+ }
399
+
400
+ /**
401
+ * Add Worker Queue
402
+ * Add a queue to a worker.
403
+ * @param data The data for the request.
404
+ * @param data.workerName
405
+ * @param data.queueName
406
+ * @returns null Successful Response
407
+ * @throws ApiError
408
+ */
409
+ public static addWorkerQueue(data: AddWorkerQueueData): CancelablePromise<AddWorkerQueueResponse> {
410
+ return __request(OpenAPI, {
411
+ method: 'PUT',
412
+ url: '/edge_worker/ui/worker/{worker_name}/queues/{queue_name}',
413
+ path: {
414
+ worker_name: data.workerName,
415
+ queue_name: data.queueName
416
+ },
417
+ errors: {
418
+ 422: 'Validation Error'
419
+ }
420
+ });
421
+ }
422
+
423
+ /**
424
+ * Remove Worker Queue
425
+ * Remove a queue from a worker.
426
+ * @param data The data for the request.
427
+ * @param data.workerName
428
+ * @param data.queueName
429
+ * @returns null Successful Response
430
+ * @throws ApiError
431
+ */
432
+ public static removeWorkerQueue(data: RemoveWorkerQueueData): CancelablePromise<RemoveWorkerQueueResponse> {
433
+ return __request(OpenAPI, {
434
+ method: 'DELETE',
435
+ url: '/edge_worker/ui/worker/{worker_name}/queues/{queue_name}',
436
+ path: {
437
+ worker_name: data.workerName,
438
+ queue_name: data.queueName
439
+ },
440
+ errors: {
441
+ 422: 'Validation Error'
442
+ }
443
+ });
444
+ }
445
+
289
446
  }
@@ -126,6 +126,16 @@ export type JobCollectionResponse = {
126
126
  total_entries: number;
127
127
  };
128
128
 
129
+ /**
130
+ * Request body for maintenance operations.
131
+ */
132
+ export type MaintenanceRequest = {
133
+ /**
134
+ * Comment describing the maintenance reason.
135
+ */
136
+ maintenance_comment: string;
137
+ };
138
+
129
139
  /**
130
140
  * Incremental new log content from worker.
131
141
  */
@@ -460,6 +470,52 @@ export type WorkerResponse = WorkerCollectionResponse;
460
470
 
461
471
  export type JobsResponse = JobCollectionResponse;
462
472
 
473
+ export type RequestWorkerMaintenanceData = {
474
+ requestBody: MaintenanceRequest;
475
+ workerName: string;
476
+ };
477
+
478
+ export type RequestWorkerMaintenanceResponse = null;
479
+
480
+ export type UpdateWorkerMaintenanceData = {
481
+ requestBody: MaintenanceRequest;
482
+ workerName: string;
483
+ };
484
+
485
+ export type UpdateWorkerMaintenanceResponse = null;
486
+
487
+ export type ExitWorkerMaintenanceData = {
488
+ workerName: string;
489
+ };
490
+
491
+ export type ExitWorkerMaintenanceResponse = null;
492
+
493
+ export type RequestWorkerShutdownData = {
494
+ workerName: string;
495
+ };
496
+
497
+ export type RequestWorkerShutdownResponse = null;
498
+
499
+ export type DeleteWorkerData = {
500
+ workerName: string;
501
+ };
502
+
503
+ export type DeleteWorkerResponse = null;
504
+
505
+ export type AddWorkerQueueData = {
506
+ queueName: string;
507
+ workerName: string;
508
+ };
509
+
510
+ export type AddWorkerQueueResponse = null;
511
+
512
+ export type RemoveWorkerQueueData = {
513
+ queueName: string;
514
+ workerName: string;
515
+ };
516
+
517
+ export type RemoveWorkerQueueResponse = null;
518
+
463
519
  export type $OpenApiTs = {
464
520
  '/edge_worker/v1/jobs/fetch/{worker_name}': {
465
521
  post: {
@@ -652,4 +708,103 @@ export type $OpenApiTs = {
652
708
  };
653
709
  };
654
710
  };
711
+ '/edge_worker/ui/worker/{worker_name}/maintenance': {
712
+ post: {
713
+ req: RequestWorkerMaintenanceData;
714
+ res: {
715
+ /**
716
+ * Successful Response
717
+ */
718
+ 200: null;
719
+ /**
720
+ * Validation Error
721
+ */
722
+ 422: HTTPValidationError;
723
+ };
724
+ };
725
+ patch: {
726
+ req: UpdateWorkerMaintenanceData;
727
+ res: {
728
+ /**
729
+ * Successful Response
730
+ */
731
+ 200: null;
732
+ /**
733
+ * Validation Error
734
+ */
735
+ 422: HTTPValidationError;
736
+ };
737
+ };
738
+ delete: {
739
+ req: ExitWorkerMaintenanceData;
740
+ res: {
741
+ /**
742
+ * Successful Response
743
+ */
744
+ 200: null;
745
+ /**
746
+ * Validation Error
747
+ */
748
+ 422: HTTPValidationError;
749
+ };
750
+ };
751
+ };
752
+ '/edge_worker/ui/worker/{worker_name}/shutdown': {
753
+ post: {
754
+ req: RequestWorkerShutdownData;
755
+ res: {
756
+ /**
757
+ * Successful Response
758
+ */
759
+ 200: null;
760
+ /**
761
+ * Validation Error
762
+ */
763
+ 422: HTTPValidationError;
764
+ };
765
+ };
766
+ };
767
+ '/edge_worker/ui/worker/{worker_name}': {
768
+ delete: {
769
+ req: DeleteWorkerData;
770
+ res: {
771
+ /**
772
+ * Successful Response
773
+ */
774
+ 200: null;
775
+ /**
776
+ * Validation Error
777
+ */
778
+ 422: HTTPValidationError;
779
+ };
780
+ };
781
+ };
782
+ '/edge_worker/ui/worker/{worker_name}/queues/{queue_name}': {
783
+ put: {
784
+ req: AddWorkerQueueData;
785
+ res: {
786
+ /**
787
+ * Successful Response
788
+ */
789
+ 200: null;
790
+ /**
791
+ * Validation Error
792
+ */
793
+ 422: HTTPValidationError;
794
+ };
795
+ };
796
+ delete: {
797
+ req: RemoveWorkerQueueData;
798
+ res: {
799
+ /**
800
+ * Successful Response
801
+ */
802
+ 200: null;
803
+ /**
804
+ * Validation Error
805
+ */
806
+ 422: HTTPValidationError;
807
+ };
808
+ };
809
+ };
655
810
  };
@@ -2,6 +2,9 @@
2
2
  "name": "edge",
3
3
  "private": true,
4
4
  "version": "0.0.0",
5
+ "engines": {
6
+ "node": ">=22"
7
+ },
5
8
  "type": "module",
6
9
  "main": "./dist/main.js",
7
10
  "module": "./dist/main.js",
@@ -32,12 +35,13 @@
32
35
  "@chakra-ui/react": "^3.20.0",
33
36
  "@emotion/react": "^11.14.0",
34
37
  "@tanstack/react-query": "^5.75.1",
35
- "axios": "^1.11.0",
36
- "next-themes": "^0.3.0",
37
- "react": "^18.3.1",
38
- "react-dom": "^18.3.1",
38
+ "axios": "^1.12.0",
39
+ "next-themes": "^0.4.6",
40
+ "react": "^19.1.1",
41
+ "react-dom": "^19.1.1",
39
42
  "react-icons": "^5.5.0",
40
- "react-router-dom": "^6.30.0"
43
+ "react-router-dom": "^6.30.0",
44
+ "react-timeago": "^8.3.0"
41
45
  },
42
46
  "devDependencies": {
43
47
  "@7nohe/openapi-react-query-codegen": "^1.6.2",
@@ -50,15 +54,15 @@
50
54
  "@types/node": "^22.15.3",
51
55
  "@types/react": "^18.3.19",
52
56
  "@types/react-dom": "^18.3.5",
53
- "@vitejs/plugin-react-swc": "^3.9.0",
54
- "@vitest/coverage-v8": "^2.1.9",
57
+ "@vitejs/plugin-react-swc": "^4.0.1",
58
+ "@vitest/coverage-v8": "^3.2.4",
55
59
  "eslint": "^9.25.1",
56
60
  "eslint-config-prettier": "^10.1.2",
57
61
  "eslint-plugin-jsx-a11y": "^6.10.2",
58
62
  "eslint-plugin-perfectionist": "^4.12.3",
59
63
  "eslint-plugin-prettier": "^5.2.6",
60
64
  "eslint-plugin-react": "^7.37.5",
61
- "eslint-plugin-react-hooks": "^4.6.2",
65
+ "eslint-plugin-react-hooks": "^5.2.0",
62
66
  "eslint-plugin-react-refresh": "^0.4.20",
63
67
  "eslint-plugin-unicorn": "^55.0.0",
64
68
  "globals": "^15.15.0",
@@ -66,10 +70,10 @@
66
70
  "prettier": "^3.5.3",
67
71
  "typescript": "~5.8.3",
68
72
  "typescript-eslint": "^8.31.1",
69
- "vite": "^5.4.19",
73
+ "vite": "^7.1.5",
70
74
  "vite-plugin-css-injected-by-js": "^3.5.2",
71
75
  "vite-plugin-dts": "^4.5.4",
72
- "vitest": "^2.1.9"
76
+ "vitest": "^3.2.4"
73
77
  },
74
78
  "pnpm": {
75
79
  "onlyBuiltDependencies": [