From 2b77ebe2f55ba927ec5a1d4b942e725bcb13a5dc Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Thu, 19 Feb 2026 15:00:23 +0700 Subject: [PATCH 01/59] Removed unused imports --- src/main.tsx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main.tsx b/src/main.tsx index 3a82947..e1e5e3c 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,10 +1,7 @@ import ReactDOM from 'react-dom/client'; -import React from 'react'; import './i18next/i18n'; import './index.css'; import { getConsoleSink, configure } from '@logtape/logtape'; -import { getPrettyFormatter } from "@logtape/pretty"; - import { BrowserRouter, Routes, Route } from 'react-router-dom'; import { ScreenModeProvider } from './components/ScreenModeContext/ScreenModeContext'; import SimulationManager from './components/SimulationManager/SimulationManager'; @@ -14,7 +11,6 @@ import WebSocketManager from './components/WebSocketManager/WebSocketManager'; import StreamPlayerScreenControl from './components/StreamPlayerScreen/StreamPlayerScreenControl'; import StreamPlayerScreen from './components/StreamPlayerScreen/StreamPlayerScreen'; import StreamFullscreen from './components/StreamPlayerScreen/StreamFullscreen'; -import Test from './components/TestPage/Test'; await configure({ sinks: { @@ -46,7 +42,6 @@ const App = () => { } /> } /> }> - }> From 8a3f0a7bcc9455180d29ad70c0bdf2eb9611ecf1 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Thu, 19 Feb 2026 18:55:06 +0700 Subject: [PATCH 02/59] commented unused feature that would allow to change the display type to accomodate for some space for a gama simulation --- .../SimulationManager/SimulationManager.tsx | 17 ++-- .../StreamPlayerScreen/StreamPlayerScreen.tsx | 82 ++++++++++--------- 2 files changed, 54 insertions(+), 45 deletions(-) diff --git a/src/components/SimulationManager/SimulationManager.tsx b/src/components/SimulationManager/SimulationManager.tsx index cf8423e..2b06a73 100644 --- a/src/components/SimulationManager/SimulationManager.tsx +++ b/src/components/SimulationManager/SimulationManager.tsx @@ -28,11 +28,18 @@ const SimulationManager = () => { const { t } = useTranslation(); const [screenModeDisplay, setScreenModeDisplay] = useState("gama_screen"); const [startButtonClicked, setStartButtonClicked] = useState(false); - const channel = new BroadcastChannel('simulation-to-stream'); //using the broadcast api to update display type in the streamPlayerScreen - const updateDisplay = (screenModeDisplay: string) => { - setScreenModeDisplay(screenModeDisplay); - channel.postMessage({ screenModeDisplay }); - }; + + //? these variables exist as a setup for the functionnality of changing the display type + //? to accomodate for the display of the gama simulation directly in the application. + //? This uses a websocket to be able to click on a button on the tablet, + //? and have the change reflected on the tv screen instantly without reloading the page + + // const [screenModeDisplay, setScreenModeDisplay] = useState("gama_screen"); + // const channel = new BroadcastChannel('simulation-to-stream'); //using the broadcast api to update display type in the streamPlayerScreen + // const updateDisplay = (screenModeDisplay: string) => { + // setScreenModeDisplay(screenModeDisplay); + // channel.postMessage({ screenModeDisplay }); + // }; const startClicked = () => { setStartButtonClicked(true); diff --git a/src/components/StreamPlayerScreen/StreamPlayerScreen.tsx b/src/components/StreamPlayerScreen/StreamPlayerScreen.tsx index 5dcda90..6b8611b 100644 --- a/src/components/StreamPlayerScreen/StreamPlayerScreen.tsx +++ b/src/components/StreamPlayerScreen/StreamPlayerScreen.tsx @@ -5,52 +5,54 @@ import { getLogger, getConsoleSink, configure } from "@logtape/logtape"; const StreamPlayerScreen = () => { const [screenModeDisplay, setScreenModeDisplay] = useState("gama_screen"); // Get the screen mode display from the context const videoContainerRef = useRef(null); // Add ref for the target div - const [ws, setWs] = useState(null); - const [isWsConnected, setIsWsConnected] = useState(false); + // const [ws, setWs] = useState(null); unused variable defining a websocket that is meant to control the display type + // const [isWsConnected, setIsWsConnected] = useState(false); of this component, to accomodate a GAMA display inside the app const host = window.location.hostname; const port = process.env.MONITOR_WS_PORT || '8001'; const socket = new WebSocket(`ws://${host}:${port}`); const logger = getLogger(["components", "StreamPlayerScreen"]); - - useEffect(() => { - - setWs(socket); - socket.onopen = () => { - logger.info('WebSocket connected to backend'); - setIsWsConnected(true); - }; - - socket.onmessage = (event: MessageEvent) => { - let data = JSON.parse(event.data); - if (typeof data == "string") { - try { - data = JSON.parse(data); - } catch (e) { - logger.error("Can't JSON parse this received string", { data }); - } - } - - if (data.type == 'screen_control') { - logger.debug(data); - setScreenModeDisplay(data.display_type); - - } - } - - socket.onclose = () => { - logger.info('[WebSocketManager] WebSocket disconnected'); - setIsWsConnected(false); - }; - - return () => { - if (socket) { - socket.close(); - } - }; - - }, []); + //this websocket is not required for now + //we may also delete it, it creates instability for a feature that does not exist + // nor is planned as of now + // useEffect(() => { + + // setWs(socket); + // socket.onopen = () => { + // logger.info('WebSocket connected to backend'); + // setIsWsConnected(true); + // }; + + // socket.onmessage = (event: MessageEvent) => { + // let data = JSON.parse(event.data); + // if (typeof data == "string") { + // try { + // data = JSON.parse(data); + // } catch (e) { + // logger.error("Can't JSON parse this received string", { data }); + // } + // } + + // if (data.type == 'screen_control') { + // logger.debug(data); + // setScreenModeDisplay(data.display_type); + + // } + // } + + // socket.onclose = () => { + // logger.info('[WebSocketManager] WebSocket disconnected'); + // setIsWsConnected(false); + // }; + + // return () => { + // if (socket) { + // socket.close(); + // } + // }; + + // }, []); From 9a4ab97d205fdd29d525c7b86079d9aa6d956aa4 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Thu, 19 Feb 2026 18:55:56 +0700 Subject: [PATCH 03/59] Fixed logger incorrectly logging the error instead of it's message attribute --- src/api/multiplayer/PlayerManager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/multiplayer/PlayerManager.ts b/src/api/multiplayer/PlayerManager.ts index 293977d..1beeeba 100644 --- a/src/api/multiplayer/PlayerManager.ts +++ b/src/api/multiplayer/PlayerManager.ts @@ -200,7 +200,7 @@ class PlayerManager { logger.error(`Message size: ${message.byteLength} bytes`); } } catch(error){ - logger.error("couldn't display error message",error) + logger.error("couldn't display error message",error.message) } } break; From 4f2da10fdf11e60aa3cea213aa0059fad39a5fe6 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Thu, 19 Feb 2026 19:02:48 +0700 Subject: [PATCH 04/59] removed unused test page --- src/components/TestPage/Test.tsx | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 src/components/TestPage/Test.tsx diff --git a/src/components/TestPage/Test.tsx b/src/components/TestPage/Test.tsx deleted file mode 100644 index ad655f1..0000000 --- a/src/components/TestPage/Test.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import VideoStreamManager from "../WebSocketManager/VideoStreamManager"; - - -const Test = ({}) => { - - return ( -
- - - - - -
- - - ); -}; -export default Test; From d6c11610b90d23921f23e01f8ab04dd6aa4e4d53 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Thu, 19 Feb 2026 19:03:29 +0700 Subject: [PATCH 05/59] correctly typed index, previous "type" was int instead of number --- src/components/SelectorSimulations/SimulationList.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/SelectorSimulations/SimulationList.tsx b/src/components/SelectorSimulations/SimulationList.tsx index 56a1c4e..0ef3660 100644 --- a/src/components/SelectorSimulations/SimulationList.tsx +++ b/src/components/SelectorSimulations/SimulationList.tsx @@ -3,7 +3,7 @@ import { Simulation } from '../../api/core/Constants'; import { getLogger } from '@logtape/logtape'; interface SimulationListProps { list: Simulation[]; - handleSimulation: (index) => void; + handleSimulation: (index: number) => void; gama: { connected: boolean; loading: "hidden" | "visible"; From 086c09eb582e8b89f56e3a1247bf95c2d7f32984 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Thu, 19 Feb 2026 19:03:57 +0700 Subject: [PATCH 06/59] removed unused import --- src/components/StreamPlayerScreen/StreamFullscreen.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/StreamPlayerScreen/StreamFullscreen.tsx b/src/components/StreamPlayerScreen/StreamFullscreen.tsx index 2ad0039..878ee6f 100644 --- a/src/components/StreamPlayerScreen/StreamFullscreen.tsx +++ b/src/components/StreamPlayerScreen/StreamFullscreen.tsx @@ -1,4 +1,3 @@ -import PlayerScreenCanvas from "../WebSocketManager/PlayerScreenCanvas" import { useSearchParams } from "react-router-dom" import VideoStreamManager from "../WebSocketManager/VideoStreamManager"; import { HEADSET_COLOR } from "../../api/core/Constants.ts"; From fba500ba83a5b5e34b0c0641525a2f878c2f9810 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Thu, 19 Feb 2026 19:04:42 +0700 Subject: [PATCH 07/59] removed unused websocket for gama system --- .../StreamPlayerScreenControl.tsx | 51 +------------------ 1 file changed, 1 insertion(+), 50 deletions(-) diff --git a/src/components/StreamPlayerScreen/StreamPlayerScreenControl.tsx b/src/components/StreamPlayerScreen/StreamPlayerScreenControl.tsx index 2e24643..c6604d4 100644 --- a/src/components/StreamPlayerScreen/StreamPlayerScreenControl.tsx +++ b/src/components/StreamPlayerScreen/StreamPlayerScreenControl.tsx @@ -3,9 +3,7 @@ import { useState, useEffect } from 'react'; import VideoStreamManager from '../WebSocketManager/VideoStreamManager'; import { getLogger } from '@logtape/logtape'; const StreamPlayerScreenControl = () => { - const [screenModeDisplay, setScreenModeDisplay] = useState("gama_screen"); - const [ws, setWs] = useState(null); - const [isWsConnected, setIsWsConnected] = useState(false); + const host = window.location.hostname; const port = process.env.MONITOR_WS_PORT || '8001'; @@ -15,53 +13,6 @@ const StreamPlayerScreenControl = () => { const logger = getLogger(["components", "StreamPlayerScreenControl"]); - useEffect(() => { - - setWs(socket); - socket.onopen = () => { - logger.info('[TVControlSocket] WebSocket connected to backend'); - setIsWsConnected(true); - }; - - socket.onmessage = (event: MessageEvent) => { - let data = JSON.parse(event.data); - if (typeof data == "string") { - try { - data = JSON.parse(data); - } catch (e) { - logger.error("Can't JSON parse this received string", data); - } - } - - if (data.type == 'screen_control') { - logger.debug(data); - setScreenModeDisplay(data.display_type); - - } - } - - socket.onclose = () => { - logger.info('[WebSocketManager] WebSocket disconnected'); - setIsWsConnected(false); - }; - - return () => { - if (socket) { - socket.close(); - } - }; - }, []); - - - - - const emitDisplay = (displayType: string) => { - let payload = { "type": 'screen_control', display_type: displayType }; - logger.info(`emitted message:${JSON.stringify(payload)}`); - socket.send((JSON.stringify(payload))); - - } - From 3c3dfadb2f4213a1365a77d1e2465493b97acaf8 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Thu, 19 Feb 2026 19:05:11 +0700 Subject: [PATCH 08/59] changed the type of message back to any from a string --- src/api/multiplayer/PlayerManager.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/api/multiplayer/PlayerManager.ts b/src/api/multiplayer/PlayerManager.ts index 1beeeba..1d67e38 100644 --- a/src/api/multiplayer/PlayerManager.ts +++ b/src/api/multiplayer/PlayerManager.ts @@ -469,7 +469,8 @@ class PlayerManager { * @return Returns 1 for success, 2 for dropped due to backpressure limit, and 0 for built up backpressure that will drain over time. * @return -1 if playerWsId missing or not connected */ - sendMessageByWs(playerWsId: string, message: string): number { + //message sent is not necessarily a string, see PlayerManager for example + sendMessageByWs(playerWsId: string, message: any): number { let jsonPlayer!: Player; if (this.playerList.has(playerWsId) && this.playerList.get(playerWsId)!.connected ) jsonPlayer = this.playerList.get(playerWsId)!; From 897f3d951a381f16956fd711cb37ffc6b0ce4c18 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Thu, 19 Feb 2026 19:06:29 +0700 Subject: [PATCH 09/59] retyped from int to number --- src/components/WebSocketManager/VideoStreamManager.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/WebSocketManager/VideoStreamManager.tsx b/src/components/WebSocketManager/VideoStreamManager.tsx index d22ff17..5c021ec 100644 --- a/src/components/WebSocketManager/VideoStreamManager.tsx +++ b/src/components/WebSocketManager/VideoStreamManager.tsx @@ -64,7 +64,7 @@ interface VideoStreamManagerProps { // The React component const VideoStreamManager = ({ needsInteractivity, selectedCanvas, hideInfos }: VideoStreamManagerProps) => { const [canvasList, setCanvasList] = useState>({}); - const maxElements: int = 1 //! dictates the amount of placeholders and streams displayed on screen + const maxElements: number = 1 //! dictates the amount of placeholders and streams displayed on screen const placeholdersNeeded = maxElements - Object.keys(canvasList).length; //represents the actual amout of place holders needed to fill the display const placeholders = Array.from({ length: placeholdersNeeded }); const [islimitingDimWidth, setIslimitingDimWidth] = useState(false); From a192a0fb7e7bcacd88a45b1c065e88e67df68a7d Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Thu, 19 Feb 2026 19:06:37 +0700 Subject: [PATCH 10/59] fixed typo --- src/components/WebSocketManager/VideoStreamManager.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/WebSocketManager/VideoStreamManager.tsx b/src/components/WebSocketManager/VideoStreamManager.tsx index 5c021ec..c536b98 100644 --- a/src/components/WebSocketManager/VideoStreamManager.tsx +++ b/src/components/WebSocketManager/VideoStreamManager.tsx @@ -179,7 +179,7 @@ const VideoStreamManager = ({ needsInteractivity, selectedCanvas, hideInfos }: V // Feed the scrcpy stream to the video decoder void stream.pipeTo(decoder.writable).catch((err) => { - ogger.error("[Scrcpy] Error piping to decoder writable stream: {err}", { err }); + logger.error("[Scrcpy] Error piping to decoder writable stream: {err}", { err }); }); return stream; From a3feda48739a2558b0878cceae741aa602173d73 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Thu, 19 Feb 2026 19:07:04 +0700 Subject: [PATCH 11/59] used proper template syntax --- src/components/WebSocketManager/WebSocketManager.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/WebSocketManager/WebSocketManager.tsx b/src/components/WebSocketManager/WebSocketManager.tsx index 8f366ef..4e4172d 100644 --- a/src/components/WebSocketManager/WebSocketManager.tsx +++ b/src/components/WebSocketManager/WebSocketManager.tsx @@ -96,7 +96,7 @@ const WebSocketManager = ({ children }: WebSocketManagerProps) => { if (Array.isArray(data) && data.every(d => d.type === 'json_simulation_list')) { setSimulationList(data.map(sim => sim.jsonSettings)); - logger.debug('[WebSocketManager] Simulation list:', data); + logger.debug('[WebSocketManager] Simulation list: {data}',{data : data.toString()}); } else { switch (data.type) { // this case is launch too much time From 83f45c9ff9c72823ac062f2a4ec19118f625e98c Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Thu, 19 Feb 2026 19:08:27 +0700 Subject: [PATCH 12/59] allowed subprojectsList to be empty, as initialization is asynchronous and can't be written directly in the useState --- src/components/SelectorSimulations/SelectorSimulations.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/SelectorSimulations/SelectorSimulations.tsx b/src/components/SelectorSimulations/SelectorSimulations.tsx index 7449b14..aa4b0ae 100644 --- a/src/components/SelectorSimulations/SelectorSimulations.tsx +++ b/src/components/SelectorSimulations/SelectorSimulations.tsx @@ -16,7 +16,7 @@ const SelectorSimulations = () => { const [loading, setLoading] = useState(true); const [connectionStatus, setConnectionStatus] = useState('Waiting for connection ...'); const { t } = useTranslation(); - const [subProjectsList, setSubProjectsList] = useState<[Simulation]>([]); + const [subProjectsList, setSubProjectsList] = useState<[(Simulation | undefined )]>([]); const [selectedSplashscreen, setSelectedSplashscreen] = useState("") const [path, setPath] = useState([]); From a34ad2beba48bf6ec5cd776c2751587271d937b7 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Thu, 19 Feb 2026 19:08:57 +0700 Subject: [PATCH 13/59] Moved logger definition in proper scope --- src/components/SimulationManager/SimulationManager.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/SimulationManager/SimulationManager.tsx b/src/components/SimulationManager/SimulationManager.tsx index 2b06a73..39b1d18 100644 --- a/src/components/SimulationManager/SimulationManager.tsx +++ b/src/components/SimulationManager/SimulationManager.tsx @@ -19,14 +19,14 @@ export interface Player { in_game: boolean; } -const logger= getLogger(["simulationManager", "SimulationManager"]); const SimulationManager = () => { + + const logger = getLogger(["simulationManager", "SimulationManager"]); const { ws, gama, playerList, selectedSimulation } = useWebSocket(); // `removePlayer` is now available const navigate = useNavigate(); const [simulationStarted, setSimulationStarted] = useState(false); const { t } = useTranslation(); - const [screenModeDisplay, setScreenModeDisplay] = useState("gama_screen"); const [startButtonClicked, setStartButtonClicked] = useState(false); //? these variables exist as a setup for the functionnality of changing the display type @@ -247,7 +247,7 @@ const SimulationManager = () => { className='flex w-15 h-full' > - {/* //! unused code that uses websockets to change the type of display to one with space to accomodate for the gama map of the game, but is not implemented for now + {/* //! unused code that uses websockets to change the type of display to one with space to accomodate for the gama map of the game, but is not implemented for now //! having these buttons that do nothing may confuse the user */} {/*
From 6da9f3cfbd8fad02b308af820dc90319e96a4a61 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Thu, 19 Feb 2026 19:09:16 +0700 Subject: [PATCH 14/59] removed unnecessary @ts-expect-error --- src/components/SelectorSimulations/SelectorSimulations.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/components/SelectorSimulations/SelectorSimulations.tsx b/src/components/SelectorSimulations/SelectorSimulations.tsx index aa4b0ae..78f02cb 100644 --- a/src/components/SelectorSimulations/SelectorSimulations.tsx +++ b/src/components/SelectorSimulations/SelectorSimulations.tsx @@ -56,7 +56,6 @@ const SelectorSimulations = () => { setSubProjectsList(list) } } - // @ts-expect-error the logger is not required in the dependency array, updates made to it should not trigger this hook }, [path, simulationList]) @@ -86,10 +85,8 @@ const SelectorSimulations = () => { if (subProjectsList.length <= 0) { //no subproject is selected, we either enter a folder or load a simulation if (simulationList[index].type == "catalog") { //? we additionaly check if the simulation is a catalog, not necessary but allows for adding extra types - // @ts-expect-error ↓ this is a catalog, which means it must have an "entries" attribute logger.debug("catalog detected, subprojectList:{subprojectList}", { subProjectList: JSON.stringify(simulationList[index].entries) }); try { - // @ts-expect-error ↓ this is a list, so assigning it to another list should be fine setSubProjectsList(simulationList[index].entries); addToPath(index) if ('splashscreen' in simulationList[index]) { From 62a10256b30315e88662257d81db5af462c3bb82 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Thu, 19 Feb 2026 19:09:41 +0700 Subject: [PATCH 15/59] added expect error, error is invalid --- src/components/SelectorSimulations/SimulationList.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/SelectorSimulations/SimulationList.tsx b/src/components/SelectorSimulations/SimulationList.tsx index 0ef3660..e952549 100644 --- a/src/components/SelectorSimulations/SimulationList.tsx +++ b/src/components/SelectorSimulations/SimulationList.tsx @@ -42,6 +42,7 @@ const SimulationList = ({ list, handleSimulation, gama, className }: SimulationL >{/*The absolute positionning guarantees that the image is the only static child so it takes the whole screen top and left are there to position the down arrow */} {simulation.type == "catalog" ? : null} {/* //? downward arrow */} { e.target.src = "/images/simple_logo.png"; logger.warn("couldn't load an image for simulation {index}, using the placeholder", { index }) }} className='size-full rounded-2xl' /> From 156801f51c5d095cbeb1e55b9aa8e69942391323 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Thu, 19 Feb 2026 19:09:49 +0700 Subject: [PATCH 16/59] reformated --- .../SimulationManagerButtons.tsx | 251 +++++++++--------- 1 file changed, 127 insertions(+), 124 deletions(-) diff --git a/src/components/SimulationManager/SimulationManagerButtons.tsx b/src/components/SimulationManager/SimulationManagerButtons.tsx index 7648ea4..cdca5ba 100644 --- a/src/components/SimulationManager/SimulationManagerButtons.tsx +++ b/src/components/SimulationManager/SimulationManagerButtons.tsx @@ -1,133 +1,136 @@ import Button from '../Button/Button'; import { useWebSocket } from '../WebSocketManager/WebSocketManager'; +import { getLogger } from '@logtape/logtape'; const SimulationManagerButtons = () => { - const { ws, gama} = useWebSocket(); - - const handlePlayPause = () => { - if(ws !== null){ - ws.send(JSON.stringify({"type": gama.experiment_state == "NONE" ? "launch_experiment" : (gama.experiment_state != "RUNNING" ? "resume_experiment" : "pause_experiment") })); - }else{ - logger.error("WS is null"); - } - }; - - const handleEnd = () => { - if(ws !== null){ - ws.send(JSON.stringify({"type": "stop_experiment"})); - }else{ - logger.error("WS is null"); - } - }; - - - - - const icon = gama.experiment_state === 'LAUNCHING' ? ( - - - - - ) : gama.experiment_state === 'NONE' || gama.experiment_state === 'NOTREADY' || gama.experiment_state === 'PAUSED' ? ( - - - - ) : ( - - - - ); - - return ( -
- -
- - {/* add a new button */} -
- - - + const logger = getLogger(["components", "SimulationManagerButtons"]); + const { ws, gama } = useWebSocket(); + + const handlePlayPause = () => { + if (ws !== null) { + ws.send(JSON.stringify({ "type": gama.experiment_state == "NONE" ? "launch_experiment" : (gama.experiment_state != "RUNNING" ? "resume_experiment" : "pause_experiment") })); + } else { + logger.error("WS is null"); + } + }; + + const handleEnd = () => { + if (ws !== null) { + ws.send(JSON.stringify({ "type": "stop_experiment" })); + } else { + logger.error("WS is null"); + } + }; + + + + + const icon = gama.experiment_state === 'LAUNCHING' ? ( + + + + + ) : gama.experiment_state === 'NONE' || gama.experiment_state === 'NOTREADY' || gama.experiment_state === 'PAUSED' ? ( + + + + ) : ( + + + + ); + + return ( +
+ +
+ + {/* add a new button */} +
- - ); + + + + + +
+ + ); }; export default SimulationManagerButtons; \ No newline at end of file From fe648aafb863d88d76ae57f167f7b4c723bb38ee Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Thu, 19 Feb 2026 19:10:39 +0700 Subject: [PATCH 17/59] removed / fixed unused imports --- src/components/StreamPlayerScreen/StreamPlayerScreen.tsx | 2 +- src/components/VRHeadset/VRHeadset.tsx | 4 +--- src/components/WebSocketManager/WebSocketManager.tsx | 6 +++--- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/components/StreamPlayerScreen/StreamPlayerScreen.tsx b/src/components/StreamPlayerScreen/StreamPlayerScreen.tsx index 6b8611b..8639904 100644 --- a/src/components/StreamPlayerScreen/StreamPlayerScreen.tsx +++ b/src/components/StreamPlayerScreen/StreamPlayerScreen.tsx @@ -1,7 +1,7 @@ import { useEffect, useRef, useState } from "react"; import VideoStreamManager from "../WebSocketManager/VideoStreamManager"; import Header from "../Header/Header"; -import { getLogger, getConsoleSink, configure } from "@logtape/logtape"; +import { getLogger } from "@logtape/logtape"; const StreamPlayerScreen = () => { const [screenModeDisplay, setScreenModeDisplay] = useState("gama_screen"); // Get the screen mode display from the context const videoContainerRef = useRef(null); // Add ref for the target div diff --git a/src/components/VRHeadset/VRHeadset.tsx b/src/components/VRHeadset/VRHeadset.tsx index f8889c9..f10a79d 100644 --- a/src/components/VRHeadset/VRHeadset.tsx +++ b/src/components/VRHeadset/VRHeadset.tsx @@ -1,5 +1,4 @@ -import React, { useState } from 'react'; -import { useTranslation } from 'react-i18next'; + import {HEADSET_COLOR} from "../../api/core/Constants.ts"; interface VRHeadsetProps { @@ -19,7 +18,6 @@ const VRHeadset= ({ selectedPlayer, className, playerId }: VRHeadsetProps) => { } else { const ipIdentifier: string = playerId!.split("_")[1]; if (ipIdentifier in HEADSET_COLOR) { - // @ts-expect-error return `/images/headset_${HEADSET_COLOR[ipIdentifier].split('-')[1]}.png`; } else { return "/images/headset_white.png"; diff --git a/src/components/WebSocketManager/WebSocketManager.tsx b/src/components/WebSocketManager/WebSocketManager.tsx index 4e4172d..af90c54 100644 --- a/src/components/WebSocketManager/WebSocketManager.tsx +++ b/src/components/WebSocketManager/WebSocketManager.tsx @@ -1,6 +1,6 @@ import { createContext, useContext, useEffect, useState, ReactNode } from 'react'; -import { Simulation } from "../core/Constants.ts" -import { getLogger, configure, getConsoleSink } from '@logtape/logtape'; +import { Simulation } from "../../api/core/Constants.ts" +import { getLogger } from '@logtape/logtape'; @@ -114,7 +114,7 @@ const WebSocketManager = ({ children }: WebSocketManagerProps) => { default: logger.warn('[WebSocketManager] Message not processed, defaulted to setSimulationList. data:{data}', { data }); setSimulationList(data) - //TODO changer cette mocheté, le message est traité dans certain cas si on appelle une méthode sur le contenu du message, ça limitera le logspam potentiellement + } } }; From 95f116425244f7aa7addd4f1b27edaee282a006a Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Thu, 19 Feb 2026 19:11:47 +0700 Subject: [PATCH 18/59] implemented logger in this component, added a if else block for tailwindcanvasdim --- .../WebSocketManager/PlayerScreenCanvas.tsx | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/components/WebSocketManager/PlayerScreenCanvas.tsx b/src/components/WebSocketManager/PlayerScreenCanvas.tsx index 39a5adb..a7d40ed 100644 --- a/src/components/WebSocketManager/PlayerScreenCanvas.tsx +++ b/src/components/WebSocketManager/PlayerScreenCanvas.tsx @@ -2,7 +2,7 @@ import { useEffect, useRef, useState } from "react"; import { HEADSET_COLOR } from "../../api/core/Constants.ts"; import visibility_off from "../../svg_logos/visibility_off.svg" import x_cross from "../../svg_logos/x_cross.svg"; - +import { getLogger } from "@logtape/logtape"; //TODO pour fix le problème du canvas qui est en petit, puis qui devient grand quand tu clique dessus, regarder les hook qui sont trigger quand on clique sur le canvas (surtout le truc qui applique les classes tailwind) //TODO et juste nettoyer complètement le css à chaque fois, et le réappliquer pour éviter le problème, quitte à ce que le code soit redondant /* eslint react-hooks/rules-of-hooks: 0, curly: 2 */ //? desactive les avertissements sur les hooks qui sont appelés conditionnellement, ce qui n'arrive jamais dans ce cas @@ -20,6 +20,8 @@ interface PlayerScreenCanvasProps { const PlayerScreenCanvas = ({ canvas, id, isPlaceholder, hideInfos, isLimitingWidth, tailwindCanvasDim, gridDisplay, needsInteractivity }: PlayerScreenCanvasProps) => { + const logger = new getLogger(["components", "PlayerScreenCanvas"]) + if (!id) { return null; } @@ -52,8 +54,14 @@ const PlayerScreenCanvas = ({ canvas, id, isPlaceholder, hideInfos, isLimitingWi } } else { if (canvasref.current) { - canvas.classList.add(tailwindCanvasDim[0]) - canvas.classList.add(tailwindCanvasDim[1]) + if (tailwindCanvasDim) { + canvas.classList.add(tailwindCanvasDim[0]) + canvas.classList.add(tailwindCanvasDim[1]) + } else { + logger.warn("no dimensions received, using default full screen values") + canvas.classList.add("max-h-[95dvh]") + canvas.classList.add("max-w-[95dvw]") + } @@ -99,7 +107,7 @@ const PlayerScreenCanvas = ({ canvas, id, isPlaceholder, hideInfos, isLimitingWi flex flex-row align-middle justify-center p-2 rounded-lg ${gridDisplay ? null : isLimitingWidth ? "max-w-full h-full" : "max-h-full w-full"}`} onClick={needsInteractivity ? () => { setShowPopup(true) } : undefined} - > + >
From 9711f37db16bd850531edd13ca708e4a4bdae968 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Fri, 20 Feb 2026 09:51:23 +0700 Subject: [PATCH 19/59] added optionnal property to tailwindcanvas dim --- src/components/WebSocketManager/PlayerScreenCanvas.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/WebSocketManager/PlayerScreenCanvas.tsx b/src/components/WebSocketManager/PlayerScreenCanvas.tsx index a7d40ed..fa02173 100644 --- a/src/components/WebSocketManager/PlayerScreenCanvas.tsx +++ b/src/components/WebSocketManager/PlayerScreenCanvas.tsx @@ -13,7 +13,7 @@ interface PlayerScreenCanvasProps { id?: string; setActiveCanvas?: (a: string) => void //function that is passed as a prop by the videostreammanager, this function here returns the canvas and the ip of the headset that need to be displayed in a popup window hideInfos?: boolean; // boolean used in case you want to hide player id and identifier, used in case of fullscreen for example - tailwindCanvasDim: [string, string]; //tailwind raw dimensions to be passed to the canvas element + tailwindCanvasDim?: [string, string]; //tailwind raw dimensions to be passed to the canvas element isLimitingWidth?: boolean; //whether the maximum dimension is the width or the height gridDisplay?: boolean; } From d9d3c9d5bc22ec9027db00fb33c1ca8821255519 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Fri, 20 Feb 2026 09:54:59 +0700 Subject: [PATCH 20/59] Removed "streamplayerscreenControl" component, as it is currently unused, and its functionnality is best done directly on the streamplayerscreen components instead of having another component that acts nearly the same --- .../StreamPlayerScreenControl.tsx | 58 ------------------- src/main.tsx | 2 - 2 files changed, 60 deletions(-) delete mode 100644 src/components/StreamPlayerScreen/StreamPlayerScreenControl.tsx diff --git a/src/components/StreamPlayerScreen/StreamPlayerScreenControl.tsx b/src/components/StreamPlayerScreen/StreamPlayerScreenControl.tsx deleted file mode 100644 index c6604d4..0000000 --- a/src/components/StreamPlayerScreen/StreamPlayerScreenControl.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import Header from '../Header/Header'; -import { useState, useEffect } from 'react'; -import VideoStreamManager from '../WebSocketManager/VideoStreamManager'; -import { getLogger } from '@logtape/logtape'; -const StreamPlayerScreenControl = () => { - - const host = window.location.hostname; - const port = process.env.MONITOR_WS_PORT || '8001'; - - - const socket = new WebSocket(`ws://${host}:${port}`); - - const logger = getLogger(["components", "StreamPlayerScreenControl"]); - - - - - - - - - return ( -
-
-
-
- {/*//? the weird values used here are to ensure that the blue container takes up the full screen, an sets the size as full screen minus the margin (m-8) - //? if we simply used w-full, the margin would push the size beyond the border, and visually the margin would not be applied */} - -
- {/*
//TODO ensure functionnality of these buttons affect the display, not necessary for now as it would require the gama stream to be working -

tv display mode

- -
*/} -
-
- ); -}; - -export default StreamPlayerScreenControl; \ No newline at end of file diff --git a/src/main.tsx b/src/main.tsx index e1e5e3c..d47c8c0 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -8,7 +8,6 @@ import SimulationManager from './components/SimulationManager/SimulationManager' import Navigation from './components/Navigation/Navigation'; import SelectorSimulations from './components/SelectorSimulations/SelectorSimulations'; import WebSocketManager from './components/WebSocketManager/WebSocketManager'; -import StreamPlayerScreenControl from './components/StreamPlayerScreen/StreamPlayerScreenControl'; import StreamPlayerScreen from './components/StreamPlayerScreen/StreamPlayerScreen'; import StreamFullscreen from './components/StreamPlayerScreen/StreamFullscreen'; @@ -40,7 +39,6 @@ const App = () => { } /> } /> } /> - } /> }> From a3a9a26da955384dbcf654dd41ab6e6cbeb79410 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Fri, 20 Feb 2026 09:56:08 +0700 Subject: [PATCH 21/59] fixed wrong declaration of logger --- src/components/WebSocketManager/PlayerScreenCanvas.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/WebSocketManager/PlayerScreenCanvas.tsx b/src/components/WebSocketManager/PlayerScreenCanvas.tsx index fa02173..b4ed1a0 100644 --- a/src/components/WebSocketManager/PlayerScreenCanvas.tsx +++ b/src/components/WebSocketManager/PlayerScreenCanvas.tsx @@ -20,7 +20,7 @@ interface PlayerScreenCanvasProps { const PlayerScreenCanvas = ({ canvas, id, isPlaceholder, hideInfos, isLimitingWidth, tailwindCanvasDim, gridDisplay, needsInteractivity }: PlayerScreenCanvasProps) => { - const logger = new getLogger(["components", "PlayerScreenCanvas"]) + const logger = getLogger(["components", "PlayerScreenCanvas"]) if (!id) { return null; From aef2665ca8466d4bd134e090b07af8a55fb99e58 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Fri, 20 Feb 2026 10:18:34 +0700 Subject: [PATCH 22/59] added ternary operator, checking if selectadPlayer is not undefined before using it to display misc informations --- .../SimulationManager/SimulationManagerPlayer.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/SimulationManager/SimulationManagerPlayer.tsx b/src/components/SimulationManager/SimulationManagerPlayer.tsx index bd9124a..71b07ef 100644 --- a/src/components/SimulationManager/SimulationManagerPlayer.tsx +++ b/src/components/SimulationManager/SimulationManagerPlayer.tsx @@ -64,9 +64,9 @@ const SimulationManagerPlayer = ({ Playerkey, selectedPlayer, className, playerI

Player: {String(playerId)}

-

{t('Status')} : {String(selectedPlayer.connected)}

-

{t('Hour of connection')} : {selectedPlayer.date_connection}

-

{t('In game')} : {String(selectedPlayer.in_game)}

+

{t('Status')} : {selectedPlayer ? String(selectedPlayer.connected) : "no selected player"}

+

{t('Hour of connection')} : {selectedPlayer ? selectedPlayer.date_connection : "no selected player"}

+

{t('In game')} : {selectedPlayer ? String(selectedPlayer.in_game) : "no selected player"}

From 3f0d3f8acd06a4fb9adde1e4c7750d761053578a Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Fri, 20 Feb 2026 10:26:09 +0700 Subject: [PATCH 23/59] fixed syntax highlighting not working properly, updated eslint dependencies --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index da02af2..41a53b8 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,6 @@ learning-packages/ACROSS-Lab QuangBinhProject MIAT-version Gama/ bin dist dist-api +package-lock.json +package.json +eslint.config.ts From 4c291f63d0b4efb8ec56e85447774448948efac7 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Fri, 20 Feb 2026 10:26:27 +0700 Subject: [PATCH 24/59] updated package and package.lock --- package-lock.json | 150 +++++++++--------- package.json | 6 +- .../SimulationManagerPlayer.tsx | 8 +- 3 files changed, 82 insertions(+), 82 deletions(-) diff --git a/package-lock.json b/package-lock.json index 343c43a..2904f6b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -65,7 +65,7 @@ "globals": "^17.3.0", "jest": "^29.7.0", "jiti": "^2.6.1", - "typescript-eslint": "^8.54.0" + "typescript-eslint": "^8.56.0" } }, "node_modules/@alloc/quick-lru": { @@ -2553,14 +2553,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz", - "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.0.tgz", + "integrity": "sha512-M3rnyL1vIQOMeWxTWIW096/TtVP+8W3p/XnaFflhmcFp+U4zlxUxWj4XwNs6HbDeTtN4yun0GNTTDBw/SvufKg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.54.0", - "@typescript-eslint/types": "^8.54.0", + "@typescript-eslint/tsconfig-utils": "^8.56.0", + "@typescript-eslint/types": "^8.56.0", "debug": "^4.4.3" }, "engines": { @@ -2575,9 +2575,9 @@ } }, "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz", - "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.0.tgz", + "integrity": "sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==", "dev": true, "license": "MIT", "engines": { @@ -2606,9 +2606,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz", - "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.0.tgz", + "integrity": "sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg==", "dev": true, "license": "MIT", "engines": { @@ -10721,16 +10721,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.54.0.tgz", - "integrity": "sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.0.tgz", + "integrity": "sha512-c7toRLrotJ9oixgdW7liukZpsnq5CZ7PuKztubGYlNppuTqhIoWfhgHo/7EU0v06gS2l/x0i2NEFK1qMIf0rIg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.54.0", - "@typescript-eslint/parser": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0", - "@typescript-eslint/utils": "8.54.0" + "@typescript-eslint/eslint-plugin": "8.56.0", + "@typescript-eslint/parser": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.0", + "@typescript-eslint/utils": "8.56.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10740,22 +10740,22 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz", - "integrity": "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.0.tgz", + "integrity": "sha512-lRyPDLzNCuae71A3t9NEINBiTn7swyOhvUj3MyUOxb8x6g6vPEFoOU+ZRmGMusNC3X3YMhqMIX7i8ShqhT74Pw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.54.0", - "@typescript-eslint/type-utils": "8.54.0", - "@typescript-eslint/utils": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", + "@typescript-eslint/scope-manager": "8.56.0", + "@typescript-eslint/type-utils": "8.56.0", + "@typescript-eslint/utils": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" @@ -10768,22 +10768,22 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.54.0", - "eslint": "^8.57.0 || ^9.0.0", + "@typescript-eslint/parser": "^8.56.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.54.0.tgz", - "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.0.tgz", + "integrity": "sha512-IgSWvLobTDOjnaxAfDTIHaECbkNlAlKv2j5SjpB2v7QHKv1FIfjwMy8FsDbVfDX/KjmCmYICcw7uGaXLhtsLNg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", + "@typescript-eslint/scope-manager": "8.56.0", + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0", "debug": "^4.4.3" }, "engines": { @@ -10794,19 +10794,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/scope-manager": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz", - "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.0.tgz", + "integrity": "sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0" + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10817,15 +10817,15 @@ } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/type-utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz", - "integrity": "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.0.tgz", + "integrity": "sha512-qX2L3HWOU2nuDs6GzglBeuFXviDODreS58tLY/BALPC7iu3Fa+J7EOTwnX9PdNBxUI7Uh0ntP0YWGnxCkXzmfA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0", - "@typescript-eslint/utils": "8.54.0", + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.0", + "@typescript-eslint/utils": "8.56.0", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, @@ -10837,14 +10837,14 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/types": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz", - "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.0.tgz", + "integrity": "sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==", "dev": true, "license": "MIT", "engines": { @@ -10856,16 +10856,16 @@ } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz", - "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.0.tgz", + "integrity": "sha512-ex1nTUMWrseMltXUHmR2GAQ4d+WjkZCT4f+4bVsps8QEdh0vlBsaCokKTPlnqBFqqGaxilDNJG7b8dolW2m43Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.54.0", - "@typescript-eslint/tsconfig-utils": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", + "@typescript-eslint/project-service": "8.56.0", + "@typescript-eslint/tsconfig-utils": "8.56.0", + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0", "debug": "^4.4.3", "minimatch": "^9.0.5", "semver": "^7.7.3", @@ -10884,16 +10884,16 @@ } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.54.0.tgz", - "integrity": "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.0.tgz", + "integrity": "sha512-RZ3Qsmi2nFGsS+n+kjLAYDPVlrzf7UhTffrDIKr+h2yzAlYP/y5ZulU0yeDEPItos2Ph46JAL5P/On3pe7kDIQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0" + "@typescript-eslint/scope-manager": "8.56.0", + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10903,19 +10903,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz", - "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.0.tgz", + "integrity": "sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.54.0", - "eslint-visitor-keys": "^4.2.1" + "@typescript-eslint/types": "8.56.0", + "eslint-visitor-keys": "^5.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10926,13 +10926,13 @@ } }, "node_modules/typescript-eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", + "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" diff --git a/package.json b/package.json index 9ba85a5..5cc8388 100644 --- a/package.json +++ b/package.json @@ -74,13 +74,13 @@ "devDependencies": { "@eslint/js": "^9.39.2", "@eslint/json": "^1.0.0", + "@types/express": "^5.0.6", + "@yao-pkg/pkg": "^6.12.0", "eslint": "^8.57.1", "eslint-plugin-react": "^7.37.5", "globals": "^17.3.0", "jest": "^29.7.0", "jiti": "^2.6.1", - "typescript-eslint": "^8.54.0", - "@types/express": "^5.0.6", - "@yao-pkg/pkg": "^6.12.0" + "typescript-eslint": "^8.56.0" } } diff --git a/src/components/SimulationManager/SimulationManagerPlayer.tsx b/src/components/SimulationManager/SimulationManagerPlayer.tsx index 71b07ef..7c96230 100644 --- a/src/components/SimulationManager/SimulationManagerPlayer.tsx +++ b/src/components/SimulationManager/SimulationManagerPlayer.tsx @@ -17,7 +17,7 @@ interface PlayerProps { const SimulationManagerPlayer = ({ Playerkey, selectedPlayer, className, playerId }: PlayerProps) => { const { t } = useTranslation(); - const { ws, playerList } = useWebSocket(); // `removePlayer` is now available + const { ws } = useWebSocket(); // `removePlayer` is now available const [showPopUpManageHeadset, setshowPopUpManageHeadset] = useState(false); @@ -98,10 +98,10 @@ const SimulationManagerPlayer = ({ Playerkey, selectedPlayer, className, playerI selectedPlayer={selectedPlayer} playerId={Playerkey} /> -
- {selectedPlayer.connected ? +
+ { selectedPlayer ? selectedPlayer.connected ? selectedPlayer.in_game ?

{t("in_game")}

: -

{t("connected")}

:

{t("error")}

} +

{t("connected")}

:

{t("error")}

: "player undefined"}
From f359aaf7d9fd38aea851b8a71866f399aad7ed88 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Fri, 20 Feb 2026 10:29:01 +0700 Subject: [PATCH 25/59] added expect error on a value that was identified as unused, but was actually used with a redefined this --- src/api/android/scrcpy/ScrcpyServer.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/api/android/scrcpy/ScrcpyServer.ts b/src/api/android/scrcpy/ScrcpyServer.ts index a604bdb..daa4973 100644 --- a/src/api/android/scrcpy/ScrcpyServer.ts +++ b/src/api/android/scrcpy/ScrcpyServer.ts @@ -36,7 +36,8 @@ export class ScrcpyServer { // ======================= // Scrcpy stream - private scrcpyStreamConfig!: string; + //@ts-expect-error this value is used line 321 + private scrcpyStreamConfig!: string; private adbManager!: AdbManager; From ac9fe0c9e992ac7d25b8f0af761fd03fe96bb7b0 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Fri, 20 Feb 2026 10:46:18 +0700 Subject: [PATCH 26/59] added "entries" property of type array of simulation for proper typing in the selector simulation --- src/api/core/Constants.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/api/core/Constants.ts b/src/api/core/Constants.ts index 5e3c500..71b3068 100644 --- a/src/api/core/Constants.ts +++ b/src/api/core/Constants.ts @@ -51,6 +51,7 @@ export interface Simulation { maximal_players: string, minimal_players: string, selected_monitoring: string + entries: Simulation[] } // Learning packages ============================================== From 7099bb78a5d4778986f7714844b5e6ca3cc9c456 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Fri, 20 Feb 2026 10:50:48 +0700 Subject: [PATCH 27/59] added comments on 2 potentially obscure functions --- src/components/SelectorSimulations/SelectorSimulations.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/SelectorSimulations/SelectorSimulations.tsx b/src/components/SelectorSimulations/SelectorSimulations.tsx index 78f02cb..271b8bc 100644 --- a/src/components/SelectorSimulations/SelectorSimulations.tsx +++ b/src/components/SelectorSimulations/SelectorSimulations.tsx @@ -62,7 +62,9 @@ const SelectorSimulations = () => { const addToPath = (index: number) => { setPath([...path, index]) } - + /**Removes the last index used to travel the subproject folder + * + */ const back = () => { if (path.length > 1) { setPath([...path.slice(0, -1)]) From f708a4f7b2f6801b57f3b221648644fcc15ac961 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Fri, 20 Feb 2026 10:56:46 +0700 Subject: [PATCH 28/59] changed how subProjectsList is implemented: instead of using [array] (containing only a single element), redefned it to array[]. Assigned simulationList to it on creation to avoid undefined cases, but added checks to avoid undefined issues by using ternary operators in the template that return null or a simple string if subProjectsList is undefined. --- .../SelectorSimulations.tsx | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/src/components/SelectorSimulations/SelectorSimulations.tsx b/src/components/SelectorSimulations/SelectorSimulations.tsx index 271b8bc..d6b4023 100644 --- a/src/components/SelectorSimulations/SelectorSimulations.tsx +++ b/src/components/SelectorSimulations/SelectorSimulations.tsx @@ -16,7 +16,7 @@ const SelectorSimulations = () => { const [loading, setLoading] = useState(true); const [connectionStatus, setConnectionStatus] = useState('Waiting for connection ...'); const { t } = useTranslation(); - const [subProjectsList, setSubProjectsList] = useState<[(Simulation | undefined )]>([]); + const [subProjectsList, setSubProjectsList] = useState(simulationList); const [selectedSplashscreen, setSelectedSplashscreen] = useState("") const [path, setPath] = useState([]); @@ -51,14 +51,17 @@ const SelectorSimulations = () => { if (list[index].entries.length > 0) { list = list[index].entries } else { - list = list[index] + list = [list[index]] } setSubProjectsList(list) } } }, [path, simulationList]) - + /**Function used to add a clicked subfolder to path + * path is an ordered array containing the indexes of all clicked subfolders + * @param index + */ const addToPath = (index: number) => { setPath([...path, index]) } @@ -84,7 +87,6 @@ const SelectorSimulations = () => { logger.warn("Websocket not connected \n isWsConnected:{isWsConnected}\n ws:{ws}", { isWsConnected, ws }) return; } - if (subProjectsList.length <= 0) { //no subproject is selected, we either enter a folder or load a simulation if (simulationList[index].type == "catalog") { //? we additionaly check if the simulation is a catalog, not necessary but allows for adding extra types logger.debug("catalog detected, subprojectList:{subprojectList}", { subProjectList: JSON.stringify(simulationList[index].entries) }); @@ -94,7 +96,7 @@ const SelectorSimulations = () => { if ('splashscreen' in simulationList[index]) { setSelectedSplashscreen(simulationList[index].splashscreen); - } else { + } else { //@ts-expect-error simulationList[index] type is defined as "never" for some reason, but is a Simulation, so this property access is valid logger.warn("No splashscreen could be found for simulation {simulation}", { simulation: simulationList[index].experimentName }) //TODO finir le logger warn } logger.debug("handlesimulation, simulationList[index].type == catalog, {expName}", { expName: subProjectsList[index].name }); @@ -122,13 +124,11 @@ const SelectorSimulations = () => { } else { if (subProjectsList[index].type == "catalog") { try { - // @ts-expect-error ↓ this is a list, so assigning it to another list should be fine - // setSubProjectsList(subProjectsList[index].entries); addToPath(index) logger.debug("[SELECTOR SIMULATION] handlesimulation, simulationList[index].type == catalog, {name}", { name: subProjectsList[0].name }); } // in any case, we catch the error and log it if any catch (e) { - logger.error("no subprojects, ERROR: {e}", e); + logger.error("no subprojects, ERROR: {e}", { e }); } } } @@ -180,7 +180,7 @@ const SelectorSimulations = () => { { //the content of this bracket is the back button - subProjectsList.length > 0 && path.length >= 1 ? + subProjectsList ? subProjectsList.length > 0 && path.length >= 1 ?
{
- : null} + : null : "no subprojects"} - {subProjectsList.length > 0 ?

{t('select_subproject')}

:

{t('select_simulation')}

} + {subProjectsList ? subProjectsList.length > 0 ?

{t('select_subproject')}

:

{t('select_simulation')}

: null} {/* //TODO add translation for Thai language */} @@ -210,9 +210,10 @@ const SelectorSimulations = () => {
- {subProjectsList.length > 0 ? + {subProjectsList ? subProjectsList.length > 0 ? : + : null } @@ -228,14 +229,14 @@ const SelectorSimulations = () => {
- - - + + +
From e9f2db268be8914d4e33af1cc087df21241865bd Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Fri, 20 Feb 2026 10:57:30 +0700 Subject: [PATCH 29/59] created an error object to properly display an error message in the console, and used template syntax of logger --- src/api/multiplayer/PlayerManager.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/api/multiplayer/PlayerManager.ts b/src/api/multiplayer/PlayerManager.ts index 1d67e38..9f76f6f 100644 --- a/src/api/multiplayer/PlayerManager.ts +++ b/src/api/multiplayer/PlayerManager.ts @@ -199,8 +199,9 @@ class PlayerManager { if (typeof message.byteLength !== 'undefined') { logger.error(`Message size: ${message.byteLength} bytes`); } - } catch(error){ - logger.error("couldn't display error message",error.message) + } catch(e){ + const error = e as Error; + logger.error("couldn't display error message: {error}",{error : error.message}) } } break; From 1e7b2c69fb7c7f4a3ce3273b266fa7e73a601ea5 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Fri, 20 Feb 2026 10:58:30 +0700 Subject: [PATCH 30/59] removed unused "setIdentifier" from the useSearchParams() function --- src/components/StreamPlayerScreen/StreamFullscreen.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/StreamPlayerScreen/StreamFullscreen.tsx b/src/components/StreamPlayerScreen/StreamFullscreen.tsx index 878ee6f..fe23a5c 100644 --- a/src/components/StreamPlayerScreen/StreamFullscreen.tsx +++ b/src/components/StreamPlayerScreen/StreamFullscreen.tsx @@ -2,7 +2,7 @@ import { useSearchParams } from "react-router-dom" import VideoStreamManager from "../WebSocketManager/VideoStreamManager"; import { HEADSET_COLOR } from "../../api/core/Constants.ts"; const StreamFullscreen = () => { - const [identifier, setIdentifier] = useSearchParams(); + const [identifier] = useSearchParams(); identifier.get("") const cleanId = identifier.toString().replace(/\D/g, ""); const bgColor = HEADSET_COLOR[cleanId] From 07e972982e40be2cb0b24a661d61aca2a26b9457 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Fri, 20 Feb 2026 11:02:50 +0700 Subject: [PATCH 31/59] removed unused screen display type functionnality, removed different templates, removed get logger import as this component has no functionnal parts, we might also just remove it outright and directly use the videostreamingmanager in its place --- .../StreamPlayerScreen/StreamPlayerScreen.tsx | 70 +------------------ 1 file changed, 3 insertions(+), 67 deletions(-) diff --git a/src/components/StreamPlayerScreen/StreamPlayerScreen.tsx b/src/components/StreamPlayerScreen/StreamPlayerScreen.tsx index 8639904..668f053 100644 --- a/src/components/StreamPlayerScreen/StreamPlayerScreen.tsx +++ b/src/components/StreamPlayerScreen/StreamPlayerScreen.tsx @@ -1,67 +1,16 @@ -import { useEffect, useRef, useState } from "react"; +import { useRef } from "react"; import VideoStreamManager from "../WebSocketManager/VideoStreamManager"; import Header from "../Header/Header"; -import { getLogger } from "@logtape/logtape"; const StreamPlayerScreen = () => { - const [screenModeDisplay, setScreenModeDisplay] = useState("gama_screen"); // Get the screen mode display from the context - const videoContainerRef = useRef(null); // Add ref for the target div - // const [ws, setWs] = useState(null); unused variable defining a websocket that is meant to control the display type - // const [isWsConnected, setIsWsConnected] = useState(false); of this component, to accomodate a GAMA display inside the app - const host = window.location.hostname; - const port = process.env.MONITOR_WS_PORT || '8001'; - const socket = new WebSocket(`ws://${host}:${port}`); - - - const logger = getLogger(["components", "StreamPlayerScreen"]); - //this websocket is not required for now - //we may also delete it, it creates instability for a feature that does not exist - // nor is planned as of now - // useEffect(() => { - - // setWs(socket); - // socket.onopen = () => { - // logger.info('WebSocket connected to backend'); - // setIsWsConnected(true); - // }; - - // socket.onmessage = (event: MessageEvent) => { - // let data = JSON.parse(event.data); - // if (typeof data == "string") { - // try { - // data = JSON.parse(data); - // } catch (e) { - // logger.error("Can't JSON parse this received string", { data }); - // } - // } - - // if (data.type == 'screen_control') { - // logger.debug(data); - // setScreenModeDisplay(data.display_type); - - // } - // } - - // socket.onclose = () => { - // logger.info('[WebSocketManager] WebSocket disconnected'); - // setIsWsConnected(false); - // }; - // return () => { - // if (socket) { - // socket.close(); - // } - // }; - - // }, []); + const videoContainerRef = useRef(null); // Add ref for the target div - // Rendu basé sur la valeur de screenModeDisplay return (
- {screenModeDisplay === "shared_screen" && (
@@ -71,21 +20,8 @@ const StreamPlayerScreen = () => {
- )} + - {screenModeDisplay === "gama_screen" && ( -
- -
- )} - - {screenModeDisplay !== "gama_screen" && - screenModeDisplay !== "shared_screen" && ( - -
-

Unknown screen mode: {screenModeDisplay}

-
- )}
From d7a9f770aa6ca9146a71d06b5fdd8e7a6cb7733e Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Fri, 20 Feb 2026 11:04:03 +0700 Subject: [PATCH 32/59] added bracket for correct template syntax --- src/components/WebSocketManager/WebSocketManager.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/WebSocketManager/WebSocketManager.tsx b/src/components/WebSocketManager/WebSocketManager.tsx index af90c54..3ae3833 100644 --- a/src/components/WebSocketManager/WebSocketManager.tsx +++ b/src/components/WebSocketManager/WebSocketManager.tsx @@ -66,7 +66,7 @@ const WebSocketManager = ({ children }: WebSocketManagerProps) => { return updatedPlayerList; }); - logger.info(" This player have been removed from playerList : ", id); + logger.info(" This player have been removed from playerList : ", {id}); }; From 6f57254f562f56a8983ac05b78226bd2c601d9da Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Fri, 20 Feb 2026 11:05:12 +0700 Subject: [PATCH 33/59] added brackets for correct use of logger --- src/components/WebSocketManager/VideoStreamManager.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/WebSocketManager/VideoStreamManager.tsx b/src/components/WebSocketManager/VideoStreamManager.tsx index c536b98..27dd7e3 100644 --- a/src/components/WebSocketManager/VideoStreamManager.tsx +++ b/src/components/WebSocketManager/VideoStreamManager.tsx @@ -170,7 +170,7 @@ const VideoStreamManager = ({ needsInteractivity, selectedCanvas, hideInfos }: V isDecoderHasConfig.delete(deviceId); try { canvasList[deviceId].remove(); - logger.info("deleted canvas", deviceId) + logger.info("deleted canvas", {deviceId}) } catch (e) { logger.error("Can't delete canvas {canvasList}, {e}", { canvasList, e }); } @@ -204,7 +204,7 @@ const VideoStreamManager = ({ needsInteractivity, selectedCanvas, hideInfos }: V // Check if h264 is supported await VideoDecoder.isConfigSupported({ codec: "avc1.4D401E" }).then((r) => { supportH264 = r.supported!; - logger.info("[SCRCPY] Supports h264", supportH264); + logger.info("[SCRCPY] Supports h264", {supportH264}); }) // Check if h265 is supported From 138183cf165046dca85be14dd0d6d8d4f7fe2ac9 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Mon, 23 Feb 2026 14:15:57 +0700 Subject: [PATCH 34/59] Simplified the subprojectList: now use an effect hook to update the subProjectList when the simulationList changes to ensure that subprojectList now has meaningful content. removed the complex ternary operator and replaced it by one line --- .../SelectorSimulations/SelectorSimulations.tsx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/components/SelectorSimulations/SelectorSimulations.tsx b/src/components/SelectorSimulations/SelectorSimulations.tsx index d6b4023..85f3edc 100644 --- a/src/components/SelectorSimulations/SelectorSimulations.tsx +++ b/src/components/SelectorSimulations/SelectorSimulations.tsx @@ -17,6 +17,12 @@ const SelectorSimulations = () => { const [connectionStatus, setConnectionStatus] = useState('Waiting for connection ...'); const { t } = useTranslation(); const [subProjectsList, setSubProjectsList] = useState(simulationList); + useEffect(() => { + if (simulationList && simulationList.length > 0) { + setSubProjectsList(simulationList); + } + }, [simulationList]); + const [selectedSplashscreen, setSelectedSplashscreen] = useState("") const [path, setPath] = useState([]); @@ -210,11 +216,8 @@ const SelectorSimulations = () => {
- {subProjectsList ? subProjectsList.length > 0 ? + - : - : null - }
From c976ed968a21d4ac2a1bbbd73390d2f8da639dae Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Mon, 23 Feb 2026 14:41:52 +0700 Subject: [PATCH 35/59] converted style attribute containing css to tailwind utilities to reduce code scattering --- src/components/SelectorSimulations/SimulationList.tsx | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/components/SelectorSimulations/SimulationList.tsx b/src/components/SelectorSimulations/SimulationList.tsx index e952549..0ac82ed 100644 --- a/src/components/SelectorSimulations/SimulationList.tsx +++ b/src/components/SelectorSimulations/SimulationList.tsx @@ -24,17 +24,12 @@ const SimulationList = ({ list, handleSimulation, gama, className }: SimulationL {list.map((simulation, index) => (
Date: Mon, 23 Feb 2026 14:44:30 +0700 Subject: [PATCH 36/59] Uniformized spacing --- .../SelectorSimulations.tsx | 33 ++----------------- 1 file changed, 2 insertions(+), 31 deletions(-) diff --git a/src/components/SelectorSimulations/SelectorSimulations.tsx b/src/components/SelectorSimulations/SelectorSimulations.tsx index 85f3edc..b8d2327 100644 --- a/src/components/SelectorSimulations/SelectorSimulations.tsx +++ b/src/components/SelectorSimulations/SelectorSimulations.tsx @@ -25,10 +25,7 @@ const SelectorSimulations = () => { const [selectedSplashscreen, setSelectedSplashscreen] = useState("") const [path, setPath] = useState([]); - const navigate = useNavigate(); - - const logger = getLogger(["components", "VideoStreamManager"]); useEffect(() => { @@ -47,7 +44,6 @@ const SelectorSimulations = () => { } }, [simulationList]); - useEffect(() => { // the path here is a list of nested indexes, which are used to see which catalogs the user clicked if (path.length > 0) { @@ -71,6 +67,7 @@ const SelectorSimulations = () => { const addToPath = (index: number) => { setPath([...path, index]) } + /**Removes the last index used to travel the subproject folder * */ @@ -83,12 +80,12 @@ const SelectorSimulations = () => { setSubProjectsList([]) } } + /** * handles either navigating through the list of projects or launch a simulation * @param index index of the current selected element */ const handleSimulation = (index: number) => { - if (!isWsConnected || ws === null) { logger.warn("Websocket not connected \n isWsConnected:{isWsConnected}\n ws:{ws}", { isWsConnected, ws }) return; @@ -108,7 +105,6 @@ const SelectorSimulations = () => { logger.debug("handlesimulation, simulationList[index].type == catalog, {expName}", { expName: subProjectsList[index].name }); } catch (e) { logger.error("no subprojects, ERROR:{e}", { e }); } - } else if (simulationList[index].type == "json_settings") { ws.send(JSON.stringify({ type: 'send_simulation', simulation: simulationList[index] })); setTimeout(() => { @@ -118,7 +114,6 @@ const SelectorSimulations = () => { logger.debug(simulationList[index].model_file_path) addToPath(index) } - // --------------------------------------------------------- sub project selected } else if (subProjectsList.length > 0) { if (subProjectsList[index].type == "json_settings") { @@ -126,7 +121,6 @@ const SelectorSimulations = () => { setTimeout(() => { navigate('/simulationManager'); }, 100); - } else { if (subProjectsList[index].type == "catalog") { try { @@ -150,7 +144,6 @@ const SelectorSimulations = () => { logger.info('Trying to connect to GAMA, connection status: {gamaStatus}', { gamaStatus: gama.connected }); }, 3000); } - return () => { clearInterval(interval); }; @@ -174,16 +167,10 @@ const SelectorSimulations = () => { {loading ? (
-

{t('loading')}

- -
) : ( - - // disable
- { //the content of this bracket is the back button subProjectsList ? subProjectsList.length > 0 && path.length >= 1 ? @@ -212,41 +199,25 @@ const SelectorSimulations = () => { {/* //TODO add translation for Thai language */}
- - -
- - -
-
- - {/* Display the status, ask for the user to connect to Gama if still not */}
{gama.connected ? '' : connectionStatus} -
-
- - )} - -
); From d5a935f0c141d81cd01befe64207175b182fbfc0 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Mon, 23 Feb 2026 15:29:51 +0700 Subject: [PATCH 37/59] Removed unused commented code --- .../SimulationManager/SimulationManager.tsx | 32 +------------------ 1 file changed, 1 insertion(+), 31 deletions(-) diff --git a/src/components/SimulationManager/SimulationManager.tsx b/src/components/SimulationManager/SimulationManager.tsx index 39b1d18..0ae54f2 100644 --- a/src/components/SimulationManager/SimulationManager.tsx +++ b/src/components/SimulationManager/SimulationManager.tsx @@ -29,18 +29,6 @@ const SimulationManager = () => { const { t } = useTranslation(); const [startButtonClicked, setStartButtonClicked] = useState(false); - //? these variables exist as a setup for the functionnality of changing the display type - //? to accomodate for the display of the gama simulation directly in the application. - //? This uses a websocket to be able to click on a button on the tablet, - //? and have the change reflected on the tv screen instantly without reloading the page - - // const [screenModeDisplay, setScreenModeDisplay] = useState("gama_screen"); - // const channel = new BroadcastChannel('simulation-to-stream'); //using the broadcast api to update display type in the streamPlayerScreen - // const updateDisplay = (screenModeDisplay: string) => { - // setScreenModeDisplay(screenModeDisplay); - // channel.postMessage({ screenModeDisplay }); - // }; - const startClicked = () => { setStartButtonClicked(true); handlePlayPause(); @@ -247,27 +235,9 @@ const SimulationManager = () => { className='flex w-15 h-full' > - {/* //! unused code that uses websockets to change the type of display to one with space to accomodate for the gama map of the game, but is not implemented for now - //! having these buttons that do nothing may confuse the user */}
- {/*
-
*/} - ) : null} + )}
From ee0b1e68d084de2a7c2f2905e582cb847671a717 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Mon, 23 Feb 2026 15:30:27 +0700 Subject: [PATCH 38/59] changed to using and operator instead of the ternary operator --- src/components/SimulationManager/SimulationManager.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/SimulationManager/SimulationManager.tsx b/src/components/SimulationManager/SimulationManager.tsx index 0ae54f2..4952ea0 100644 --- a/src/components/SimulationManager/SimulationManager.tsx +++ b/src/components/SimulationManager/SimulationManager.tsx @@ -209,7 +209,7 @@ const SimulationManager = () => { ) ) : gama.experiment_state === 'PAUSED' || gama.experiment_state === 'LAUNCHING' || - gama.experiment_state === 'RUNNING' ? ( + gama.experiment_state === 'RUNNING' && ( <>
From 997896f2ced82d1b9472fd7bd85b5ad8a3d4c661 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Mon, 23 Feb 2026 16:03:54 +0700 Subject: [PATCH 45/59] added template in the string in the info logs --- .../WebSocketManager/VideoStreamManager.tsx | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/components/WebSocketManager/VideoStreamManager.tsx b/src/components/WebSocketManager/VideoStreamManager.tsx index 27dd7e3..b8573bd 100644 --- a/src/components/WebSocketManager/VideoStreamManager.tsx +++ b/src/components/WebSocketManager/VideoStreamManager.tsx @@ -44,13 +44,13 @@ const deserializeData = (serializedData: string) => { function createVideoFrameRenderer(): VideoFrameRenderer { if (WebGLVideoFrameRenderer.isSupported) { - logger.debug("[SCRCPY] Using WebGLVideoFrameRenderer"); + logger.debug("[SCRCPY] Using WebGLVideoFrameRenderer"); return new WebGLVideoFrameRenderer(); } else { - logger.warn("[SCRCPY] WebGL isn't supported... "); + logger.warn("[SCRCPY] WebGL isn't supported... "); } - logger.debug("[SCRCPY] Using fallback BitmapVideoFrameRenderer"); + logger.debug("[SCRCPY] Using fallback BitmapVideoFrameRenderer"); return new BitmapVideoFrameRenderer(); } @@ -109,11 +109,11 @@ const VideoStreamManager = ({ needsInteractivity, selectedCanvas, hideInfos }: V // Wait for HTML to be available if (document.getElementById(deviceId)) { - logger.info(" Restarting new ReadableStream for {deviceId}", { deviceId }) + logger.info(" Restarting new ReadableStream for {deviceId}", { deviceId }) document.getElementById(deviceId)?.querySelector('canvas')?.remove(); } else { // Create new stream - logger.info(" Create new ReadableStream for {deviceId}", { deviceId }) + logger.info(" Create new ReadableStream for {deviceId}", { deviceId }) } // Prepare video stream ======================= @@ -132,10 +132,10 @@ const VideoStreamManager = ({ needsInteractivity, selectedCanvas, hideInfos }: V setCanvasList({ [deviceId]: canvas }) } else if (!selectedCanvas) { if (deviceId in canvasList) { - logger.warn("tried adding an already existing canvas to the list, cancelling") + logger.warn("tried adding an already existing canvas to the list, cancelling") } else { setCanvasList(prevCanvasList => ({ ...prevCanvasList, [deviceId]: canvas })); - logger.info("added canvas") + logger.info("added canvas") } } @@ -145,7 +145,7 @@ const VideoStreamManager = ({ needsInteractivity, selectedCanvas, hideInfos }: V codec: "hev1.1.60.L153.B0.0.0.0.0.0", }).then((supported) => { if (useH265 && !supported.supported) { - logger.warn("[Scrcpy-VideoStreamManager] Should decode h265, but not compatible, waiting for new stream to start..."); + logger.warn("[Scrcpy-VideoStreamManager] Should decode h265, but not compatible, waiting for new stream to start..."); readableControllers.delete(deviceId); return; } @@ -155,7 +155,7 @@ const VideoStreamManager = ({ needsInteractivity, selectedCanvas, hideInfos }: V codec: useH265 ? ScrcpyVideoCodecId.H265 : ScrcpyVideoCodecId.H264, renderer: renderer, }); - //TODO fix ce log logger.log("[Scrcpy-VideoStreamManager] Decoder for {useH265} ? \"h265\" : \"h264\", loaded", { useH265: "h265" }); + //TODO fix ce log logger.log("[Scrcpy-VideoStreamManager] Decoder for {useH265} ? \"h265\" : \"h264\", loaded", { useH265: "h265" }); // Create new ReadableStream used for scrcpy decoding const stream = new ReadableStream({ start(controller) { @@ -170,7 +170,7 @@ const VideoStreamManager = ({ needsInteractivity, selectedCanvas, hideInfos }: V isDecoderHasConfig.delete(deviceId); try { canvasList[deviceId].remove(); - logger.info("deleted canvas", {deviceId}) + logger.info("deleted canvas", { deviceId }) } catch (e) { logger.error("Can't delete canvas {canvasList}, {e}", { canvasList, e }); } @@ -187,7 +187,7 @@ const VideoStreamManager = ({ needsInteractivity, selectedCanvas, hideInfos }: V logger.error("[Scrcpy] Error piping to decoder writable stream"); } }).catch((error) => { - logger.error('Error checking H.264 configuration support: {error}', { error }); + logger.error('Error checking H.264 configuration support: {error}', { error }); }); } @@ -204,19 +204,19 @@ const VideoStreamManager = ({ needsInteractivity, selectedCanvas, hideInfos }: V // Check if h264 is supported await VideoDecoder.isConfigSupported({ codec: "avc1.4D401E" }).then((r) => { supportH264 = r.supported!; - logger.info("[SCRCPY] Supports h264", {supportH264}); + logger.info("[SCRCPY] Supports h264: {supportsH264}", { supportH264 }); }) // Check if h265 is supported await VideoDecoder.isConfigSupported({ codec: "hev1.1.60.L153.B0.0.0.0.0.0" }).then((r) => { supportH265 = r.supported!; - logger.info("[SCRCPY] Supports h265 {supportH265}", { supportH265 }); + logger.info("[SCRCPY] Supports h265 {supportH265}", { supportH265 }); }) // Check if AV1 is supported await VideoDecoder.isConfigSupported({ codec: "av01.0.05M.08" }).then((r) => { supportAv1 = r.supported!; - logger.info("[SCRCPY] Supports AV1 {supportAv1}", { supportAv1 }); + logger.info("[SCRCPY] Supports AV1 {supportAv1}", { supportAv1 }); }) socket.send(JSON.stringify({ @@ -261,14 +261,14 @@ const VideoStreamManager = ({ needsInteractivity, selectedCanvas, hideInfos }: V isDecoderHasConfig.set(deserializedData!.streamId, true); } } else { - logger.warn("[Scrcpy] Error piping to decoder writable stream, closing controller..."); + logger.warn("[Scrcpy] Error piping to decoder writable stream, closing controller..."); controller!.close(); } } }; socket.onclose = () => { - logger.info("[Scrcpy-VideoStreamManager] Closing readable"); + logger.info("[Scrcpy-VideoStreamManager] Closing readable"); }; }, []); From 18f836bec95fd6d192b7faf622c7584f75394bd0 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Mon, 23 Feb 2026 16:20:26 +0700 Subject: [PATCH 46/59] removed package, package-lock and eslint.config from the .gitignore --- .gitignore | 3 - eslint.config.js | 11 + package-lock.json | 1677 ++++++++++++++++++++++++++++++++++++++++++++- package.json | 3 +- 4 files changed, 1669 insertions(+), 25 deletions(-) create mode 100644 eslint.config.js diff --git a/.gitignore b/.gitignore index 41a53b8..da02af2 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,3 @@ learning-packages/ACROSS-Lab QuangBinhProject MIAT-version Gama/ bin dist dist-api -package-lock.json -package.json -eslint.config.ts diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..1f1612f --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,11 @@ +import js from "@eslint/js"; +import globals from "globals"; +import tseslint from "typescript-eslint"; +import pluginReact from "eslint-plugin-react"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + { files: ["**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"], plugins: { js }, extends: ["js/recommended"], languageOptions: { globals: {...globals.browser, ...globals.node} } }, + tseslint.configs.recommended, + pluginReact.configs.flat.recommended, +]); diff --git a/package-lock.json b/package-lock.json index 2904f6b..bab70fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,6 +31,7 @@ "concurrently": "^8.2.2", "cors": "^2.8.5", "dotenv": "^16.4.5", + "eslint-config": "^0.3.0", "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-react-refresh": "^0.4.7", "evilscan": "^1.9.1", @@ -56,7 +57,7 @@ "simple.webplatform": "dist-api/index.cjs" }, "devDependencies": { - "@eslint/js": "^9.39.2", + "@eslint/js": "^9.39.3", "@eslint/json": "^1.0.0", "@types/express": "^5.0.6", "@yao-pkg/pkg": "^6.12.0", @@ -1133,9 +1134,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", + "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", "dev": true, "license": "MIT", "engines": { @@ -3042,6 +3043,15 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha512-vuBv+fm2s6cqUyey2A7qYcvsik+GMDJsw8BARP2sDE76cqmaZVarsvHf7Vx6VJ0Xk8gLl+u3MoAPf6gKzJefeA==", + "license": "MIT", + "peerDependencies": { + "ajv": ">=4.10.0" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -3071,6 +3081,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==", + "license": "MIT", + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -3095,6 +3117,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", @@ -3114,6 +3145,12 @@ "node": ">= 8" } }, + "node_modules/app-root-path": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-1.4.0.tgz", + "integrity": "sha512-rHo0+00Cq451AYsCP1jaDGlrI7FD6nhFs3CC9Tf6SFKiHud3Y3rj6dI/kXJfft8J6kVgWvJLmqQd5ta2+U8O4Q==", + "license": "MIT" + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -3143,6 +3180,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -3181,6 +3227,15 @@ "node": ">=8" } }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/array.prototype.findlast": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", @@ -3615,6 +3670,15 @@ "baseline-browser-mapping": "dist/cli.js" } }, + "node_modules/beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha512-3vqtKL1N45I5dV0RdssXZG7X6pCqQrWPNOlBPZPrd+QkE2HEhR57Z04m0KtpbsZH73j+a3F8UD1TQnn+ExTvIA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -3817,7 +3881,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", @@ -3861,6 +3924,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha512-UJiE1otjXPF5/x+T3zTnSFiTOEmJoGTD9HmBoxnCUwho61a2eSNn/VwtwuIBDAo2SEOv1AJ7ARI5gCmohFLu/g==", + "license": "MIT", + "dependencies": { + "callsites": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caller-path/node_modules/callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha512-Zv4Dns9IbXXmPkgRRUjAaJQgfN4xX5p6+RQFhWUqscdvvK2xK/ZL8b3IXIJsj+4sD+f24NwnWy2BY8AJ82JB0A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -4009,6 +4093,13 @@ "node": ">=8" } }, + "node_modules/circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "deprecated": "CircularJSON is in maintenance only, flatted is its successor.", + "license": "MIT" + }, "node_modules/cjs-module-lexer": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", @@ -4016,6 +4107,24 @@ "dev": true, "license": "MIT" }, + "node_modules/cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha512-25tABq090YNKkF6JH7lcwO0zFJTRke4Jcq9iX2nr/Sz0Cjjv4gckmwlW6Ty/aoyFd6z3ysR2hMGC2GFugmBo6A==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "license": "ISC" + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -4030,17 +4139,40 @@ "node": ">=12" } }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA==", + "license": "MIT" + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" } }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/collect-v8-coverage": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", @@ -4066,6 +4198,15 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -4081,6 +4222,21 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, "node_modules/concurrently": { "version": "8.2.2", "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", @@ -4154,7 +4310,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, "license": "MIT" }, "node_modules/cors": { @@ -4224,6 +4379,19 @@ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", @@ -4294,6 +4462,15 @@ "url": "https://opencollective.com/date-fns" } }, + "node_modules/dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha512-GODcnWq3YGoTnygPfi02ygEiRxqUxpJwuRHjdhJYuxpcZmDq4rjBiXYmbCCzStxo176ixfLT6i4NPwQooRySnw==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -4372,7 +4549,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -4843,6 +5019,89 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "node_modules/es6-set": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.6.tgz", + "integrity": "sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw==", + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "es6-iterator": "~2.0.3", + "es6-symbol": "^3.1.3", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "license": "ISC", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, "node_modules/esbuild": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", @@ -4911,6 +5170,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha512-75IUQsusDdalQEW/G/2esa87J7raqdJF+Ca0/Xm5C3Q58Nr4yVYjZGp/P1+2xiEVgXRrA39dpRb8LcshajbqDQ==", + "license": "BSD-2-Clause", + "dependencies": { + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/escope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, "node_modules/eslint": { "version": "8.57.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", @@ -4967,6 +5250,366 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-config": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-config/-/eslint-config-0.3.0.tgz", + "integrity": "sha512-lw/UhmFbaec30wmmUTgLA1aW3y960cTv5oh6T9n2x2M2Ri0mr4mPn2DwpS3unua7uKQJWEGPNKUmdJPzLb4G3g==", + "license": "ISC", + "dependencies": { + "app-root-path": "^1.0.0", + "eslint": "^2.1.0", + "gulp-util": "^3.0.7", + "object-assign": "^4.0.1" + } + }, + "node_modules/eslint-config/node_modules/acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/eslint-config/node_modules/acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha512-AU7pnZkguthwBjKgCg6998ByQNIMjbuDQZ8bb78QAFZwPfmKia8AIzgY/gWgqCjnht8JLdXmB4YxA0KaV60ncQ==", + "license": "MIT", + "dependencies": { + "acorn": "^3.0.4" + } + }, + "node_modules/eslint-config/node_modules/acorn-jsx/node_modules/acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/eslint-config/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-config/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/eslint-config/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-config/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-config/node_modules/doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha512-lsGyRuYr4/PIB0txi+Fy2xOMI2dGaTguCaotzFGkVZuKR5usKfcRWIFKNM3QNrU7hh/+w2bwTW+ZeXPK5l8uVg==", + "dependencies": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-config/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-config/node_modules/eslint": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-2.13.1.tgz", + "integrity": "sha512-29PFGeV6lLQrPaPHeCkjfgLRQPFflDiicoNZOw+c/JkaQ0Am55yUICdYZbmCiM+DSef+q7oCercimHvjNI0GAw==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "license": "MIT", + "dependencies": { + "chalk": "^1.1.3", + "concat-stream": "^1.4.6", + "debug": "^2.1.1", + "doctrine": "^1.2.2", + "es6-map": "^0.1.3", + "escope": "^3.6.0", + "espree": "^3.1.6", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^1.1.1", + "glob": "^7.0.3", + "globals": "^9.2.0", + "ignore": "^3.1.2", + "imurmurhash": "^0.1.4", + "inquirer": "^0.12.0", + "is-my-json-valid": "^2.10.0", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.5.1", + "json-stable-stringify": "^1.0.0", + "levn": "^0.3.0", + "lodash": "^4.0.0", + "mkdirp": "^0.5.0", + "optionator": "^0.8.1", + "path-is-absolute": "^1.0.0", + "path-is-inside": "^1.0.1", + "pluralize": "^1.2.1", + "progress": "^1.1.8", + "require-uncached": "^1.0.2", + "shelljs": "^0.6.0", + "strip-json-comments": "~1.0.1", + "table": "^3.7.8", + "text-table": "~0.2.0", + "user-home": "^2.0.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/eslint-config/node_modules/espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-config/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-config/node_modules/file-entry-cache": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz", + "integrity": "sha512-JyVk7P0Hvw6uEAwH4Y0j+rZMvaMWvLBYRmRGAF2S6jKTycf0mMDcC7d21Y2KyrKJk3XI8YghSsk5KmRdbvg0VQ==", + "license": "MIT", + "dependencies": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-config/node_modules/flat-cache": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "license": "MIT", + "dependencies": { + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-config/node_modules/globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-config/node_modules/ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "license": "MIT" + }, + "node_modules/eslint-config/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/eslint-config/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint-config/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint-config/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/eslint-config/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint-config/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint-config/node_modules/progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha512-UdA8mJ4weIkUBO224tIarHzuHs4HuYiJvsuGT7j/SPQiUJVjYvNDBIPa0hAorduOfjGohB/qHWRa/lrrWX/mXw==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/eslint-config/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/eslint-config/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-config/node_modules/strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==", + "license": "MIT", + "bin": { + "strip-json-comments": "cli.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-config/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-config/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/eslint-plugin-react": { "version": "7.37.5", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", @@ -5160,6 +5803,21 @@ "node": "*" } }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -5181,7 +5839,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -5242,6 +5899,16 @@ "node": ">= 0.6" } }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "node_modules/events-universal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", @@ -5299,6 +5966,15 @@ "node": ">= 0.8.0" } }, + "node_modules/exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha512-MsG3prOVw1WtLXAZbM3KiYtooKR1LvxHh3VHsVtIy0uiUu8usxgB/94DP2HxtD/661lLdB6yzQ09lGJSQr6nkg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -5387,6 +6063,30 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "license": "ISC", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "license": "MIT", + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5468,6 +6168,28 @@ "pend": "~1.2.0" } }, + "node_modules/figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -5701,6 +6423,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "license": "MIT", + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha512-TuOwZWgJ2VAMEGJvAyPWvpqxSANF0LDpmyHauMjFYzaACvn+QTT/AZomvPCzVBV7yDN3OmwHQ5OvHaeLKre3JQ==", + "license": "MIT", + "dependencies": { + "is-property": "^1.0.0" + } + }, "node_modules/generator-function": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", @@ -5971,6 +6711,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "license": "MIT", + "dependencies": { + "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -5987,7 +6739,6 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, "license": "ISC" }, "node_modules/graphemer": { @@ -5996,6 +6747,142 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "license": "MIT" }, + "node_modules/gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha512-q5oWPc12lwSFS9h/4VIjG+1NuNDlJ48ywV2JKItY4Ycc/n1fXJeYPVQsfu5ZrhQi7FGSDBalwUCLar/GyHXKGw==", + "deprecated": "gulp-util is deprecated - replace it, following the guidelines at https://medium.com/gulpjs/gulp-util-ca3b1f9f9ac5", + "license": "MIT", + "dependencies": { + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl": "^0.5.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/gulp-util/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-util/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-util/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-util/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/gulp-util/node_modules/object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-util/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-util/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw==", + "license": "MIT", + "dependencies": { + "glogg": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -6018,11 +6905,22 @@ "node": ">=8" } }, + "node_modules/has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha512-+F4GzLjwHNNDEAJW2DC1xXfEoPkRDmUdJ7CBYw4MpqtDwOnqdImJl7GWlpqx+Wko6//J8uKTnIe4wZSv7yCqmw==", + "license": "MIT", + "dependencies": { + "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -6291,6 +7189,126 @@ "dev": true, "license": "ISC" }, + "node_modules/inquirer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha512-bOetEz5+/WpgaW4D1NYOk1aD+JCqRjqu/FwRFgnIfiP7FC/zinsrfyO1vlS3nyH/R7S0IH3BIHBu4DBIDSqiGQ==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^1.1.0", + "ansi-regex": "^2.0.0", + "chalk": "^1.0.0", + "cli-cursor": "^1.0.1", + "cli-width": "^2.0.0", + "figures": "^1.3.5", + "lodash": "^4.3.0", + "readline2": "^1.0.1", + "run-async": "^0.1.0", + "rx-lite": "^3.1.2", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" + } + }, + "node_modules/inquirer/node_modules/ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha512-wiXutNjDUlNEDWHcYH3jtZUhd3c4/VojassD8zHdHCY13xbZy2XbW+NKQwA0tWGBVzDA9qEzYwfoSsWmviidhw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inquirer/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inquirer/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/inquirer/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "license": "MIT", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inquirer/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "license": "MIT", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inquirer/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -6594,6 +7612,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-my-ip-valid": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.1.tgz", + "integrity": "sha512-jxc8cBcOWbNK2i2aTkCZP6i7wkHF1bqKFrwEHuN5Jtg5BSaZHUZQ/JTOJwoV41YvHnOaRyWWh72T/KvfNz9DJg==", + "license": "MIT" + }, + "node_modules/is-my-json-valid": { + "version": "2.20.6", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.6.tgz", + "integrity": "sha512-1JQwulVNjx8UqkPE/bqDaxtH4PXCe/2VRh/y3p99heOV87HG4Id5/VfDswd+YiAfHcRTfDlWgISycnHuhZq1aw==", + "license": "MIT", + "dependencies": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^5.0.0", + "xtend": "^4.0.0" + } + }, "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", @@ -6642,6 +7679,12 @@ "node": ">=8" } }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", + "license": "MIT" + }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -6661,6 +7704,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "license": "ISC" + }, "node_modules/is-set": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", @@ -6804,7 +7853,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, "license": "MIT" }, "node_modules/isexe": { @@ -7558,6 +8606,25 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "license": "MIT" }, + "node_modules/json-stable-stringify": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz", + "integrity": "sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -7589,6 +8656,24 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "license": "Public Domain", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -7695,12 +8780,132 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, + "node_modules/lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==", + "license": "MIT" + }, + "node_modules/lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha512-mTzAr1aNAv/i7W43vOR/uD/aJ4ngbtsRaCubp2BfZhlGU/eORUjg/7F6X0orNMdv33JOrdgGybtvMN/po3EWrA==", + "license": "MIT" + }, + "node_modules/lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha512-H94wl5P13uEqlCg7OcNNhMQ8KvWSIyqXzOPusRgHC9DK3o54P6P3xtbXlVbRABG4q5gSmp7EDdJ0MSuW9HX6Mg==", + "license": "MIT" + }, + "node_modules/lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", + "license": "MIT" + }, + "node_modules/lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==", + "license": "MIT" + }, + "node_modules/lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha512-Sjlavm5y+FUVIF3vF3B75GyXrzsfYV8Dlv3L4mEpuB9leg8N6yf/7rU06iLPx9fY0Mv3khVp9p7Dx0mGV6V5OQ==", + "license": "MIT" + }, + "node_modules/lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha512-OrPwdDc65iJiBeUe5n/LIjd7Viy99bKwDdk7Z5ljfZg0uFRFlfQaCy9tZ4YMAag9WAZmlVpe1iZrkIMMSMHD3w==", + "license": "MIT" + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", + "license": "MIT" + }, + "node_modules/lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ==", + "license": "MIT" + }, + "node_modules/lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha512-n1PZMXgaaDWZDSvuNZ/8XOcYO2hOKDqZel5adtR30VKQAtoWs/5AOeFA0vPV8moiPzlqe7F4cP2tzpFewQyelQ==", + "license": "MIT", + "dependencies": { + "lodash._root": "^3.0.0" + } + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "license": "MIT" + }, + "node_modules/lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", + "license": "MIT" + }, + "node_modules/lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", + "license": "MIT", + "dependencies": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "license": "MIT" }, + "node_modules/lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==", + "license": "MIT" + }, + "node_modules/lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha512-0B4Y53I0OgHUJkt+7RmlDFWKjVAI/YUpWNiL9GQz5ORDr4ttgfQGo+phBWKFLJbBdtOwgMuUkdOHOnPg45jKmQ==", + "deprecated": "This package is deprecated. Use https://socket.dev/npm/package/eta instead.", + "license": "MIT", + "dependencies": { + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha512-TcrlEr31tDYnWkHFWDCV3dHYroKEXpJZ2YJYvJdhN+y4AkWMDZ5I4I8XDtUKqSAyG81N7w+I1mFEJtcED+tGqQ==", + "license": "MIT", + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -7913,6 +9118,18 @@ "node": ">= 18" } }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -7926,6 +9143,48 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha512-7ZxrUybYv9NonoXgwoOqtStIu18D1c3eFZj27hqgf5kBrBF8Q+tE8V0MW8dKM5QLkQPh1JhhbKgHLY9kifov4Q==", + "license": "MIT", + "dependencies": { + "duplexer2": "0.0.2" + } + }, + "node_modules/multipipe/node_modules/duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==", + "license": "BSD", + "dependencies": { + "readable-stream": "~1.1.9" + } + }, + "node_modules/multipipe/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "node_modules/multipipe/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/multipipe/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "license": "MIT" + }, "node_modules/multistream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", @@ -7966,6 +9225,12 @@ "node": ">= 6" } }, + "node_modules/mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha512-EbrziT4s8cWPmzr47eYVW3wimS4HsvlnV5ri1xw1aR6JQo/OrJX5rkl32K/QQHdxeabJETtfeaROGhd8W7uBgg==", + "license": "ISC" + }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -8017,6 +9282,12 @@ "node": ">= 0.6" } }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "license": "ISC" + }, "node_modules/node-abi": { "version": "3.87.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.87.0.tgz", @@ -8086,6 +9357,15 @@ "node": ">=8" } }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -8120,7 +9400,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8255,6 +9534,15 @@ "node": ">= 0.8.0" } }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/own-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", @@ -8354,6 +9642,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -8381,6 +9678,12 @@ "node": ">=0.10.0" } }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "license": "(WTFPL OR MIT)" + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -8522,6 +9825,12 @@ "node": ">=8" } }, + "node_modules/pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha512-TH+BeeL6Ct98C7as35JbZLf8lgsRzlNJb5gklRIGHKaPkGl1esOKBc5ALUMd+q08Sr6tiEKM+Icbsxg5vuhMKQ==", + "license": "MIT" + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -8776,7 +10085,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, "license": "MIT" }, "node_modules/progress": { @@ -9101,7 +10409,6 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", @@ -9117,14 +10424,12 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, "license": "MIT" }, "node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, "license": "MIT" }, "node_modules/readdirp": { @@ -9139,6 +10444,29 @@ "node": ">=8.10.0" } }, + "node_modules/readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha512-8/td4MmwUB6PkZUbV25uKz7dfrmjYWxsW8DVfibWdlHRk/l/DfHKn4pU+dfcoGLFgWOdyGCzINRQD7jn+Bv+/g==", + "license": "MIT", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "mute-stream": "0.0.5" + } + }, + "node_modules/readline2/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "license": "MIT", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/redux": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", @@ -9198,6 +10526,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha512-AFBWBy9EVRTa/LhEcG8QDP3FvpwZqmvN2QFDuJswFeaVhWnZMp8q3E6Zd90SR04PlIwfGdyVjNyLPyen/ek5CQ==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -9207,6 +10543,28 @@ "node": ">=0.10.0" } }, + "node_modules/require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha512-Xct+41K3twrbBHdxAgMoOS+cNcoqIjfM2/VxBF4LL2hVph7YsF8VSKyQ3BDFZwEVbok9yeDl2le/qo0S77WG2w==", + "license": "MIT", + "dependencies": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-uncached/node_modules/resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha512-kT10v4dhrlLNcnO084hEjvXCI1wUG9qZLoz2RogxqDQQYy7IxjI/iMUkOtQTNEh6rzHxvdQWHsJyel1pKOVCxg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/reselect": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", @@ -9284,6 +10642,28 @@ "node": ">=10" } }, + "node_modules/restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha512-reSjH4HuiFlxlaBaFCiS6O76ZGG2ygKoSlCsipKdaZuKSPx/+bt9mULkn4l0asVzbEfQQmXRg6Wp6gv6m0wElw==", + "license": "MIT", + "dependencies": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha512-GZ+g4jayMqzCRMgB2sol7GiCLjKfS1PINkjmx8spcKce1LiVqcbQreXwqs2YAFXC6R03VIG28ZS31t8M866v6A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -9354,6 +10734,15 @@ "fsevents": "~2.3.2" } }, + "node_modules/run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha512-qOX+w+IxFgpUpJfkv2oGN0+ExPs68F4sZHfaRRx4dDexAQkG83atugKVEylyT5ARees3HBbfmuvnjbrd8j9Wjw==", + "license": "MIT", + "dependencies": { + "once": "^1.3.0" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -9377,6 +10766,11 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha512-1I1+G2gteLB8Tkt8YI1sJvSIfa0lWuRtC8GjvtyPBcLSF5jBCCJJqKrpER5JU5r6Bhe+i9/pK3VMuUcXu0kdwQ==" + }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -9546,7 +10940,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -9630,6 +11023,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/shelljs": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz", + "integrity": "sha512-B1vvzXQlJ77SURr3SIUQ/afh+LwecDKAVKE1wqkBlr2PCHoZDaF6MFD+YX1u9ddQjR4z2CKx1tdqvS2Xfs5h1A==", + "license": "BSD-3-Clause", + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -9772,6 +11177,15 @@ "node": ">=8" } }, + "node_modules/slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/socket.io": { "version": "4.8.3", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.3.tgz", @@ -9877,6 +11291,15 @@ "source-map": "^0.6.0" } }, + "node_modules/sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/spawn-command": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", @@ -9886,7 +11309,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, "license": "BSD-3-Clause" }, "node_modules/stack-utils": { @@ -9961,7 +11383,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" @@ -9971,7 +11392,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, "license": "MIT" }, "node_modules/string-length": { @@ -10193,6 +11613,137 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha512-RZuzIOtzFbprLCE0AXhkI0Xi42ZJLZhCC+qkwuMLf/Vjz3maWpA8gz1qMdbmNoI9cOROT2Am/DxeRyXenrL11g==", + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^4.7.0", + "ajv-keywords": "^1.0.0", + "chalk": "^1.1.1", + "lodash": "^4.0.0", + "slice-ansi": "0.0.4", + "string-width": "^2.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha512-I/bSHSNEcFFqXLf91nchoNB9D1Kie3QKcWdchYUaoIg1+1bdWDkdfdlvdIOJbi9U8xR0y+MWc5D+won9v95WlQ==", + "license": "MIT", + "dependencies": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "node_modules/table/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/table/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/table/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/table/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/table/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "license": "MIT", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/string-width/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/table/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/tailwindcss": { "version": "3.4.19", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", @@ -10431,6 +11982,31 @@ "node": ">=0.8" } }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "license": "MIT" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", @@ -10582,6 +12158,12 @@ "node": "*" } }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "license": "ISC" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -10707,6 +12289,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "license": "MIT" + }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -11067,6 +12655,18 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ==", + "license": "MIT", + "dependencies": { + "os-homedir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -11111,6 +12711,20 @@ "node": ">= 0.8" } }, + "node_modules/vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha512-P5zdf3WB9uzr7IFoVQ2wZTmUwHL8cMZWJGzLBNCHNZ3NB6HTMsYABtt7z8tAGIINLXyAob9B9a1yzVGMFOYKEA==", + "license": "MIT", + "dependencies": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + }, + "engines": { + "node": ">= 0.9" + } + }, "node_modules/vite": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", @@ -11387,6 +13001,18 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, + "node_modules/write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha512-CJ17OoULEKXpA5pef3qLj5AxTJ6mSt7g84he2WIskKwqFO4T97d5V7Tadl0DYDk7qyUOQD5WlUlOMChaYrhxeA==", + "license": "MIT", + "dependencies": { + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", @@ -11430,6 +13056,15 @@ "node": ">=0.4.0" } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index 5cc8388..e8015e1 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "concurrently": "^8.2.2", "cors": "^2.8.5", "dotenv": "^16.4.5", + "eslint-config": "^0.3.0", "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-react-refresh": "^0.4.7", "evilscan": "^1.9.1", @@ -72,7 +73,7 @@ "ws": "^8.18.0" }, "devDependencies": { - "@eslint/js": "^9.39.2", + "@eslint/js": "^9.39.3", "@eslint/json": "^1.0.0", "@types/express": "^5.0.6", "@yao-pkg/pkg": "^6.12.0", From 9953431980c85f87019844d74f3b42c45142223c Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Mon, 23 Feb 2026 16:22:37 +0700 Subject: [PATCH 47/59] removed commented useless code and empty space at the top of the component declaration --- .../SimulationManager/SimulationManagerPlayer.tsx | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/components/SimulationManager/SimulationManagerPlayer.tsx b/src/components/SimulationManager/SimulationManagerPlayer.tsx index 7c96230..a58a9e9 100644 --- a/src/components/SimulationManager/SimulationManagerPlayer.tsx +++ b/src/components/SimulationManager/SimulationManagerPlayer.tsx @@ -17,7 +17,7 @@ interface PlayerProps { const SimulationManagerPlayer = ({ Playerkey, selectedPlayer, className, playerId }: PlayerProps) => { const { t } = useTranslation(); - const { ws } = useWebSocket(); // `removePlayer` is now available + const { ws } = useWebSocket(); const [showPopUpManageHeadset, setshowPopUpManageHeadset] = useState(false); @@ -30,7 +30,6 @@ const SimulationManagerPlayer = ({ Playerkey, selectedPlayer, className, playerI if (ws !== null) { logger.info("ID headset: {id}",{id}); ws.send(JSON.stringify({ "type": "remove_player_headset", id })); - // removePlayer(id); // already did in WebSocketManagers toggleShowPopUpManageHeadset(); } else { logger.error("Websocket not connected") @@ -46,12 +45,7 @@ const SimulationManagerPlayer = ({ Playerkey, selectedPlayer, className, playerI return ( <> - - {showPopUpManageHeadset ? - - -
e.stopPropagation()} > {/*this prevent event bubbling, so that clicking the child div does not close the popup window*/} From 180b7e490c7a0fda0860db07b9334ae758ce40eb Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Tue, 24 Feb 2026 09:59:16 +0700 Subject: [PATCH 48/59] removed Simulation interface from SelectorSimulation, and replaced it by the MODEL and CATALOG defined in constants. --- src/components/SelectorSimulations/SelectorSimulations.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/SelectorSimulations/SelectorSimulations.tsx b/src/components/SelectorSimulations/SelectorSimulations.tsx index 4eb1fca..8af8162 100644 --- a/src/components/SelectorSimulations/SelectorSimulations.tsx +++ b/src/components/SelectorSimulations/SelectorSimulations.tsx @@ -9,14 +9,14 @@ import Button from '../Button/Button'; import SimulationList from './SimulationList'; import arrow_back from "/src/svg_logos/arrow_back.svg"; import { getLogger } from '@logtape/logtape'; -import { Simulation } from '../../api/core/Constants'; +import { VU_CATALOG_SETTING_JSON, VU_MODEL_SETTING_JSON } from '../../api/core/Constants'; import visibility from '/src/svg_logos/visibility.svg'; const SelectorSimulations = () => { const { ws, isWsConnected, gama, simulationList } = useWebSocket(); const [loading, setLoading] = useState(true); const [connectionStatus, setConnectionStatus] = useState('Waiting for connection ...'); const { t } = useTranslation(); - const [subProjectsList, setSubProjectsList] = useState(simulationList); + const [subProjectsList, setSubProjectsList] = useState<(VU_CATALOG_SETTING_JSON | VU_MODEL_SETTING_JSON)[]>(simulationList); useEffect(() => { if (simulationList && simulationList.length > 0) { setSubProjectsList(simulationList); From ccbe08f6deb753287492639df935a559e7c51771 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Tue, 24 Feb 2026 10:03:35 +0700 Subject: [PATCH 49/59] since we now use properly defined types, we can check the type of the catalog instead of testing the length of the attribute "entries", which is much cleaner --- src/components/SelectorSimulations/SelectorSimulations.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/SelectorSimulations/SelectorSimulations.tsx b/src/components/SelectorSimulations/SelectorSimulations.tsx index 8af8162..f5107b2 100644 --- a/src/components/SelectorSimulations/SelectorSimulations.tsx +++ b/src/components/SelectorSimulations/SelectorSimulations.tsx @@ -50,7 +50,7 @@ const SelectorSimulations = () => { let list = simulationList for (const index of path) { logger.debug("index in the use effect: {index}", { index }) - if (list[index].entries.length > 0) { + if (list[index].type === "catalog") { list = list[index].entries } else { list = [list[index]] From 9969041206c606724b5c5ad7c57b075afbd6859a Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Tue, 24 Feb 2026 10:05:38 +0700 Subject: [PATCH 50/59] defined a constant "catalog_item" in the scope of the if to tell ts that the subprojectList[index] is always a VU_CATALOG_SETTING_JSON, and removed unecessary if statement, as we only use the subProjectsList for clarity now --- .../SelectorSimulations.tsx | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/components/SelectorSimulations/SelectorSimulations.tsx b/src/components/SelectorSimulations/SelectorSimulations.tsx index f5107b2..8abd1d6 100644 --- a/src/components/SelectorSimulations/SelectorSimulations.tsx +++ b/src/components/SelectorSimulations/SelectorSimulations.tsx @@ -92,14 +92,16 @@ const SelectorSimulations = () => { logger.warn("Websocket not connected \n isWsConnected:{isWsConnected}\n ws:{ws}", { isWsConnected, ws }) return; } - if (subProjectsList.length <= 0) { //no subproject is selected, we either enter a folder or load a simulation - if (simulationList[index].type == "catalog") { //? we additionaly check if the simulation is a catalog, not necessary but allows for adding extra types - logger.debug("catalog detected, subprojectList:{subprojectList}", { subProjectList: JSON.stringify(simulationList[index].entries) }); - try { - setSubProjectsList(simulationList[index].entries); - addToPath(index) - if ('splashscreen' in simulationList[index]) { - setSelectedSplashscreen(simulationList[index].splashscreen); + + if (subProjectsList[index].type === "catalog") { //? we additionaly check if the simulation is a catalog, not necessary but allows for adding extra types + const catalog_item = subProjectsList[index]; + //we define a constant to tell typescript that the type of subProjectsList[index] cannot change and is a VU_CATALOG_SETTING_JSON, meaning that entries is defined + logger.debug("catalog detected, subprojectList:{subprojectList}", { subProjectList: JSON.stringify(catalog_item.entries) }); + try { + setSubProjectsList(catalog_item.entries); + addToPath(index) + if (simulationList[index].splashscreen !== undefined) { + setSelectedSplashscreen(simulationList[index].splashscreen); } else { //@ts-expect-error simulationList[index] type is defined as "never" for some reason, but is a Simulation, so this property access is valid logger.warn("No splashscreen could be found for simulation {simulation}", { simulation: simulationList[index].experimentName }) //TODO finir le logger warn From 3405b49bc5144de3cf41f8db2bbcf3c011a915e5 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Tue, 24 Feb 2026 10:09:21 +0700 Subject: [PATCH 51/59] removed weird conditionnal check that was used to see if an item contained a set of subprojects, but this hceck is no longer necessary. Reworded the log ( couldn't separate this into 2 different commits) --- .../SelectorSimulations.tsx | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/components/SelectorSimulations/SelectorSimulations.tsx b/src/components/SelectorSimulations/SelectorSimulations.tsx index 8abd1d6..7a259b3 100644 --- a/src/components/SelectorSimulations/SelectorSimulations.tsx +++ b/src/components/SelectorSimulations/SelectorSimulations.tsx @@ -103,21 +103,19 @@ const SelectorSimulations = () => { if (simulationList[index].splashscreen !== undefined) { setSelectedSplashscreen(simulationList[index].splashscreen); - } else { //@ts-expect-error simulationList[index] type is defined as "never" for some reason, but is a Simulation, so this property access is valid - logger.warn("No splashscreen could be found for simulation {simulation}", { simulation: simulationList[index].experimentName }) //TODO finir le logger warn - } - logger.debug("handlesimulation, simulationList[index].type == catalog, {expName}", { expName: subProjectsList[index].name }); + } else { + logger.warn("No splashscreen could be found for simulation {simulation}", { simulation: catalog_item.name }) } - catch (e) { logger.error("no subprojects, ERROR:{e}", { e }); } - } else if (simulationList[index].type == "json_settings") { - ws.send(JSON.stringify({ type: 'send_simulation', simulation: simulationList[index] })); - setTimeout(() => { - navigate('/simulationManager'); - }, 100); - } else if (Array.isArray(simulationList[index])) { - logger.debug(simulationList[index].model_file_path) - addToPath(index) + logger.debug("called handle simulation, selected item is a catalog of name:{expName}", { expName: subProjectsList[index].name }); } + catch (e) { logger.error("no subprojects, ERROR:{e}", { e }); } + + } else if (simulationList[index].type == "json_settings") { + ws.send(JSON.stringify({ type: 'send_simulation', simulation: simulationList[index] })); + setTimeout(() => { + navigate('/simulationManager'); + }, 100); + // --------------------------------------------------------- sub project selected } else if (subProjectsList.length > 0) { if (subProjectsList[index].type == "json_settings") { From dd01c9f9d9d9e6f5661fdbee1ac539ba086e470c Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Tue, 24 Feb 2026 10:10:47 +0700 Subject: [PATCH 52/59] removed unecessary check, as subprojectlist is always initialized as simulationList on component mounting. --- src/components/SelectorSimulations/SelectorSimulations.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/SelectorSimulations/SelectorSimulations.tsx b/src/components/SelectorSimulations/SelectorSimulations.tsx index 7a259b3..df36a5a 100644 --- a/src/components/SelectorSimulations/SelectorSimulations.tsx +++ b/src/components/SelectorSimulations/SelectorSimulations.tsx @@ -117,7 +117,8 @@ const SelectorSimulations = () => { }, 100); // --------------------------------------------------------- sub project selected - } else if (subProjectsList.length > 0) { + + } if (subProjectsList[index].type == "json_settings") { ws.send(JSON.stringify({ type: 'send_simulation', simulation: subProjectsList[index] })); setTimeout(() => { @@ -134,7 +135,7 @@ const SelectorSimulations = () => { } } } - } + }; // Loop which tries to connect to Gama From b8c351a2a9188c3197d46582f90314152a225d56 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Tue, 24 Feb 2026 10:14:36 +0700 Subject: [PATCH 53/59] removed the interface Simulation, implemented the interface VU_CATALOG_SETTING_JSON, VU_MODEL_SETTING_JSON instead. selected simulation is always of type MODEL, while simulationList can contain both. --- src/components/WebSocketManager/WebSocketManager.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/WebSocketManager/WebSocketManager.tsx b/src/components/WebSocketManager/WebSocketManager.tsx index 3ae3833..b62d5e1 100644 --- a/src/components/WebSocketManager/WebSocketManager.tsx +++ b/src/components/WebSocketManager/WebSocketManager.tsx @@ -1,5 +1,5 @@ import { createContext, useContext, useEffect, useState, ReactNode } from 'react'; -import { Simulation } from "../../api/core/Constants.ts" +import { VU_CATALOG_SETTING_JSON, VU_MODEL_SETTING_JSON } from '../../api/core/Constants'; import { getLogger } from '@logtape/logtape'; @@ -28,8 +28,8 @@ interface WebSocketContextType { content_error: string; }; playerList: PlayerList; - simulationList: Simulation[]; - selectedSimulation: Simulation | null; + simulationList: (VU_CATALOG_SETTING_JSON | VU_MODEL_SETTING_JSON)[]; + selectedSimulation: (VU_MODEL_SETTING_JSON) | null; removePlayer: (id: string) => void; // Define removePlayer here @@ -54,8 +54,8 @@ const WebSocketManager = ({ children }: WebSocketManagerProps) => { content_error: '', }); const [playerList, setPlayerList] = useState({}); - const [simulationList, setSimulationList] = useState([]); - const [selectedSimulation, setSelectedSimulation] = useState(null); + const [simulationList, setSimulationList] = useState<(VU_CATALOG_SETTING_JSON | VU_MODEL_SETTING_JSON)[]>([]); + const [selectedSimulation, setSelectedSimulation] = useState<(VU_MODEL_SETTING_JSON) | null>(null); // Function to remove a player from the playerList From c6ee96dd10e5e9cdbdb9ccf51069520f95fc7fbf Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Tue, 24 Feb 2026 10:15:18 +0700 Subject: [PATCH 54/59] changed the log to use the error message instead of directly dumping the error object. --- src/components/SelectorSimulations/SelectorSimulations.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/SelectorSimulations/SelectorSimulations.tsx b/src/components/SelectorSimulations/SelectorSimulations.tsx index df36a5a..cb97f8b 100644 --- a/src/components/SelectorSimulations/SelectorSimulations.tsx +++ b/src/components/SelectorSimulations/SelectorSimulations.tsx @@ -128,10 +128,10 @@ const SelectorSimulations = () => { if (subProjectsList[index].type == "catalog") { try { addToPath(index) - logger.debug("[SELECTOR SIMULATION] handlesimulation, simulationList[index].type == catalog, {name}", { name: subProjectsList[0].name }); + logger.debug("[SELECTOR SIMULATION] handlesimulation, simulationList[index].type == catalog, {name}", { name: subProjectsList[index].name }); } // in any case, we catch the error and log it if any catch (e) { - logger.error("no subprojects, ERROR: {e}", { e }); + logger.error("no subprojects, ERROR: {e}", { e : (e as Error).message }); } } } From d82be0187b6c856c62674cc220a6d5d323f7dde5 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Tue, 24 Feb 2026 10:15:28 +0700 Subject: [PATCH 55/59] removed Simulation from the constants file. --- src/api/core/Constants.ts | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/api/core/Constants.ts b/src/api/core/Constants.ts index 71b3068..96cccc2 100644 --- a/src/api/core/Constants.ts +++ b/src/api/core/Constants.ts @@ -38,22 +38,6 @@ export interface JsonPlayer { heartbeat?: number; } - -export interface Simulation { - experiment_name: string; - model_file_path: string; - name: string; - player_html_file: string; - player_web_interface: string; - splashscreen: string; - type: string; - type_model_file_path: string; - maximal_players: string, - minimal_players: string, - selected_monitoring: string - entries: Simulation[] -} - // Learning packages ============================================== /** From 4c4b79b1673d0e7ce8190ebbec37c7d9a45dfaa3 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Tue, 24 Feb 2026 10:16:09 +0700 Subject: [PATCH 56/59] removed Simulation and replaced it with VU_MODEL_SETTING_JSON | VU_CATALOG_SETTING_JSON --- src/components/SelectorSimulations/SimulationList.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/SelectorSimulations/SimulationList.tsx b/src/components/SelectorSimulations/SimulationList.tsx index 0ac82ed..1fd8135 100644 --- a/src/components/SelectorSimulations/SimulationList.tsx +++ b/src/components/SelectorSimulations/SimulationList.tsx @@ -1,8 +1,9 @@ import arrow_down from '../../svg_logos/arrow_drop_down.svg'; -import { Simulation } from '../../api/core/Constants'; +import { VU_MODEL_SETTING_JSON, VU_CATALOG_SETTING_JSON } from '../../api/core/Constants'; import { getLogger } from '@logtape/logtape'; +//TODOsim vérifier l'existence du besoin interface SimulationListProps { - list: Simulation[]; + list: (VU_MODEL_SETTING_JSON | VU_CATALOG_SETTING_JSON)[]; handleSimulation: (index: number) => void; gama: { connected: boolean; @@ -21,7 +22,7 @@ const SimulationList = ({ list, handleSimulation, gama, className }: SimulationL return (
- {list.map((simulation, index) => ( + {list.map((simulation : VU_MODEL_SETTING_JSON | VU_CATALOG_SETTING_JSON , index : number) => (
Date: Tue, 24 Feb 2026 10:21:40 +0700 Subject: [PATCH 57/59] removed useless header from the streaming page --- src/components/StreamPlayerScreen/StreamPlayerScreen.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/StreamPlayerScreen/StreamPlayerScreen.tsx b/src/components/StreamPlayerScreen/StreamPlayerScreen.tsx index 668f053..2497600 100644 --- a/src/components/StreamPlayerScreen/StreamPlayerScreen.tsx +++ b/src/components/StreamPlayerScreen/StreamPlayerScreen.tsx @@ -1,6 +1,5 @@ import { useRef } from "react"; import VideoStreamManager from "../WebSocketManager/VideoStreamManager"; -import Header from "../Header/Header"; const StreamPlayerScreen = () => { @@ -12,7 +11,6 @@ const StreamPlayerScreen = () => {
-
From 65d644e244c0758496d8bf6613cb93a44c3da608 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Thu, 26 Feb 2026 10:05:00 +0700 Subject: [PATCH 58/59] Fixed logger having an incorrect category attribute, and removed unecessary capsule. --- src/components/SelectorSimulations/SelectorSimulations.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/SelectorSimulations/SelectorSimulations.tsx b/src/components/SelectorSimulations/SelectorSimulations.tsx index cb97f8b..7801ad9 100644 --- a/src/components/SelectorSimulations/SelectorSimulations.tsx +++ b/src/components/SelectorSimulations/SelectorSimulations.tsx @@ -26,7 +26,7 @@ const SelectorSimulations = () => { const [selectedSplashscreen, setSelectedSplashscreen] = useState("") const [path, setPath] = useState([]); const navigate = useNavigate(); - const logger = getLogger(["components", "VideoStreamManager"]); + const logger = getLogger(["components", "SelectorSimulation"]); useEffect(() => { if (isWsConnected && ws !== null) { @@ -128,7 +128,7 @@ const SelectorSimulations = () => { if (subProjectsList[index].type == "catalog") { try { addToPath(index) - logger.debug("[SELECTOR SIMULATION] handlesimulation, simulationList[index].type == catalog, {name}", { name: subProjectsList[index].name }); + logger.debug("handlesimulation, simulationList[index].type == catalog, {name}", { name: subProjectsList[index].name }); } // in any case, we catch the error and log it if any catch (e) { logger.error("no subprojects, ERROR: {e}", { e : (e as Error).message }); From 0b54c61a8bf6b206784267deac3cf50513be3c86 Mon Sep 17 00:00:00 2001 From: GuillaumeLeroy Date: Fri, 27 Feb 2026 09:37:06 +0700 Subject: [PATCH 59/59] added comment explaining the eslint config file, removed deprecated .cjs file --- .eslintrc.cjs | 18 ------------------ eslint.config.js | 1 + 2 files changed, 1 insertion(+), 18 deletions(-) delete mode 100644 .eslintrc.cjs diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index d6c9537..0000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,18 +0,0 @@ -module.exports = { - root: true, - env: { browser: true, es2020: true }, - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:react-hooks/recommended', - ], - ignorePatterns: ['dist', '.eslintrc.cjs'], - parser: '@typescript-eslint/parser', - plugins: ['react-refresh'], - rules: { - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], - }, -} diff --git a/eslint.config.js b/eslint.config.js index 1f1612f..603e09d 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,3 +1,4 @@ +// new configuration file for eslint, the old .cjs was deprecated import js from "@eslint/js"; import globals from "globals"; import tseslint from "typescript-eslint";